Придумайте на двоих уникальное название дирекории и создавайте там проект с уникальным называнием.
Запишитесь в pairing.md, чтобы я не забыл кто есть кто. (В коммит припишите [skip ci]
, чтобы он не пытался запускать CI.)
Я 28 сентября явно прописал требование, чтобы оценки за ФП не отличались более, чем на 2 буквы. Пытаюсь балансировать команды. Если кто уже успел записаться (и я успел помержить) с каким попало напарником, ладно, пусть будет.
Выдается на двоих и сдается частями в виде PR в этот репо. Разумеется, там должно быть адекватное покрытие тестами, более-менее документация, использование линтера и нормальный функциональный код (на OCaml/Haskell).
Если вы не хотите ничего знать, то можно помечать PRы заклинанием "[D] ...", и CI не будет запускать линтер, а я буду проверить только тесты, без кода. На экзамене сможете рассчитывать максимум на D.
На всякий случай, скажу, что фичи не нужно реализовывать все сразу. Итеративная модель разработки подойдет лучше водопадной.
Задание можно разбивать на следующие части.
- Парсер+тайпчекер. (10 баллов)
- Автоматическое тестирование парсера стоит осуществлять в том числе QuickCheck-подобным способом.
- Трансляция в ANF представление (15 баллов)
- Если кто-то захочет сделать CPS представление --- не возражаю.
- Порождение кода для LLVM разумной версии (в том году это была 16я). (15 баллов)
- Код затем должен компилироваться в ELF и запускаться (QEMU). Интерпретировать LLVM биткод нельзя.
- Печатать в тестах биткод, чтобы его можно было проверить глазами на (не)адекватность.
- Порождение ассемблерного листинга для RISC-V 64. (25 баллов)
- Код должен затем компилироваться в ELF стандартным RISC-V тулчейном.
- Скомпилированные программы должны запускаться (что-то кроме QEMU --- запрещено).
- Аналогично печатать ассемблер в тестах
- Интегрировать в язык реализацию сборки мусора. (10 баллов)
- В идеале, одну и туже и для LLVM, и для RISC-V.
Итого: 10+15+15+25+10 + 20(за экзамен) даст вам примерно 100 баллов, которые пересчитаются в оценку стандартным для универа способом. N.B. За экзамен нужно получить хотябы 10 из 20, иначе на пересдачу.
- Целые числа, булевы значения и сравнения чисел и прочая арифметика
- Идентификаторы должны быть как в OCaml, запрещено резервировать какие-то имена, чтобы их порождать по ходу дела.
- Парсер должен работать шустро, а не парсить объявления факториала 10 секунд
- К идентификатором разрешено приписывать типы явно:
fun (x: int) -> ...
- В процессе построения ANF должно быть адекватным. Стоит его распечатывать обратно в исходный синтаксис, и проверять, что типы (не) разъехались.
- Рекурсивные функции на верхнем уровне (в компиляторе назвается structure_item).
- Разрешено ыпереопределять операторы как функции:
let (+) = ...
- First-class функции, в том числе с частичным примерением и взаимной рекурсией.
- Вызовы функций должны быть efficient: если 3-арная функция вызывается от трёх аргументов, то нельзя делать 3 частичных применения под одному аргументу.
- Взаимная рекурсия через
let rec ... and ...
. Делатьlet ... and ...
безrec
--- не надо
- Вложенные let-определения
- Не должно быть никакого ограничения сверху на количество аргументов у функций.
- В том году бойцы нагенерили большой switch на 100 арностей функций, а в случае >100 --- рантайм падал. так делать не надо
- Разрешено ыпереопределять операторы как функции:
- Сопоставление с образцом для кортежей и списков
- Полноценные алгебраические типы не обязательно
- Рантайм: печать чисел, примитивы частичного применения и сборки мусора.
- Должны обрабатываться ошибки в процессе компиляции: компилятор не должен крешиться.
- Что-нибудь ещё, что я забыл :)
В manytests
--- тесты. Стоит сделать символическую ссылку на них у себя, и тестировать на этом коде свой компилятор.
Когда буду находить особую ересь в решениях --- буду добавлять новые тесты.
Вот примерный порядок, его можно слегка варьировать. Рассчитываю, что вы перестанете делать слишком большие PR в середине и конце.
- AST (MiniML без структур данных: пар и списков)
- QuickCheck
- Компиляция в RISC-V факториала
- Компиляция в LLVM факториала
- ANF (нужен в первую очередь для LLVM)
- Избавление от вложенных функций (lambda lifter + closure conversion). Нужно для интересных примеров
- Сложные структуры данных (n-ки, списки) можно не делать (если не надо А), или оставить на потом
- Доделывание компилятора в RISC-V (тут уже появится содержательный рантайм)
- Доделывание компилятора в LLVM
- Сборка мусора для двух бекендов.
Выдаются на человека. В случае успеха он получает + 10 баллов, и напарник тоже. После напарник может взять какой-нибудь другой доклад.
Ориентировочно 45 минут + вопросы. Материалы (слайды) должны быть в техе с хорошей лицензией (шаблн в ветке talks), чтобы можно было на следующий год расширить и дополнить.
Темы:
- Зачем нужны E-graph в компиляторах и не только? Примеры оптимизаций, которые выразимы с ними.
- SSA book 7-9 главы Павлушкин
- SSA book 10-11 главы Шишин