Задание для реализации
Содержание
Общее описание задания
В этом семестре все задачи будут складываться в одно большое задание, объединённое общим смыслом. Это позволит вам изучить и прочувствовать плюсы и минусы функциональной парадигмы при реализации больших и сложных проектов.
Общей канвой будет реализация учебного языка программирования.
Дедлайны и оценивание
Задание будет состоять из двух этапов. На каждом этапе нужно будет реализовать некоторый набор фич, который есть в языке.
По каждой реализованной фиче нужно написать короткий отчёт (достаточно markdown в репозитории) с описанием функциональности, её реализации и взаимодействия с другими реализованными опциями, способом запуска и использования; в отчёте должны быть ваши мысли о том, чему вы научились в процессе реализации (см., например, отчёты GSoC). Конкретные фичи описаны для каждого языка в следующем разделе, там же - максимальный балл для каждой фичи.
На первом этапе реализуется минимальный набор фич (он указан). Минимальный набор оценён суммарно в 28-30 баллов. Если какие-то фичи не реализованы или реализованы некорректно, эта фича оценивается только частью баллов. Кроме того, к дедлайну первого этапа необходимо выбрать (не реализовать, а зафиксировать) набор дополнительных фич так, чтобы общая сумма не превосходила 50 баллов. Подробное описание дополнительных фич (а не только названия) будет дано после дедлайна первого этапа.
На втором этапе нужно реализовать выбранные дополнительные фичи (изменять и дополнять набор выбранных фич нельзя). В случае, если на первом этапе что-то было реализовано неверно, эти фичи можно доделывать, но максимальная оценка за доделанные фичи первого этапа не будет превосходить 75% исходной.
Оцениваться будет как ваша реализация, так и ваш отчёт о функциональности. Обнаруженный плагиат ведёт к немедленной дисквалификации без возможности повторной сдачи этой фичи. Использование искуственного интеллекта возможно при наличии естественного интеллекта, несущего ответственность за результаты работы. Предполагается, что сложность реализации фичи в целом коррелирует с максимальной оценкой за неё.
Сроки выполнения этапов:
- этап 1 (28-30 баллов)
- 16 ноября -
21 декабря28 декабря - этап 2 (22-20 баллов)
- 21 декабря - 1 февраля
Работу можно сдавать в любое время в течение указанного срока. Будет выделена специальная пара для этого.
Варианты и этапы задания
Для реализации предлагается выбрать один из двух языков программирования.
Репозиторий с описаниями обоих языков: https://github.com/gltronred/itis-fp-fall-2024
Язык Colon
Минималистичный Forth: https://github.com/gltronred/itis-fp-fall-2024/blob/trunk/colon/docs/lang.md
- Этап 1
Отчёты можно скомбинировать по частям «Основа», «Тестирование», «Комбинирование монад» и «Парсинг»
№ Часть Описание Баллы Примечание 1 Основа Тип для команд, результат выполнения и ошибки, стек результатов, арифметика, манипулирование стеком 5 2 Сравнения 1 3 Условный оператор, цикл DO I LOOP4 4 Ввод-вывод 3 5 Строки ." "2 6 Тестирование Тесты для примеров из lang; тесты других видов: рандомизированное, исчерпывающее и т.п. 3-5 3 балла + 1 балл за каждый дополнительный вид тестов, до 2 баллов за доп.тесты 7 Комбинирование монад Добавление новых слов в словарь, переменные 5 требуется использование соответствующих библиотек 8 Парсинг Парсинг текста программы, тесты в виде файлов с программами 3 требуется аппликативный/монадический парсинг 9 Парсинг комментариев 2 - Этап 2: дополнительные опции
- конкурентное программирование:
RX,G!(3) - цикл
BEGIN UNTIL(1) - работа с графикой:
GRAPHICS + LAST-KEY(4) - проверка комментариев про стек (3)
- массивы (2)
- пошаговая отладка, получение текущего стека, памяти, словаря и т.п. (3)
- компиляция (8)
- REPL с readline (5)
- LSP с хотя бы одной функцией (6)
- json + api на типах + htmx = веб-интерпретатор (6)
- multi-exit loops (4 если с парсингом)
- конструкция
case of endof endcase(3 если с парсингом) - арифметические операции над числами с плавающей запятой (2)
Итого: дополнительно 50
- конкурентное программирование:
Язык Paren
Минималистичный Lisp: https://github.com/gltronred/itis-fp-fall-2024/blob/trunk/paren/docs/lang.md
- Этап 1
Отчёты можно скомбинировать по частям «Основа», «Тестирование», «Комбинирование монад» и «Парсинг»
№ Часть Описание Баллы Примечание 1 Основа Атомы и cons, вычисление 5 2 Арифметика 1 3 Сравнения 1 4 Логика 1 5 Работа с cons-ячейками 1 6 quote 1 7 if 2 8 lambda 3 9 Тестирование Тесты для конструкций из lang; тесты других видов: рандомизированное, исчерпывающее и т.п. 3-5 3 балла + 1 балл за каждый дополнительный вид тестов, до 2 баллов за доп.тесты 10 Комбинирование монад Новые переменные 5 требуется использование соответствующих библиотек 11 Парсинг Парсинг текста программы, тесты в виде файлов с программами 3 требуется аппликативный/монадический парсинг 12 Сахар для списков 2 - Этап 2: дополнительные опции
- улучшенный парсер (1):
- символы из чего угодно, обернутые в
| - комментарии в
#| ... |# - экранирование в строках
- define для функций
- символы из чего угодно, обернутые в
- loop (1)
- let with deconstruction (1)
- макросы (1)
- работа с переменными (1)
- работа со строками (1)
c[ad]+r-like функции для доступа к ячейке по произвольному пути (1)#dдля создания и работы с циклическими структурами (2)- работа с исключениями (2)
- работа с продолжениями-continuation (2)
- работа со пользовательскими структурами (2)
- опциональная строгая система типов (3), проверяемая перед запуском (4)
- конкурентное программирование (3)
- компиляция в SECD-машину (8)
- repl с readline (5)
- lsp с хотя бы одной функцией (6)
- json + api на типах + htmx = веб-интерпретатор (6)
Итого: дополнительно 50
- улучшенный парсер (1):
Изменения к допсессии
Для набора баллов к дополнительной сессии можно выполнить те же задания. Однако, если вы не сдавали задание во время сессии, то вам нужно реализовывать язык Paren. Также меняется количество баллов за некоторые опции:
Первый этап:
- монады: 3 (-2)
- парсинг: 4 (+1)
- colon: условные операторы и циклы: 5 (+1)
- paren: сахар для списков: 3 (+1)
Второй этап:
- конкурентное программирование: 4 (+1)
- repl: 2 (-3)
- веб-интерпретатор: 3 (-3)
- colon: отладка: 2 (-1)
- colon: multi-exit loops: 2 (-2)
- colon: case of endof endcase: 2 (-1)
- colon: операции с числами с плавающей запятой: 1 (-1)