Бытует мнение, что любой программист мечтает написать написать свой язык программирования, свою игру, и свой фреймворк для создания интерфейсов. В этом проекте вы можете получить знания, чтобы закрыть первый гештальт.

Простой компилятор императивного языка

должен стать результатом работы летом. В простой язык будут входить

  • переменные, ветвления, циклы;
  • если успеем — функции;
  • если успеем — массивы как единственная структура данных.

Планируется создать простой компилятор “от печки” из следующих шагов:

  • Синтаксический анализ (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).
  • Основы представления данных: байт, бит, машинное слово, представление целых чисел, в перспрективе представление чисел с плавающей точкой.
  • Представлять как компилируются программы на голом Си (понятия рантайма, объектного файла, линковки, умение из исполняемого файла получить его листинг ассемблера).
  • Быть готовым не бояться ассемблера. Например, можно полистать начало этой книжки.