Поток токенов наружу стоит вчетверо дешевле дерева, и две проверки прозы оживают именно им, а не flang ast
Проверка занятости слова и проверка утверждений о формах спрашивают у языка одно и то же: чем стало слово, когда язык его прочитал. Разобранное дерево (flang ast) на этот вопрос отвечает дорого и не полностью — оно СВЯЗЫВАЕТ, то есть тащит соседние файлы, а имена в комментариях до дерева не доходят вовсе. Ответ даёт поток токенов, и его достаточно вывести наружу отдельной командой — flang tokens <файл> --json и flang tokens --keyword «фраза».
Чем подтверждено (замер на flang/self/parser.flang, 7075 строк). flang ast — 34 секунды, flang tokens --json — 8,9 секунды, человеческий вид без печати JSON — 4,9 секунды. Разница вся в связывании: токены файла от его подключений не зависят. Все .flang дерева, 845 файлов, 32 потока xargs -P — 10 секунд; по одному вызову на файл было бы около семи минут. Проверка занятости слова целиком (её корпус — 410 файлов) — 14—16 секунд на слово. Каталог /srv/flang-rabota/tokeny, ветка vypusk/tokeny.
«Ключевое ли это слово» обязано отвечаться прогоном, а не выведенной наружу таблицей. Таблица поверхностей — 628 записей в flang/self/lexer.flang, и отдать её наружу было бы вторым ответом на тот же вопрос: он разъедется с первым на первой же правке языка. Прогон не разъедется. Цена ответа — 10 мс на фразу.
Требование «ровно один значащий токен» — не придирка. код символа — одно слово из двух частей, лексер отдаёт его ОДНИМ токеном, и форма такая есть. элемент или беда — три ключевых слова подряд, каждое настоящее, а формы такой нет вовсе. Считать вторую существующей значило бы краснеть на верном утверждении.
Печать токенов легла в разбор языка, а не в лексер, и выбора здесь не было
Узлы JSON («Узел записи», «Поле текста», «Поле числом») объявлены в flang/self/parser.flang. Связывание сливает объявления в одно плоское пространство имён, поэтому объявить их второй раз в flang/self/lexer.flang значит столкнуть имена; а ввезти разбор языка в лексер нельзя — разбор сам стоит на лексере. Остаётся одно место, и это разбор языка. Признак, по которому такой случай узнаётся заранее: нижний слой хочет вспомогательные формы, объявленные в верхнем.
Память: поток токенов одного файла — шесть мегабайт, и держать корпус разом нельзя
flang/self/parser.flang даёт 6 126 979 байт JSON. Приём, которым живёт проверка имён (сложить ответы двоичного в память модуля и брать оттуда), здесь не годится: восемь сотен файлов — это гигабайты ради счёта, которому каждый файл нужен ровно один раз. Поэтому файлы показываются двоичному пачками по 64: внутри пачки вызовы разведены по ядрам, после пачки ответы отпускаются.
Проверка, простоявшая мёртвой один день, сразу нашла свежее ложное утверждение
Реализация на JavaScript была удалена 20 августа 2026, и в тот же день в базу знаний легла заметка со словами «переименования при ввозе (как) в языке нет вовсе». Слово как в языке есть — это as. Оживлённая проверка нашла это первым же прогоном.
Урок не про эту заметку, а про срок: ложное утверждение о языке накапливается за сутки, а не за месяц. Проверка, снятая «на время правки», обязана быть возвращена в тот же день.
Правка здесь — прозе, а не проверке: сказано теперь «формы «использует … как …» в языке нет вовсе», и это верно и проверяемо.
Чем ограничено. Про две проверки из восьми, оставшихся мёртвыми после удаления реализации на JavaScript. Остальным шести нужны обязательства доказательства, словарь типов, таблица занятых целью имён и слои категорной поверхности — поток токенов им не помогает ничем.
Связано: a-test-check-revives-by-running-the-binary-not-by-a-second-parser, checks-that-stopped-comparing, the-installed-binary-is-a-named-subset