Проверка в тесте, читавшая .flang своим разбором, оживает прогоном двоичного — но не всякая, и граница проходит по лексике и по обязательствам
После удаления реализации компилятора на JavaScript девятнадцать проверок в flang/scripts/ и flang/proof/ перестали запускаться: все они звали parse, tokenize или загрузчик программы из удалённых файлов. Второй разбор .flang на JavaScript заводить нельзя — это и есть то, что удалено. Единственный оставшийся приём: спросить двоичный компилятор и прочитать его JSON.
Одиннадцать из девятнадцати ожили этим приёмом, восемь — нет, и делит их не сложность, а то, ЧТО именно проверка спрашивает у языка.
Ожило: всё, что спрашивает про дерево, ведомость, печать и вердикт
flang ast отдаёт разобранное дерево, flang check --proof --json — ведомость, flang emit — печать, flang check — вердикт с кодом возврата. Этого хватило проверкам имён, свода ведомости, чисел прозы, печати, пика памяти, досягаемости предусловия и состава правил.
Одна ловушка на этом пути и она общая. flang ast отдаёт дерево после связывания: у файла с «использует … из "…"» в functions лежат и чужие функции. Считать их своими — значит посчитать flang/stdlib/lists.flang столько раз, сколько модулей его подключают, и указать место в чужом файле. Отделяются они точно и без разбора: тот же ответ содержит шапку модуля со списком подключений, и
своё(Ф) = функции(дерево(Ф)) минус ⋃ функции(дерево(П)) по подключениям П
— верно потому, что дерево подключённого файла тоже связано.
Вторая ловушка — цена. Один вызов двоичного = один процесс и полное связывание заново. Запуск стоит 7 мс, разбор — от 5 мс до 600 мс на файл, но flang/self/*.flang подключают половину компилятора, и по одному файлу проверка имён шла 12 минут, свод ведомости — часы. Лечится разведением по ядрам (xargs -P, 256 ядер): проверка имён 12 минут → 20 секунд на прогрев, свод ведомости → 5 минут.
Не ожило: лексика, обязательства, словарь типов, категорная поверхность
Восемь проверок просят у языка то, чего двоичный не печатает наружу, хотя почти всё это у него внутри есть:
| чего просит | у кого внутри есть | кто без этого мёртв |
|---|---|---|
| поток токенов и «ключевое ли слово» | лексер двоичного | занятость слова, проверка утверждений о формах |
| обязательства доказательства и спуски | flang/self/obyazatelstva-i-yadro.flang | три проверки поиска и записи ответов |
словарь типов: имена нат/целое/вес, границы точной сетки, тип результата встроенной формы | слой типов на flang | ядро доказательства в flang/proof/, замер цены типа вес |
| места частичных форм в теле функции | flang/self/failures.flang:690 | главное число свода — сколько тотальных функций не проверяют во время работы НИЧЕГО |
| таблица занятых целью имён и превращение имени модуля в имя цели | восемь печатей на flang | проверка столкновений имён |
| слои категорной поверхности | нигде — их в двоичном нет вовсе | снятие записи ответов оракула |
Довод, почему не переписать их на месте. Для мест частичных форм он не «дорого», а «мимо цели»: место с отметкой доказана проверкой во время работы не является, отметку кладёт слой типов, а flang ast типов не судит намеренно — отметки в дереве нет. Счёт по дереву дал бы верхнюю оценку, выданную за точную. Для словаря типов довод записан ещё автором ядра прямо над ввозом: «переписанное здесь литералом было бы вторым ответом на тот же вопрос».
Чем подтверждено. Каталог /srv/flang-rabota/adr, ветка svod-rask, коммиты 0747a4fe, a0829f28, 73a1eec2, 65307125, 3e4d72a5, 66245238, deccd4b4. Каждая ожившая проверка прогнана и, кроме того, испорчена нарочно — чтобы убедиться, что краснеет на том же: подложенное пусть «н» даёт Р1-одна-буква; снятое слово тотальная даёт FLANG_NOT_TOTAL; «Шесть бэкендов» вместо «Семь» даёт «обещание пропало»; порог памяти 100 при пике 6144 КиБ даёт код 1.
Поправка от 20 августа 2026: мёртвых уже не восемь, а шесть. Здесь стояло, что поток токенов и ответ «ключевое ли слово» двоичный наружу не печатает. Он их напечатал: появилась команда flang tokens <файл> --json и ключ --keyword «фраза», и обе проверки первой строки таблицы — занятость слова и проверка утверждений о формах — работают. Ошибки в рассуждении не было: строка таблицы называла, чего не хватает, и не хватало ровно этого. Замер и довод, по которому печать легла в разбор языка, а не в лексер, — a-token-stream-is-four-times-cheaper-than-a-tree.
Чем ограничено. Про эти девятнадцать проверок и про сегодняшний состав команд двоичного. Проверки в flang/test/*.test.mjs в замер не входили — там своя работа.
Связано: the-binary-is-silent-about-checks-it-does-not-have, checks-that-stopped-comparing, vedomost-dvoichnogo-byvaet-slabee-i-nikogda-ne-silnee