flang компилятор доказывает, что программа не зациклится 0.7.29 GitHub

Журнал изменений flang

Релиз языка — это тег vX.Y.Z, а по нему архив формулы и публикация в npm. Строки под релизом — заголовки коммитов, вошедших в него: в этом репозитории заголовок пишется утверждением о том, что теперь правда, поэтому он и есть готовая запись журнала. Правки, от которых язык снаружи не меняется, — планы, спецификации, тесты, скрипты, — сосчитаны, но не перечислены.

Не выпущено

0.7.29 — 18 октября 2026

Готовые сборки и установка одной командой, законы категорий доказываются

Ещё 141 правка языка снаружи не меняют.

0.7.28 — 14 октября 2026

Примеры в законах проверяются, ошибки в категориях находятся при компиляции

Ещё 18 правок языка снаружи не меняют.

0.7.27 — 14 октября 2026

Печать партий 5 и 6: кольцо точного целого у двух сличителей, мера и постусловия в ядре, TLS вшит в двоичный, формулы с кванторами и LaTeX

Ещё 129 правок языка снаружи не меняют.

0.7.26 — 11 октября 2026

Ещё 112 правок языка снаружи не меняют.

0.7.25 — 6 октября 2026

Ещё 116 правок языка снаружи не меняют.

0.7.24 — 3 октября 2026

Ещё 266 правок языка снаружи не меняют.

0.7.23 — 29 сентября 2026

Ещё 50 правок языка снаружи не меняют.

0.7.22 — 25 сентября 2026

Ещё 71 правка языка снаружи не меняют.

0.7.21 — 21 сентября 2026

Недоказанное не запускается молча: flang run и flang io считают вердикт до работы и отвечают кодом 3, если обещание закрыто только примерами. Пропуск — ключом --на-веру.

Двоичный хозяин читает среду и доводы вызова, и у него появился экран — управляющий терминал.

Независимый сверщик перестал принимать ложное доказательство и перестал звать честную запись ложью; доля собственных записей 650 из 650.

Ещё 37 правок языка снаружи не меняют.

0.7.20 — 18 сентября 2026

доля 650 из 650, вердикт ДОКАЗУЕМ

Ещё 218 правок языка снаружи не меняют.

0.7.19 — 13 сентября 2026

Ещё 11 правок языка снаружи не меняют.

0.7.18 — 12 сентября 2026

Ещё 48 правок языка снаружи не меняют.

0.7.17 — 11 сентября 2026

Ещё 140 правок языка снаружи не меняют.

0.7.16 — 9 сентября 2026

чекер переигрывает вывод факта о типе; дорога до конца измерена

Ещё 12 правок языка снаружи не меняют.

0.7.15 — 8 сентября 2026

калькулятор снят из чекера, гейт независимой проверки закрыт

Ещё 124 правки языка снаружи не меняют.

0.7.14 — 7 сентября 2026

доля корпуса независимым чекером 5%→60,78%

Ещё 9 правок языка снаружи не меняют.

0.7.13 — 6 сентября 2026

Ещё 53 правки языка снаружи не меняют.

0.7.12 — 6 сентября 2026

Выпуск, который наконец отдаёт людям все девять целей печати.

0.7.11 вёз рантайм ОДНОЙ цели: brew install ставил share/flang/c и только, а восемь остальных были обещаны в man, в обоих README и в справке самого двоичного — и у поставившего не работали. Нашёл это владелец на своей машине, попробовав flang emit --target js. Теперь архив, формула и asdf везут все девять, 32 файла, и проба формулы щупает две цели вместо одной.

Что ещё въехало от 0.7.11:

КЛЮЧ КЕША ПРИГОВОРОВ БЫЛ ПОДДЕЛЫВАЕМ. Многочленный отпечаток линеен — столкновение не искали перебором, а решали уравнением за 3,6 секунды. На живой программе: два постусловия, одно ядро доказывает, другое отвергает, имена подобраны под общий ключ — и печать с горячим кешем ставит НОЛЬ сторожей постусловия вместо одного, обоими кодами 0 и без слова в stderr. Ключ переведён на sha256. Цена названа честно: честный кеш не окупается, 23,0 с против 22,2 с вообще без кеша, потому что sha256 написан на flang.

ЦЕЛЕЙ В CI СТАЛО ВОСЕМЬ ИЗ ДЕВЯТИ вместо двух — расширение упиралось не в цену, а в то, что никто не мерил: шесть тулчейнов из семи уже в образе. Без присмотра осталась одна, elixir, и это сказано в выводе самого шага.

ЧЕКЕР ПЕРЕСТАЛ ВРАТЬ В ОБЕ СТОРОНЫ. Доля проверенного корпуса 32,56 % → 56,98 % по записям. Набор проб: 159 подделок, принято кодом 0 — ноль; 119 честных, отвергнуто — ноль.

ПРИМЕРЫ САМОГО КОМПИЛЯТОРА ГОНЯЮТСЯ. Их 4453, и до этого выпуска не исполнялся ни один; теперь под присмотром 4350.

СЕМЯ ВОСПРОИЗВОДИМО: две перепечатки одного дерева дали побайтово одинаковое тело — 4 файла, 1 229 825 байт.

Порода, всплывшая за сутки восемнадцать раз и стоящая тут отдельной строкой: сторожат ровно то, что умеют посчитать.

Ещё 33 правки языка снаружи не меняют.

0.7.11 — 5 сентября 2026

Семя перепечатано целиком (16 404 с, ПЕЧАТЬ КОД=0) и проверено четырьмя прогонами: семя = источник, раскрутка сошлась с отпечатком, двоичный говорит 0.7.11, страница руководства держит эту версию в четырёх местах сразу.

Что въехало за 34 коммита от 0.7.10:

ЦЕЛЕЙ ПЕЧАТИ ДЕВЯТЬ, не восемь. C++ печатала и собиралась начисто, а проза и сторожа держали восьмёрку. Исправлено в man, обоих README и курсе; сторож обещаний о печати научен считать девять и тут же нашёл второе расхождение, которого не видел никто: файл сборки печатают восемь целей, а обещали семь. Названо прямо и то, что хуже: девятую цель не сверяет с вычислителем никто.

ЧЕКЕР ПЕРЕСТАЛ КРИЧАТЬ НА ЧЕСТНЫХ. Объявление типа читалось сквозь примечание: 62 ложные тревоги из 923 на честных записях честных программ — теперь ноль. Цена — две строки кода. Подделок 138, принято кодом 0 ноль.

СТОРОЖА, КОТОРЫЕ НЕ МОГЛИ ПОКРАСНЕТЬ. Один возвращал «провал» в обеих ветвях, отчего шаг был зелен при любом исходе. Второй молчал оттого, что запись «отсрочка» глушила имя во всём дереве. Семи сторожам заведены пробы порчи; показанных прогоном стало 15 из 59 вместо 8.

ОПИСЬ ДЕРЕВА СВЕРЯЕТ СВОЮ ЖЕ ТАБЛИЦУ и научилась считать то, что не считала: правило врало в НЕДОСЧЁТ на восемь файлов. Разрыв долга с потолком был не 41, а 49; сегодня 43. Потолок не тронут.

ЦЕНА ПРИМЕРА ПОМЕРЕНА ПОШТУЧНО и опровергла оценку в 46,3 часа: выходит 11–25, из них 5,5 померены. Причина дороговизны — глубина вычисления, а не длина тела: в языке нет побитовых действий.

Порода, всплывшая за сутки одиннадцать раз и стоящая тут отдельной строкой: сторожат ровно то, что умеют посчитать.

Ещё 132 правки языка снаружи не меняют.

0.7.10 — 4 сентября 2026

Шесть тегов подряд (v0.7.4-v0.7.9) не дошли до публикации, гоняясь за sha256 Homebrew-формулы вручную, каждый раз ловя её несовпадение с тем, что собрал сам конвейер выпуска. Настоящая причина нашлась только на седьмой попытке: у release.yml workflow_dispatch никуда не делся — снят был только у СТАРОГО publish-npm.yml (задача 8649 про npm его не трогала). Сухой прогон на main даёт настоящий хеш архива БЕЗ метки — шаг сверки тега с версией гейтится refs/tags/v и на ручном пуске не звучит. Ни разу за все шесть попыток ничего битого не вышло: конвейер сам останавливался до публикации. Ни один тег не удалён, все просто пропущены.

Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс landed на dev 3 сентября (Ч390, 8e02c37e), но после тега v0.7.3.

Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал.

main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2).

0.7.9 — 4 сентября 2026

намеренная метка для сбора настоящего sha256 у конвейера (см. следующий тег за реальным содержанием)

0.7.8 — 4 сентября 2026

намеренная метка для сбора настоящего sha256 у конвейера (см. следующий тег за реальным содержанием)

0.7.7 — 4 сентября 2026

намеренная метка для сбора настоящего sha256 у конвейера (см. v0.7.8 за реальным содержанием)

0.7.6 — 4 сентября 2026

v0.7.4 и v0.7.5 не дошли до публикации: конвейер выпуска сверяет sha256 Homebrew-формулы с архивом, который сам собрал на теге, и оба раза остановился ДО публикации на несовпадении (0.7.4 — формула ещё несла хеш 0.7.3; 0.7.5 — локально пересчитанный хеш всё равно не совпал побайтово, причина не разобрана). Оба сработали как задумано: ничего битого не вышло, оба тега не удалены, просто пропущены — как v0.7.1 и v0.7.2 раньше. Хеш для 0.7.6 взят прямо из текста ошибки конвейера.

Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс landed на dev 3 сентября (Ч390, 8e02c37e), но после тега v0.7.3.

Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал.

main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2).

0.7.5 — 4 сентября 2026

v0.7.4 не дошла до публикации: sha256 в Homebrew-формуле стоял от 0.7.3, конвейер выпуска сверил его с архивом, который сам собрал на теге, и остановился ДО публикации — сработал как задуман, ничего битого не вышло (workflow_dispatch dry-run для сверки заранее больше не существует с 3 сентября, задача 8649). Тег v0.7.4 не удалён, просто пропущен.

Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс landed на dev 3 сентября (Ч390, 8e02c37e), но после тега v0.7.3.

Заодно: FLANG_VERSION в семени отставала на три релиза; задача 9983 заведена, чтобы это не повторялось. Проверено живым REPL через настоящий псевдотерминал.

main получил дневную работу dev целиком — задачи 9960 (12 ячеек Node→flang), 9982 (SIG9 у спаунутого check), первая сошедшаяся пара two-prints-identical.sh, находка и починка второй дыры в независимом чекере (Г2).

Ещё 2 правки языка снаружи не меняют.

0.7.4 — 4 сентября 2026

Хотфикс: REPL падал на КАЖДОМ вводе живой оболочки (FLANG_UNKNOWN_NAME: запись не содержит поле «планировщик заголовок») — ручной список полей в flang_repl.c отстал от таблицы EMIT_FIELDS_C на два поля. Фикс существовал на dev с 3 сентября (Ч390, 8e02c37e), но приземлился ПОСЛЕ тега v0.7.3.

Заодно: FLANG_VERSION в семени была "0.7.0"/"0.6.2" — три релиза позади (та же болезнь, что чинил хотфикс 9959; заведена задача 9983, чтобы не повторялось). Проверено живым REPL через настоящий псевдотерминал.

main получил дневную работу dev целиком (164 коммита) — задачи 9960 (12 ячеек Node→flang), 9982 (диагностика SIG9 у спаунутого check), реальный шаг к Г6 (первая сошедшаяся пара two-prints-identical.sh), находка и починка второй дыры в независимом чекере (Г2).

Ещё 103 правки языка снаружи не меняют.

0.7.3 — 3 сентября 2026

хотфикс версии довыпущен: sha256 взят у самого конвейера

Метки v0.7.1 и v0.7.2 не дошли до публикации: у обеих ручная сборка архива для Homebrew не совпала с тем, что собрал сам конвейер выпуска на теге (0.7.1 — расхождение полное; 0.7.2 — 4 байта из 4 447 763, причина не разобрана). Оба тега не удалялись (запись запрещена), просто пропущены. На этот раз число в формуле взято напрямую из sha256sum самого конвейера (сухой прогон release.yml через workflow_dispatch на этом дереве до метки), не пересчитано вручную.

Содержательно всё то же, что должно было быть в 0.7.1:

ЧТО СЛОМАЛОСЬ. FLANG_VERSION был вшит буквально в двух местах (flang/src/emit/c/flang_repl.c, bootstrap/flang_repl.c) и не менялся при бампе версии в package.json — двоичный 0.7.0 на flang --version отвечал «0.6.2», на два релиза позади. Через brew ставился пакет «0.7.0», а сам двоичный называл себя старым именем (задача 9959).

ЧТО ПОЧИНЕНО. Обе константы → 0.7.3. Формула Homebrew несёт sha256 этой метки; тап digitable-lol/homebrew-tap обновляется тем же приёмом следом за публикацией.

СВЕРХ ХОТФИКСА, тем же диапазоном коммитов: живая REPL-сессия падала на КАЖДОЙ введённой строке (запись «Настройки» несла 15 полей вместо 17, которых требует печать цели «c» с тех пор, как выучилась печатать процессы) — починено; надзор на цели js в dev получил фикс, найденный утром на main, но забытый при слиянии; сайт: снята пара устаревших чисел и одна ошибка перевода (TLS в английской половине записи 0.6.2).

Гейты доказуемости не двигались, всё ещё 2 из 7 на 3 сентября 2026 (КРИТЕРИЙ.md).

0.7.2 — 3 сентября 2026

хотфикс версии довыпущен: неверный sha256 остановил v0.7.1

Метка v0.7.1 не дошла до публикации: архив для Homebrew был собран вручную (io-запуск release-in-c.flang был на тот момент недоступен), и его sha256 не совпал с тем, что собрал сам конвейер выпуска на теге. Шаг «Сверить хеш архива с формулой Homebrew» это поймал и остановил всё до GitHub Release и npm — под v0.7.1 не вышло ничего. Тег не удалялся (запись запрещена), просто пропущен; эта метка — то же дерево плюс формула с sha256, посчитанным локально тем же io-рецептом, что и сам конвейер, не вручную.

Содержательно всё то же, что должно было быть в 0.7.1:

ЧТО СЛОМАЛОСЬ. FLANG_VERSION был вшит буквально в двух местах (flang/src/emit/c/flang_repl.c, bootstrap/flang_repl.c) и не менялся при бампе версии в package.json — двоичный 0.7.0 на flang --version отвечал «0.6.2», на два релиза позади. Через brew ставился пакет «0.7.0», а сам двоичный называл себя старым именем (задача 9959).

ЧТО ПОЧИНЕНО. Обе константы → 0.7.2. Формула Homebrew (packaging/homebrew/flang.rb) несёт sha256 архива этой метки; тап digitable-lol/homebrew-tap обновляется тем же приёмом следом за публикацией.

Гейты доказуемости не двигались, всё ещё 2 из 7 на 3 сентября 2026 (КРИТЕРИЙ.md).

0.7.1 — 3 сентября 2026

хотфикс: --version больше не врёт

Хотфикс, не про гейты доказуемости — они не двигались, всё ещё 2 из 7 на 3 сентября 2026 (КРИТЕРИЙ.md).

ЧТО СЛОМАЛОСЬ. FLANG_VERSION был вшит буквально в двух местах (flang/src/emit/c/flang_repl.c, bootstrap/flang_repl.c) и не менялся при бампе версии в package.json — двоичный 0.7.0 на flang --version отвечал «0.6.2», на два релиза позади. Через brew ставился пакет «0.7.0», а сам двоичный называл себя старым именем (задача 9959).

ЧТО ПОЧИНЕНО. Обе константы → 0.7.1. Формула Homebrew (packaging/homebrew/flang.rb) поправлена на архив этой метки; тап digitable-lol/homebrew-tap обновляется тем же приёмом следом за публикацией.

СВЕРХ ХОТФИКСА, тем же диапазоном коммитов: задача 8651 — часть шагов CI была названа транслитом, поправлено на английский; docs/site/numbers.json — на сайте застряла версия 0.6.2.

Ещё 4 правки языка снаружи не меняют.

0.7.0 — 3 сентября 2026

библиотека шире, а главная работа — поиск собственных обманов

За две недели от 0.6.2 до заморозки легло 2441 коммитов (счёт: git rev-list --count v0.6.2..4df82447). Правил, меняющих язык снаружи, из них 617 по правилу видимости самого журнала; ниже они сведены в восемнадцать строк, а 1824 остальные язык снаружи не меняют. Строки ниже — сводка, а не перечень: две с половиной тысячи коммитов не перечисляются.

ЧЕГО В ЭТОМ ВЫПУСКЕ НЕТ. Язык НЕ формально-доказуемый. Критерий записан семью гейтами; на 3 сентября 2026 взято 2 из 7 — Г1 (ядро выдаёт объект доказательства) и Г3 (размер доверия назван числом). Г2 был взят 31 августа и снят тем же вечером: ложь дошла до кода 0. Г4, Г5, Г6 и Г7 не взяты. Честная формулировка — «не формально-доказуемый, взято два гейта из семи».

ЯДРО СПОСОБНО ДОКАЗАТЬ ЛОЖЬ. При развёртке вызова ядро подставляет довод под связыватель того же имени, получает тавтологию и печатает «доказано обо всех входах» про утверждение, ложное на каждом испробованном входе (задача 9618). В сегодняшнем корпусе такого доказательства нет: померено 0 из 240 — ни одно из 240 утверждений, числящихся доказанными, этой дорогой не идёт (замер 3 сентября 2026). Мест захвата в дереве 33, под доказанным утверждением стоят 12, но с 86 записями корпуса они не пересекаются. Проверка постусловия из напечатанного кода при этом не снимается: ложно «доказанное» свойство всё равно проверяется при работе.

ДОЛЯ КОРПУСА, ПРОВЕРЕННАЯ НЕЗАВИСИМЫМ ЧЕКЕРОМ, — 0,00 %. Ни одно утверждение корпуса не проверено чекером, собранным без единой строки от flang: 0 из 240 (замер прибором flang/proof/доля-корпуса.sh на этом же стволе 2 сентября 2026; перемерено 3 сентября дважды независимо — тот же ноль). Прежде называвшиеся 0,83 % (2 из 240) завышены и сняты: замер шёл на невлитой ветке a/vremennoe-v-dereve, а оба «проверенных» утверждения были одним и тем же заявлением, встретившимся дважды. Чекер ствола ключа --по-утверждениям не знает вовсе, так что на выпускаемом дереве этот вопрос сегодня нельзя даже задать.

ЧТОБЫ ПЕРЕПЕЧАТАТЬ КОМПИЛЯТОР СЕМЕНЕМ 0.7.0, НУЖЕН КЛЮЧ --предел-глубины 200000. Вшитый предел 20 000 (#define FL_MAX_DEPTH, bootstrap/flang_runtime.h:10) упирается в одну машинно написанную строку постусловия в 90 286 кодовых точек — flang/self/emit-python.flang:3779 на замороженном стволе. Без ключа связывание исходников падает; с ключом проходит (задача 9957). Раскрутка на этом не замкнута: сторож проверял, что семя собирается и отвечает, а не что оно умеет напечатать компилятор.

Задачи 9611–9617 о находках этих двух недель лежат в дереве выпуска (tasks/). Задачи 9618–9622, 9953, 9957 и 9958 записаны после заморозки и в это дерево не вошли.

Ещё 1084 правки языка снаружи не меняют.

0.6.2 — 22 августа 2026

Ещё 4 правки языка снаружи не меняют.

0.6.1 — 22 августа 2026

Ещё 16 правок языка снаружи не меняют.

0.6.0 — 22 августа 2026

Ещё 594 правки языка снаружи не меняют.

0.5.1 — 19 августа 2026

Ещё 357 правок языка снаружи не меняют.

0.5.0 — 18 августа 2026

Ещё 374 правки языка снаружи не меняют.

0.4.8 — 9 августа 2026

вложение и пересечение: у множеств появились слова

Ещё 42 правки языка снаружи не меняют.

0.4.7 — 7 августа 2026

монада, отказ значением, полиморфизм в репозитории

Ещё 1 правка языка снаружи не меняют.

0.4.6 — 7 августа 2026

бинарник разговаривает с человеком: check, repl, справка, man

Ещё 6 правок языка снаружи не меняют.

0.4.5 — 7 августа 2026

Ещё 4 правки языка снаружи не меняют.

0.4.4 — 6 августа 2026

Ещё 2 правки языка снаружи не меняют.

0.4.3 — 6 августа 2026

подсветка FTS для Vim едет в пакете

Ещё 2 правки языка снаружи не меняют.

0.4.2 — 6 августа 2026

Ещё 1 правка языка снаружи не меняют.

0.4.1 — 5 августа 2026

Команды пакета отвечают после установки

Исправлено: flang, fts и fts-mcp в 0.4.0 после npm i печатали ноль байт и выходили с кодом 0 — страж точки входа сравнивал пути как строки, а npm ставит команды символьными ссылками.

Закреплено регрессией, которая ставит ссылку так же, как npm.

0.4.0 — 5 августа 2026

Первая публикация @digitable-lol/fts

Пакет несёт FTS и flang одним набором: fts, fts-mcp, ftsc, ftsvm, ftspec и flang. 327 файлов, 1,1 МБ в архиве, 8,3 МБ распакованный.

Проверено до выпуска: 1738 тестов на Node 20, 22 и 24 без падений, сборка, состав пакета без тестовых файлов, запуск flang из распакованного архива.

Ещё 8 правок языка снаружи не меняют.