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

Сторона на flang может уже существовать под чужим именем — проверять до того, как писать

Задание говорило: «стороны на flang нет вовсе ни у builtins.mjs, ни у reachable.mjs». Для reachable.mjs это оказалось неверно, и проверка стоила десяти минут, а написанная заново сторона стоила бы часа и завела бы второе место правды.

flang/src/reachable.mjs (248 строк) СТОРОНУ ИМЕЕТ. Она называется не reachable.flang, а лежит внутри flang/self/link.flang — функции «Отбросить недостижимое», «Точки входа», «Оживить», «Имена узла», «Тексты мер», «Тексты спусков». Сверка тоже есть и работает: flang/test/self-link.test.mjs, проверка «отбрасывание недостижимого совпадает с src/reachable.mjs побайтово» — 80 программ с импортами, 7782 выброшенных функции, 0 расхождений, плюс пять отдельных проверок «снять правку и посмотреть, что покраснеет».

Почему поиск по имени файла не помог. Искать reachable.flang бесполезно: сторона названа по СЛОЮ, к которому она относится по существу (достижимость — дело загрузчика, а не отдельного прохода), а не по файлу, который она заменяет. Дешёвый и надёжный признак — искать не имя файла, а имена, которые сверка зовёт: grep по flang/test/ на dropUnreachable сразу показал строку evaluate(свой, "Отбросить недостижимое", …).

Правило на будущее. Прежде чем писать сторону, ищите тремя запросами: имя файла, имя каждой экспортируемой функции по flang/test/*.test.mjs, и русское имя, которым эта функция называлась бы. Третий запрос находит то, что первые два пропускают.

Найденное попутно: сторона и реализация РАСХОДЯТСЯ на одноимённых функциях

Реализация строит таблицу «имя → функция» (Map), и второе объявление того же имени затирает первое: следуются вызовы только ПОСЛЕДНЕЙ одноимённой функции. Сторона на flang складывает вызовы ВСЕХ одноимённых.

Проверено программой из пяти функций, где «Двойник» объявлен дважды и каждый экземпляр зовёт свою цель:

реализация оставила: Вход, Двойник, Двойник, Вторая цель
сторона оставила:    Вход, Двойник, Двойник, Первая цель, Вторая цель

Права здесь сторона: выброшенная «Первая цель» вызывается из тела, которое в напечатанной программе ОСТАЛОСЬ, — то есть реализация печатает вызов функции, которой в выводе нет.

Чем ограничено. Расхождение латентное: из 258 связанных программ дерева одноимённых функций нет ни в одной (посчитано перебором), потому что связывание роняет повтор имени внутри файла. Поэтому существующая сверка его и не видит: корпус такого входа не даёт. Чинить реализацию смысла нет — она свидетель, которого предстоит удалить; но при удалении стоит знать, что поведение при этом слегка изменится, и изменится в лучшую сторону.

Чем подтверждено. Прогон flang/test/self-link.test.mjs (244 с на связывание, 146 с на отбрасывание) и два отдельных замера на ветке work/vstroennye, 18 августа 2026.

Связано: a-dictionary-copied-into-nine-places-drifts-silently