Как языки программирования работают под капотом? В чем разница между компилятором и интерпретатором? Что такое виртуальная машина и JIT-компилятор? А как насчет разницы между функциональным и императивным программированием? Когда дело доходит до реализации языка программирования, возникает так много вопросов! Проблема с «классами компиляторов» в школе заключается в том, что такие классы обычно представляются как некая «ракетостроение», предназначенная только для продвинутых инженеров.
Более того, классические книги по компиляторам начинаются с наименее значимой темы, такой как лексический анализ, и переходят непосредственно к теоретическим аспектам формальных грамматик. А к моменту внедрения первого модуля Tokenizer студенты просто теряют интерес к теме, не имея возможности реально приступить к реализации самого языка программирования. И все это размазано на целый семестр возни с токенизаторами и БНФ-грамматиками, без понимания реальной семантики языков программирования.
Я считаю, что мы должны быть в состоянии построить и понять полную семантику языка программирования, от начала до конца, за 4-6 часов — с содержанием, идущим прямо к делу, показанным на сеансах живого кодирования как парное программирование и описанным в понятный способ.
В курсе мы уделяем особое внимание семантике времени выполнения и создаем виртуальную машину на основе стека для языка программирования, очень похожего на JavaScript или Python. Работая в тесном контакте с уровнем байт-кода, вы поймете, как интерпретация нижнего уровня работает сегодня в производственных виртуальных машинах.
Внедрение языка программирования также повысит ваш практический уровень владения другими языками программирования.
Есть два обязательных условия для этого курса
Курс «Создание виртуальной машины» является естественным продолжением предыдущего курса «Создание интерпретатора с нуля» (он же «Основы интерпретации»), где мы также создаем полноценный язык программирования, но на более высоком уровне AST. Если у вас еще нет понимания того, как языки программирования работают на этом уровне, то есть что такое eval, замыкание, цепочка областей видимости, среды и другие конструкции — вы должны взять курс интерпретаторов в качестве предварительного условия.
Кроме того, переходя на более низкий уровень (байт-код), на котором живут производственные виртуальные машины, нам необходимо иметь базовый опыт работы с C++. Однако этот класс не посвящен C++, поэтому мы используем только очень простые (и переносимые) конструкции на другие языки.
Для кого этот класс?
Этот класс предназначен для любого любознательного инженера, который хотел бы получить навыки построения сложных систем (а создание языка программирования — это продвинутая инженерная задача!), и получить применимые знания для построения таких систем.
Если вас конкретно интересуют компиляторы, интерпретаторы байт-кода, виртуальные машины и преобразование исходного кода, то этот курс также для вас.
Что используется для реализации?
Поскольку виртуальные машины более низкого уровня связаны с производительностью, они обычно реализуются на языке низкого уровня, таком как C или C++. Это именно то, что мы тоже используем, но в основном базовые возможности из C++, не отвлекаясь на специфику C++. Код должен быть легко конвертируемым и переносимым на любой другой язык, например на Rust или даже на языки более высокого уровня, такие как JavaScript, — используя типизированные массивы для имитации концепции памяти. Использование C++ также упрощает дальнейшую реализацию JIT-компилятора.
Примечание: мы хотим, чтобы наши студенты действительно следовали, понимали и реализовывали каждую деталь виртуальной машины, а не просто копировали и вставляли окончательное решение. Несмотря на то, что в видеолекциях представлен полный исходный код языка, репозиторий кода проекта содержит /* Реализовать здесь */ задания, которые предстоит решить студентам.
Основные особенности этих лекций:
Кратко и прямо по делу. Каждая лекция самодостаточна, лаконична и описывает информацию, непосредственно относящуюся к теме, не отвлекаясь на посторонние материалы или доклады.
Анимированная презентация в сочетании с редактируемыми заметками. Это облегчает понимание тем и показывает, как связаны структуры объектов. Статические слайды просто не работают для сложного контента.
Сессия кодирования в реальном времени с заданиями. Полный исходный код, начиная с нуля, и до самого конца представлен в видео-лекциях.
Automata Theory: inside a RegExp machine?
The is the only missing course.