flang язык, в котором спецификация исполняется

Первая программа

Нужен только Node. Компилятор написан без единой внешней зависимости — это не принцип, а требование: язык, который не собирается без интернета, бесполезен ровно тогда, когда нужен.

git clone https://github.com/digitable-lol/flang.git
cd flang

Всё дальше работает сразу — ставить ничего не надо.

Проверить, что всё на месте

node flang/bin/flang.mjs version

Написать программу

Положите в файл privet.flang:

модуль «Привет»

тотальная функция «Удвоить»
  принимает н: число
  возвращает число
  обеспечивает результат равно (2 умножить на н)
  пример «Дважды два»
    дано н равно 2
    ожидается 4
  н плюс н

Здесь пять вещей, и каждая делает свою работу:

Проверить

node flang/bin/flang.mjs check privet.flang

Проверяются сразу: типы, завершаемость, примеры. Ответ приходит в JSON — это машинный вход, и он же читается глазами.

Проверить с доказательствами

node flang/bin/flang.mjs check privet.flang --proof --pretty

Здесь начинается то, ради чего язык существует. Ядро попробует доказать постусловие — то есть показать, что оно верно на всех входах, а не только на двойке из примера.

Ответ скажет одно из трёх, и разница между ними существенна:

Запустить

node flang/bin/flang.mjs run privet.flang --function «Удвоить» --args '{"н": 21}'

Напечатать в другой язык

node flang/bin/flang.mjs emit privet.flang --target c --out ./вывод

Целей семь: c, go, rust, python, java, csharp, elixir. Напечатанный код обязан выдавать те же значения и те же коды ошибок, что интерпретатор — это проверяется побайтово на всём корпусе, а не декларируется.

Попробовать вживую

node flang/bin/flang.mjs repl

Что дальше