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

Старый проект FTS нельзя вынести из репозитория дёшево: от него зависят все восемь генераторов кода flang

В репозитории живут два проекта — FTS (TypeScript, каталоги src/, test/, tools/, web/) и сам язык (всё внутри flang/). Со стороны кажется, что это два независимых дерева и разделить их — вопрос переноса каталогов. Это неверно. Восемь генераторов кода языка flang/src/emit/*.mjs импортируют два файла из tools/ftsc/, то есть зависимость идёт из рабочего кода языка, а не из тестов.

Что именно связывает:

Кто зависитОт чегоСтрок
flang/src/emit/{c,go,rust,python,java,csharp,elixir,js}.mjstools/ftsc/src/naming.mjs — транслитерация русских имён в имена целевого языка122
те же восемьtools/ftsc/src/bidi.mjs — экранирование управляющих символов направления письма158
32 файла flang/test/toolchain.mjs, parse-module.mjs, toolchain-guard.mjs, bidi-guard.mjs427
flang/bin/flang.mjs, функция compileFtsсобранное ядро FTS dist/src/index.js

Итого связка — 795 строк в шести файлах плюс собранное ядро. Дублировать naming.mjs и bidi.mjs нельзя молча: обе стороны сверяются побайтово с одним и тем же ожидаемым выводом, и разъехавшиеся копии дадут расхождение не в момент правки, а в момент печати чужой программы.

Обратная зависимость слабее: из FTS в язык лезут только четыре скрипта (scripts/wasm-*.mjs, scripts/build-release-c.mjs, scripts/bootstrap-c.mjs) — они про язык и уедут вместе с ним.

Чем подтверждено. Ветка work/struktura от origin/main = 17d6853, 2026-08-16. Считано grep по дереву, не на глаз:

grep -l "tools/ftsc" flang/test/*.mjs → 32 файла grep -l "dist/src" flang/test/*.mjs → 15 файлов grep -l "^import.*tools/ftsc" flang/src/emit/*.mjs → 8 файлов

Все 68 вхождений пути разложены по назначению: 16 на toolchain.mjs, 15 на toolchain-guard.mjs, 14 на parse-module.mjs, 13 на naming.mjs, 8 на bidi.mjs, по одному на bidi-guard.mjs и stdlib/http/query.fts. Восемь вхождений naming.mjs и восемь bidi.mjs — это ровно восемь генераторов.

Чем ограничено. Это цена разделения, а не цена самого FTS. Держать FTS в подкаталоге стоит ноль. Числа верны на 17d6853; связка живёт в рабочем коде и может вырасти от любой правки генераторов.

Чем закрыто. Разделение сделано 16 августа 2026 веткой work/bez-fts, и цена оказалась ровно названной здесь: шесть файлов, 697 строк. Их не скопировали, а ПЕРЕНЕСЛИ в flang/naming.mjs, bidi.mjs, toolchain.mjs, toolchain-guard.mjs, bidi-guard.mjs, toolchain-guard.test.mjs. Копия была бы хуже удаления: обе стороны сверялись побайтово с одним ожидаемым выводом, и разъехавшиеся копии дали бы расхождение не в момент правки, а в момент печати чужой программы. Заметка остаётся как замер цены — он подтвердился, — а не как довод против выноса.

Связано: byte-for-byte-comparison, renaming-a-file-silently-disables-the-guard, a-frozen-reference-changes-the-check