Skip to content

flang 0.4.6 — бинарник разговаривает с человеком

Choose a tag to compare

@the-homeless-god the-homeless-god released this 07 Aug 13:47
· 35 commits to main since this release

Что изменилось для того, кто ставит язык

До этой версии 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