Skip to content

Su9DenLY/flopper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Функциональное программирование: Пишем компилятор!

Цель этой лабораторной работы - придумать свой собственный функциональный язык программирования и разработать для него интерпретатор или компилятор.

Вы можете выполнить эту лабораторную работу в группе из 2 или 3 человек (или больше - но это требует одобрения преподавателя):

  • 2 человека - компилятор/интерпретатор + примеры программ + краткая документация в README.md (вы можете заменить этот файл своей собственной документацией)
  • 3 человека - компилятор/интерпретатор + примеры программ + более подробная документация на GitHub Pages
  • 3 и более человек - помимо вышеуказанного, может включать следующее:
    • IDE в браузере
    • Поддержка Jupyter Notebook
    • Трансляция в JavaScript, чтобы можно было выполнять программу в браузере
    • Расширения для VS Code

Задача

Ваша цель - изобрести и реализовать собственный функциональный язык программирования. Требования:

  • Он должен тесно следовать парадигме функционального программирования, на основе либо лямбда-исчисления, либо комбинаторной логики.
  • Он должен быть более или менее универсальным, т.е. реализовывать рекурсию. В идеале - полным по Тьюрингу.
  • Как минимум, язык должен позволять запрограммировать функцию для расчета факториала.

Имейте в виду, что написание парсеров - это утомительная задача, поэтому постарайтесь сделать синтаксис языка как можно проще.

Для вдохновения:

  • Изучите LISP - язык программирования с очень простым синтаксисом.
  • Комбинаторные парсеры и библиотеку fparsec, если вы хотите реализовать язык с более сложным синтаксисом.
  • Top-Down Parser на F#.
  • Интересный блог пост о парсинге на F#.
  • Парсинг с использованием инструментов FsLex и FsYacc (не рекомендуется).
  • Реализация Scheme в F# - вы можете ознакомиться с этим проектом для вдохновения, но не заимствуйте код оттуда!

Критерии оценки

  • Универсальность
  • Примеры программ (включая факториал, но не ограничиваясь им)
  • Оригинальность и красота синтаксиса
  • Документированность
  • Красота реализации

Предпочтительный язык реализации - F#.

В документации явно укажите, какие функции языка вы реализовали:

  • Именованные переменные (let)
  • Рекурсия
  • Ленивое вычисление
  • Функции
  • Замыкания
  • Библиотечные функции: ввод-вывод файлов
  • Списки / Последовательности
  • Библиотечные функции: списки/последовательности

Репозиторий

Вам необходимо работать над кодом в репозитории GitHub Classroom. После завершения задачи настоятельно рекомендуется форкнуть этот код в свои собственные аккаунты GitHub, чтобы он служил вашим портфолио.

Пошаговая работа

Поскольку проект довольно большой, его нужно делать поэтапно, загружая ваш код в GitHub на каждом этапе:

  • Этап 1: Разработка абстрактного синтаксического дерева и парсера для вашего языка + одна примерная программа.
  • Этап 2: Разработка интерпретатора/компилятора для вашего языка.
  • Этап 3: Написание примеров программ и документации.

Конечно, вы можете изменять язык на более поздних этапах, если посчитаете это нужным.

Авторы

Не забудьте упомянуть свою команду в файле README.md, указав также, кто что делал. Также файл README.md должен включать краткое руководство по вашему языку и некоторые короткие примеры кода.

Имя Роль в проекте
Ахметшин Булат Разработчик парсера
Теребаев Кирилл Разработчик интерпретатора, технический писатель
Шипилов Кирилл Разработчик интерпретатора, технический писатель

Если вы используете генеративный ИИ при написании этого кода (ChatGPT, GitHub Copilot и т.п.), вам необходимо упомянуть это здесь, и кратко описать подробности использования генеративного ИИ, а также как это повысило вашу продуктивность. Использование генеративного ИИ без явного упоминания является нарушением академической этики!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors