flang 0.4.6 — бинарник разговаривает с человеком
Что изменилось для того, кто ставит язык
До этой версии brew install flang давал бинарник, который на --help молчал и отвечал нулём: он понимал только JSON на stdin. Теперь:
$ flang --version
flang 0.4.6
$ flang check проба.flang
модуль «Проба»: функций 1, из них с доказанным завершением 1; типов 0
проба.flang: проверено — разбор, типы, завершаемость; замечаний нет код: 0
$ flang check битая.flang
FLANG_TYPE в файле битая.flang, строка 5, столбец 3: функция «Плохая»
объявлена как число, а тело даёт строка код: 1
$ flang repl
объявлено: тотальная функция «Куб» — завершение доказано
343
$ man flang
Оболочка вычисляет не интерпретатором — его в бинарнике нет, — а печатью сессии в C, сборкой системным cc против libkompilyator_flang.a и запуском. Нет cc — оболочка не выключается, а работает проверяющей и говорит об этом при запуске.
Старый режим «JSON на входе, JSON на выходе» цел байт-в-байт: без аргументов или по явному --json.
Что изменилось в языке
- Самоприменение понимает полиморфизм и функции первого класса. Библиотека высшего порядка переехала из теста в
flang/stdlib/higher-order.flang(36 функций, все тотальные): одна свёртка, принимающая функцию-значение, даёт сумму, произведение и максимум вместо трёх функций с одинаковым телом. Монада перестала быть невыразимой. - Связывание переносит категорные объявления через границу файла. Нарушенный закон функтора в импортированном модуле раньше давал
valid: trueи код возврата 0. - Три новых модуля библиотеки: логика, словарь строка → строка, множество строк. Законы логики проверены исчерпывающим перебором: у признака два значения, поэтому «все 8 троек» — это все тройки, какие бывают.
- Конкурентность проверяется перебором тысячи семян, а не одним чередованием; модель измерена с названными условиями.
- Пример настоящей службы REST на 200 строк: разбор строки запроса, проверка полей, маршрутизация, коды ответов. Все функции тотальны, устойчивость проверена четырнадцатью нарочно кривыми запросами.
Известный дефект этой версии
Печать в Go ломается на программах с функциями-значениями. Проход дефункционализации даёт конструктору тега то же имя, что у самой функции, и Go отвергает файл: Chyotnoe redeclared in this block. Задет flang/stdlib/higher-order.flang — первая программа репозитория, которую этот проход переписывает.
Бинарника из этого архива дефект НЕ касается: C собирается -std=c99 -Wall -Wextra -Werror -pedantic без предупреждений, check и repl работают — проверено на архиве, распакованном и собранном с нуля.
Дефект прошёл мимо локальных прогонов потому, что тест печати в Go молча пропускается там, где Go не установлен. Чинится в 0.4.7 вместе с проверкой, которая ловит столкновение имён без тулчейна — на любой машине.
Проверено
Неподвижная точка самоприменения сошлась: семь напечатанных файлов C совпали побайтово у эталона, flang₁ и flang₂. Набор — 1638 тестов, 0 отказов на машине без тулчейнов Go, .NET и Elixir (53 пропуска).
Установка
brew install digitable-lol/tap/flang