RealV
RealV

RealV

Функциональный язык программирования с C-подобным синтаксисом, написанный на F#

Команда

РИ
Разводов Иван
М8О-203БВ-24
Тимлид
  • Архитектура проекта и координация команды
  • Вся документация — структура, тексты, сайт
  • Расширение VS Code для файлов .rv
  • Участие в разработке интерпретатора
ДА
Денисов Андрей
М8О-203БВ-24
Разработчик
  • Разработка ядра интерпретатора
  • Написание примеров программ на RealV
  • Тестирование возможностей языка
ПА
Подгурский Александр
М8О-203БВ-24
Разработчик · QA
  • Разработка интерпретатора
  • Отладка и исправление ошибок
  • Проверка граничных случаев

Предыстория

История языка RealV начинается задолго до написания первых строк кода парсера. Наш коллектив сформировался во время совместной работы над сложным аэрокосмическим проектом ВАРКТ. Тот уникальный опыт совместных разработок, преодоления трудностей и бессонных ночей стал настоящим катализатором для команды.

Когда перед нами встала задача разработать собственный интерпретатор, мы решили создать нечто большее, чем стандартное учебное задание. RealV — это дань уважения тому самому проекту, который нас объединил. Уже в самом названии языка кроется отсылка к нашим истокам.

Язык элегантно сочетает строгую функциональную мощь «под капотом» с выразительным C-подобным синтаксисом — как символ того, как инженерные вызовы объединяют людей.


О проекте

RealV — это кастомный функциональный язык программирования, разработанный в рамках курсового проекта по дисциплине «Функциональное программирование». Интерпретатор полностью написан на F# и работает поверх платформы .NET 8.

Главная цель — спроектировать язык с лаконичным и выразительным синтаксисом, основанным на идеях лямбда-исчисления, но при этом обладающим привычным C-подобным синтаксисом блоков { ... }. Это делает RealV одновременно строгим с точки зрения функциональной семантики и удобным для повседневного написания кода.

Лексер и парсер написаны вручную (recursive descent) без сторонних комбинаторов — это даёт полный контроль над грамматикой и позволяет генерировать понятные сообщения об ошибках.


Ключевые решения

Три архитектурных выбора, которые определяют характер языка.

  • Читаемый синтаксис — первый приоритет

    RealV использует фигурные блоки { ... } и оператор = из C/JS. Функциональный подход не должен означать чуждый вид кода — поэтому синтаксис намеренно выглядит знакомо даже без знания теории ФП.

  • Интерпретатор без внешних зависимостей

    Лексер и парсер написаны вручную методом рекурсивного спуска — без FParsec и других комбинаторов. Это даёт полный контроль над грамматикой и позволяет генерировать понятные, точные сообщения об ошибках.

  • Функциональное ядро с допуском мутаций

    Под C-подобным синтаксисом — строгое лямбда-исчисление: замыкания, thunk'и, явная рекурсия через LetRec. При этом переменные можно переопределять через =, снижая порог вхождения.


Язык в действии

Программы RealV хранятся в файлах с расширением .rv. Несколько характерных примеров:

// Рекурсивный факториал
factorial(n) = {
  n == 0 ? return 1 : return n * factorial(n - 1)
}

// Замыкания и функции высшего порядка
makeAdder(x) = {
  return (y) => x + y
}
add5 = makeAdder(5)
add5(10) // 15

// Ленивые вычисления
lazyTask = delay(40 + 2)
val = force(lazyTask) // вычисляется один раз, затем кэшируется

Запуск: dotnet run --project src/RealV.Cli/RealV.Cli.fsproj -- скрипт.rv


Возможности языка

RealV — тьюринг-полный язык с богатым набором встроенных конструкций. Нажмите на любую возможность, чтобы увидеть пример кода.

📦

Переменные

Локальные определения и присваивания через единый оператор name = expr.

→ справочник
λ

Функции и лямбды

Функции первого класса, анонимные лямбды (x) => expr и полноценные замыкания.

→ пример кода
♻️

Рекурсия

Любая объявленная функция видит саму себя внутри своего тела без дополнительных ключевых слов.

→ пример кода
💤

Ленивые вычисления

Отложенное выполнение через delay с мемоизацией результата при force.

→ пример кода
🗂️

Массивы

Встроенные структуры данных: head, tail, append, slice и другие.

→ пример кода
🔀

Управляющие конструкции

Тернарный оператор cond ? a : b и диапазонные циклы start -> end -> (i) => body.

→ пример кода

Обработка ошибок

Оператор ! expr останавливает программу с пользовательским сообщением об ошибке.

→ пример кода
📂

Файловый I/O

Встроенные функции readFile, writeFile, appendFile для работы с файловой системой.

→ пример кода

Стек

F# Язык реализации интерпретатора
.NET 8 Платформа запуска и стандартная библиотека
VS Code Extension API Подсветка синтаксиса и запуск .rv-файлов
highlight.js Подсветка кода в документации