Практический курс построения компиляторов

Новосибирск, осень 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++ и современные подходы к программированию с ревью, тестами и лучшими практиками из больший проектов с открытым исходным кодом.

Структура курса

  1. Введение в основные фазы трансляции/компиляции. Введение в язык Cool.
  2. Лексический анализ и лексическая спецификация языка.
  3. Синтаксический анализ и его спецификация.
  4. Семантический анализ. Типизация и введение в теорию типов.
  5. Генерация кода и операционная семантика.
  6. Введение в оптимизации.
  7. Кодогенерация и рантайм.
  8. Бонусная лекция: теория типов || современная магия верификации программ || архитектура эльбруса || виртуальные машины и оптимизации в них || web assembly.

Практические задачи

  1. Знакомство с языком Cool. Написать стековую машину.
  2. По лексической спецификации языка Cool написать его лексер.
  3. Составить грамматику и написать LL(k) парсер для Cool.
  4. Реализовать проход, выполняющий семантический и контекстно-зависимый анализ для Cool. Реализовать систему типов для Cool.
  5. Написать кодогенератор из Cool в asm.

  6. Бонусная задача 1. Выбрать и реализовать простую оптимизацию для Cool.

  7. Бонусная задача 2. Написать генератор из Cool -> LLVM или Wasm (Binarien).

Критерии выставления оценки

Лабы с 1-5 полностью сданы - оценка 5.
Лабы с 1-4 полностью сданы - оценка 4.
Лабы с 1-3 полностью сданы - оценка 3.

Остальное оценивается как неудовлетворительно.

Дополнительные материалы

  1. Хорошая вводная книга про компиляторы: Engineering: A Compiler 2nd Edition by Keith Cooper and Linda Torczon.

  2. Курс для тех, кому интересны оптимизации: https://www.cs.cornell.edu/courses/cs6120/2020fa/self-guided/

  3. Оригинальный курс: https://www.edx.org/course/compilers

  4. Практический курс по построению интерпретаторов: https://craftinginterpreters.com/

  5. Книга про типы в программировании: Types and Programming Languages by Benjamin C. Pierce

Преподаватели

Список лекций

2. Лексический анализ

Разберем первую и наиболее скучную фазу компиляции как lexer.

3. Синтаксический анализ, его спецификация и реализация

Рассмотрим как определить синтаксическую спецификацию языка и как её релизовать на практике.

4.0 Семантический анализ для COOL

Разберем последнюю часть фронтенда компилятора - области видимости, типы и остальные.

6.0 Codegen для COOL

Разберем выхлоп референсного компилятора.