Как работают языки программирования под капотом? В чем разница между компилятором и интерпретатором? Что такое виртуальная машина и JIT-компилятор? А в чем разница между функциональным и императивным программированием?
Есть много вопросов, когда речь идет о реализации языка программирования!
Проблема с "курсами по компиляторам" в школе заключается в том, что такие курсы обычно представлены как "тяжелая ракетная наука", которая предназначена только для опытных инженеров.
Более того, классические книги по компиляторам начинаются с наименее значимой темы, такой как лексический анализ, и переходят к теоретическим аспектам формальных грамматик. И к моменту реализации первого модуля Токенизатора студенты просто теряют интерес к теме, не имея возможности начать реализацию собственного языка программирования. И все это распространяется на целый семестр работы с токенизаторами и грамматиками BNF без понимания фактической семантики языков программирования.
Я считаю, что мы должны быть способными создавать и понимать семантику языка программирования от начала до конца за 4-6 часов - с содержанием, направленным прямо на цель.
В курсе мы сосредотачиваемся на компиляции нашего языка в LLVM IR и создаем низкоуровневый язык программирования. Близко работая с инфраструктурой компилятора LLVM, вы поймете, как работает компиляция на более низком уровне и как работают языки производства, такие как C++, Rust и т. д.
Реализация языка программирования также повысит ваш практический уровень в других языках программирования и сделает его более профессиональным.
Предварительные требования
Для этого курса существуют три предварительных требования.
Курс "Язык программирования с LLVM" является естественным продолжением предыдущих курсов - "Построение интерпретатора с нуля" (также известного как "Основы интерпретации"), где мы также создавали полноценный язык программирования, но на более высоком, уровне AST, а также "Построение виртуальной машины". Если у вас уже есть понимание того, как работают языки программирования на этом уровне, то есть что такое eval, замыкание, цепочка областей видимости, окружения и другие конструкции, - вам нужно пройти курс по интерпретаторам как предварительное условие.
Кроме того, чтобы перейти на более низкий уровень (биткод/IR), где работают производственные языки, нам нужно иметь базовый опыт работы с C++. Однако этот класс не о C++, поэтому мы используем только очень базовые конструкции (и переносимые в другие языки).
Для кого этот курс ?
Этот курс предназначен для любого любознательного инженера, который хочет приобрести навыки создания сложных систем (и создание языка программирования - это сложная инженерная задача!) и получить передовые знания для создания таких систем.
Если вы интересуетесь именно LLVM, его инфраструктурой компилятора и способами создания собственного языка, то этот класс также для вас.
Что используется для реализации?
Поскольку низкоуровневые компиляторы ориентированы на производительность, они обычно реализуются на низкоуровневом языке, таком как C или C++. Это именно то, что мы используем, однако в основном базовые функции из C++, не отвлекаясь на особенности C++. Код должен быть легко преобразуемым и переносимым на любой другой язык, например, на Rust или даже более высокоуровневые языки, такие как Python. Использование C++ также облегчает реализацию JIT-компилятора в будущем.