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

Побайтовая сверка вычитала блок из вывода свидетеля — и зеленела ровно на том, без чего напечатанная программа не работает

Пять генераторов кода на самом flang (emit-python, emit-js, emit-java, emit-csharp, emit-elixir) не печатали ГРАНИЦУ ВХОДА — таблицу объявленных типов параметров, по которой прогонщик сверяет пришедшее снаружи значение до вызова. Сверка со свидетелем это знала и была написана честно: блок ВЫРЕЗАЛСЯ из вывода свидетеля по двум меткам, остаток сравнивался побайтово, пропажа блока красила сверку отдельно (flang/test/entry-debt.mjs).

И всё равно она молчала о поломке. Вырезался не лишний блок, а дыра: напечатанный flang_cli.py зовёт program.entry() безусловно, и модуль без этой функции падает на первом же вызове из прогонщика. Сверка отвечала «107 программ из 107 побайтово» про код, который не работает.

Урок общий, и он не про границу входа. Вычитание в сверке — это утверждение «вот здесь мы НЕ сверяем», и оно живёт ровно до тех пор, пока никто не спросил, что стоит за вычтенным. Долг, названный вслух, всё равно остаётся долгом; названным он становится не безопаснее, а только заметнее. Признак, по которому такие места ищут: любое место, где сверка приводит две стороны к общему виду, прежде чем сравнить.

Чем закрыто у Python. «Печать границы входа Python» и семь её спутников, около 130 строк на flang; таблица приезжает НАСТРОЙКАМИ, как и текст рантайма. Считать её на стороне печати нельзя: объявленный тип параметра — ответ слоя типов (таблицаВхода в flang/src/types.mjs), и вторая реализация того же ответа разошлась бы с первой молча. Вычитание снято целиком, ключа python в таблице меток больше нет.

Чем подтверждено. Ветка rabota/vosem-python. node --test flang/test/self-emit-python.test.mjs — 107 программ из 107, 428 файлов из 428, ПОЛНЫМИ файлами. До правки те же 107 из 107 давались с вычитанием блока размером 135 890 байт на корпус из 102 программ (в среднем 1332 байта на программу).

Чем ограничено. У четырёх остальных целей (js, java, csharp, elixir) долг на 20 августа 2026 не закрыт, и entry-debt.mjs для них остаётся. У go и rust он закрыт теми же силами и в те же сутки.

Что остаётся неустранимым у ДВОИЧНОГО, и это другое. Двоичный не может построить таблицу сам: эталона таблицаВхода на flang нет ни одной строки (flang/self/types.flang, 6877 строк, слова «Граница входа» не встречается). Он подставляет ВПЕЧАТАННУЮ таблицу, когда печатает сам себя, и пустую — чужой программе, говоря об этом на stderr. Поэтому diff -r печати двоичного против Node на чужой программе не равен нулю ни у одной цели, и мерить надо ДВЕ цифры порознь: «расходится только границей входа» и «расходится чем-то ещё».

Связано: pulling-a-module-into-the-self-hosted-compiler-pays-for-meetings-not-size, five-binary-commands-and-the-price-of-each