Летняя школа на матмехе 2024
Бытует мнение, что любой программист мечтает написать написать свой язык программирования, свою игру, и свой фреймворк для создания интерфейсов. В этом проекте вы можете получить знания, чтобы закрыть первый гештальт.
Простой компилятор императивного языка
должен стать результатом работы летом. В простой язык будут входить
- переменные, ветвления, циклы;
- если успеем — функции;
- если успеем — массивы как единственная структура данных.
Планируется создать простой компилятор “от печки” из следующих шагов:
-
Синтаксический анализ (i.e. парсер) вручную рекурсивным спуском. Никаких грамматик в форме БНФ или генераторов парсеров для простого компилятора не нужно. (Вполне возможно, что для настоящего тоже не нужно :) ) Мук выбора при дизайне синтаксиса не будет, у всех будет один, заранее заготовленный, синтаксис.
В принципе, можно эту часть сделать потом, или совсем пропустить, но тогда будет не очень удобно тестировать.
- Простое промежуточное представление.
Скорее всего настолько простое, что вырожденное. Самым содержательным должно оказаться преобразование сложные арифметический выражений в простые, например,
x:=a*b+c
вt1:=a*b; x:=t1*c
, но можно даже без этого. - Простые оптимизации, или совсем без них.
Например, упростить
x+y-x
вy
для беззнаковых чисел. - Максимально простое порождение инструкций (для базового RISC-V 64).
Да, придется потратить немного времени на привыкание к ассемблеру,
чтобы не путать вход и выход у команд. Но в общем и целом для простого компилятора многого знать не надо: инструкции языка можно транслировать примерно одинаково независимо от контекста. Функции проблем не вызовут, во-первых, потому что их нет, но даже если есть, то можно даже не знать соглашения о вызовах, которые вам рассказывали на первом курсе. Если RISC V выглядит страшно, то можно брать тот ассемблер, что у вас в ноутбуке: для простых компиляторов существенной разницы нет.
Мне скучно делать ещё один паскаль….
Созданием компиляторов люди занимаются много лет, и сразу делать что-то современное сложно. Поэтому тема формулируется в первую очередь как образовательная, а не проектная. Светлой целью (с) я вижу студентов, которые защищают изменения в компилятор OCaml как ВКР. Чтобы дорасти до такого топового уровня можно…
- Скрещивать OCaml и Rust (раз, два и статья).
- Добавлять топовые оптимизации (статья 2023).
- Ускорять OCaml под RISC V (например, интринсиками в качестве учебной практики).
- Делать свой OCaml, где можно грабить корованы. Созданием альтернативных компиляторов известных языков занимался много кто (вот для Си и Haskell), для OCaml пока не вполне есть.
- прикручивать к OCaml порождение кода с помощью LLVM (так, чтобы это было эффективнее, чем без LLVM, sic!).
Технологии
Во время школы вы познакомитесь со стандартными инструментами GNU/Linux: ассемблер и (кросс)компилятор gcc
, отладчик gdb
, эмулятор qemu
. Рекомендуется использование GNU/Linux, виндузятникам придется возиться с WSL2
самостоятельно.
В принципе, написать простой компилятор можно на чем угодно.
Связываться с C++
не хочу, потому что хочется сконцентрироваться на создании работающего компилятора, и не танцевать на граблях из сегфолтов. Если в языке будут алгебраические типы данных (OCaml, другие функциональные или Rust), то будет легче.
Зачем оно студентам?
Очень полезно иметь представление о том, как работает компилятор, которым вы компилируете свои программы. К тому же мы — кафедра системного программирования, а не строительства сайтов. После летней школы, темы компиляторов можно развивать в 100500 учебных практик.
Пожелания к кандидатам
- Любить сидеть в терминале GNU/Linux (на худой конец, в WSL).
- Основы представления данных: байт, бит, машинное слово, представление целых чисел, в перспрективе представление чисел с плавающей точкой.
- Представлять как компилируются программы на голом Си (понятия рантайма, объектного файла, линковки, умение из исполняемого файла получить его листинг ассемблера).
- Быть готовым не бояться ассемблера. Например, можно полистать начало этой книжки.