Летняя школа 2025 на матмехе
Бытует мнение, что любой программист мечтает написать написать свой язык программирования, свою игру, и свой фреймворк для создания интерфейсов. В этом проекте вы можете получить знания, чтобы закрыть первый гештальт.
Проект: учебный компилятор
Простой компилятор простого языка
может стать результатом работы летом. Планируем начать с простого компилятора рекурсивного факториала/фибоначчи для RISC-V, а потом насытить язык другими фичами. Разрабатывать можно примерно на чем угодно. Прошлогодние студенты ПИ массово взялись за изучение OCaml, потому что им его сдавать в осеннем семестре. Была ещё группа, которая писала на С++, но показать работающий компилятор у них не получилось (в отличие от предыдущей группы студентов).
На эту ЛШ уже заявлен подобный проект от Григорьева/Кубышкина, где планируется доработка компилятора (написанного на Haskell) языка, который компилируется в ПЛИС, а не RISC-V. Я не расстроюсь, если студенты захотят как-то совместить два проекта. Пускай те, кто хотят писать на Haskell, пишут на Haskell; любители OCaml — на OCaml; любители унылых языков — на унылых языках. Те, кому интересн RISC-V будут порождать код и запускать под QEMU; если ПЛИС — так тому и быть.
Мне скучно делать ещё один Паскаль….
Созданием компиляторов люди занимаются много лет, и сразу делать что-то современное — сложно. Поэтому тема формулируется в первую очередь как образовательная, а не промышленно применимая уже завтра. Светлой целью (с) я вижу студентов, которые защищают изменения в компилятор OCaml как ВКР. Чтобы дорасти до такого топового уровня можно…
- Доделывать игрушечный компилятор ruKaml до настоящего OCaml, в том числе, чтобы можно было грабить корованы. Созданием альтернативных компиляторов известных языков занимался много кто (вот для Си и Haskell), для OCaml пока не вполне есть.
- Научить ruKaml компилироваться в Interaction Nets (де факто заменять фронт компилятора Lamagraph с Haskell на OCaml).
- Скрещивать OCaml и Rust (раз, два и статья).
- Добавлять топовые оптимизации (статья 2023).
- Делать синтаксический анализ с помощью SIMD.
- Ускорять OCaml под RISC-V (например, интринсиками в качестве учебной практики).
- Прикручивать к OCaml порождение кода с помощью LLVM (так, чтобы это было эффективнее, чем без LLVM, sic!).
Технологии
Во время школы вы познакомитесь со стандартными инструментами GNU/Linux: ассемблер и (кросс)компилятор gcc
, отладчик gdb
, эмулятор qemu
.
Рекомендуется использование GNU/Linux, виндузятникам придется возиться с WSL2
самостоятельно.
В принципе, написать простой компилятор можно на чем угодно.
Связываться с C++
не хочу, потому что хочется сконцентрироваться на создании работающего компилятора, и не танцевать на граблях из сегфолтов.
Если в языке будут алгебраические типы данных (OCaml, другие функциональные или Rust), то будет легче.
Зачем оно студентам?
Очень полезно иметь представление о том, как работает компилятор, которым вы компилируете свои программы. К тому же мы — кафедра системного программирования, а не строительства сайтов. После летней школы, темы компиляторов можно развивать в 100500 учебных практик.
Пожелания к кандидатам
- Любить сидеть в терминале GNU/Linux (на худой конец, в WSL).
- Основы представления данных: байт, бит, машинное слово, представление целых чисел, в перспрективе представление чисел с плавающей точкой.
- Представлять как компилируются программы на голом Си (понятия рантайма, объектного файла, линковки, умение из исполняемого файла получить его листинг ассемблера).
- Быть готовым не бояться ассемблера. Например, можно полистать начало этой книжки.