Практический курс построения компиляторов
Новосибирск, осень 2021
Описание
Хотите завершить свое вводное обучение компьютерным наукам и избавиться от ощущения неполноценности, что вы что-то пропустили, закрыть гештальт, освободиться от своего незнания и запрограммировать сложный проект, который потребует от вас применения всего, чему вас научил университет: теории графов, дискретной математики, алгоритмам, архитектуре компьютера, языку ассемблера, программированию и многому другому?
Проект, которым вы сможете гордиться и смело указывать в резюме — «Написал свой компилятор для языка Cool» и это не просто очередной учебный язык из арифметических выражений, но язык с классами, типами, методами, наследованием и полиморфизмом.
Более того, такие знания пригодятся вам при дальнейшем трудоустройстве в google v8 team, jetbrains compiler team, igalia compilers, apple compilers, huawei, samsung research, unipro и другие компании по всему миру.
О самом курсе
Курс является адаптацией и осовремененной версией классического курса по компиляторам — Compilers Alex Aiken, Stanford University.
На курсе мы разберем каждый байт компилятора и напишем свой компилятор для языка Cool — Classroom object oriented language. Для разработки будем использовать современный C++ и современные подходы к программированию с ревью, тестами и лучшими практиками из больший проектов с открытым исходным кодом.
Структура курса
- Введение в основные фазы трансляции/компиляции. Введение в язык Cool.
- Лексический анализ и лексическая спецификация языка.
- Синтаксический анализ и его спецификация.
- Семантический анализ. Типизация и введение в теорию типов.
- Генерация кода и операционная семантика.
- Введение в оптимизации.
- Кодогенерация и рантайм.
- Бонусная лекция: теория типов || современная магия верификации программ || архитектура эльбруса || виртуальные машины и оптимизации в них || web assembly.
Практические задачи
- Знакомство с языком Cool. Написать стековую машину.
- По лексической спецификации языка Cool написать его лексер.
- Составить грамматику и написать LL(k) парсер для Cool.
- Реализовать проход, выполняющий семантический и контекстно-зависимый анализ для Cool. Реализовать систему типов для Cool.
Написать кодогенератор из Cool в asm.
Бонусная задача 1. Выбрать и реализовать простую оптимизацию для Cool.
Бонусная задача 2. Написать генератор из Cool -> LLVM или Wasm (Binarien).
Критерии выставления оценки
Лабы с 1-5 полностью сданы - оценка 5.
Лабы с 1-4 полностью сданы - оценка 4.
Лабы с 1-3 полностью сданы - оценка 3.
Остальное оценивается как неудовлетворительно.
Дополнительные материалы
Хорошая вводная книга про компиляторы: Engineering: A Compiler 2nd Edition by Keith Cooper and Linda Torczon.
Курс для тех, кому интересны оптимизации: https://www.cs.cornell.edu/courses/cs6120/2020fa/self-guided/
Оригинальный курс: https://www.edx.org/course/compilers
Практический курс по построению интерпретаторов: https://craftinginterpreters.com/
Книга про типы в программировании: Types and Programming Languages by Benjamin C. Pierce
Преподаватели
Список лекций
Оригинальный курс:
https://www.edx.org/course/compilers
Coolc и остальные бинарные материалы по курсу:
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=Compilers&doc=docs/pa.html
http://openclassroom.stanford.edu/MainFolder/courses/Compilers/docs/src/pa.linux.i686.tar.gz
Материалы для чтения:
1) Engineering: A Compiler 2nd Edition by Keith Cooper, Linda Torczon
2) https://craftinginterpreters.com/contents.html
3) исходные коды: https://github.com/v8/v8, https://github.com/llvm/llvm-project/, https://github.com/WebAssembly/wasp
Разберем первую и наиболее скучную фазу компиляции как lexer.
Рассмотрим как определить синтаксическую спецификацию языка и как её релизовать на практике.
Разберем последнюю часть фронтенда компилятора - области видимости, типы и остальные.
Разберем выхлоп референсного компилятора.