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

Разбиение имени на слова в эталонах печати сделано таблицей ASCII, а у свидетеля — классами Юникода, и на любой не-кириллической букве они расходятся

flang/src/naming.mjs режет имя на слова выражением [^\p{L}\p{N}]+, то есть буквой считает ЛЮБУЮ букву любого письма. Сторона на flang (flang/self/emit-c.flang, «Словарные символы») держит вместо этого строку из 62 знаков — латиница обоих регистров и цифры. Кириллица до этого места не доходит: её снимает транслитерация. А всё остальное — эсперанто, немецкие умляуты, греческий, иероглифы — для стороны на flang РАЗДЕЛИТЕЛЬ, а для свидетеля буква.

Чем подтверждено, числами. «Змейка» из emit-c.flang против snake из naming.mjs, четыре имени, четыре расхождения:

имясвидетельсторона на flang
Antaŭmetiantaŭmetianta_meti
Ĝisdatigiĝisdatigiisdatigi
Größegrößegr_e
日本語日本語value

В напечатанной программе это видно так: examples/surfaces/factorial.eo.flang печатается в Rust с функцией funkciya_antameti у свидетеля и funkciya_anta_meti у стороны на flang. Мерено сверкой печати в Rust по корпусу examples + flang/stdlib: 163 программы, побайтово совпало 159, одинаково отказали 3, разошлась 1 — и вся разница в этом идентификаторе.

Задевает это НЕ только Rust. «Словарные символы» и «Змейка» живут в emit-c.flang и приезжают импортом во все восемь эталонов печати. То есть двоичный, у которого втащена печать в C, УЖЕ печатает такой программе другие имена, чем Node, — а неподвижная точка этого не видит, потому что все имена самого компилятора русские или латинские.

Почему проверки молчали. Корпус побайтовых сверок — flang/stdlib/*, examples/*, examples/leetcode/*, flang/core/*: 108 программ, и каталога examples/surfaces/ в нём нет ни у одной из восьми целей. А именно там лежат две программы, написанные не по-русски и не по-английски (factorial.eo.flang, factorial.zh.flang) — их держит surfaces.test.mjs, который проверяет разбор языка, а не печать. Расширение корпуса на 55 программ (163 против 108) нашло расхождение первым же прогоном.

Признак для третьего случая. Всякий раз, когда сторона на flang повторяет работу регулярного выражения свидетеля, спрашивать: что это выражение говорит про НЕ-ASCII вход. \p{L}, \p{N}, \w, . и \s в Юникоде значат больше, чем перечислимая таблица, а таблицу на flang пишут перечислением — она конечна по построению. Расхождение при этом не отказ, а тихо другое имя.

Чем ограничено. Замер снят на ветке rabota/vosem-rust, коммит с втаскиванием печати в Rust. Не чинилось: правка лежит в emit-c.flang, чужом для этой работы файле, и задевает все восемь целей сразу — её цена и её проверка считаются отдельно. Вторая программа того же каталога (factorial.zh.flang) отказывает ОДИНАКОВО с обеих сторон («функция 乘积» и «функция 前置» дают один идентификатор), поэтому расхождением не считается.

Связано: the-entry-boundary-was-a-debt-of-printing-not-a-subtraction-in-the-check, a-corruption-lands-only-where-the-corpus-reaches, byte-for-byte-comparison