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

Адрес модуля в замке — sha256 его исходника, а сжатия в формате нет вовсе

Замок и пакет схемы 1 хранили модуль так: разбор → JSON → brotli качества 11 → base64, и ЭТО называлось адресом модуля. Схема 2 (19 августа 2026, решение владельца) хранит исходник модуля строкой JSON, а адресом зовёт sha256 по нему. Сжатия в формате не осталось ни в каком виде.

Довод — не трудоёмкость, а цель: байт в байт нужен эталонный кодировщик brotli (десятки тысяч строк), иначе замок, собранный двоичным компилятором, не совпадёт с замком свидетеля на том же входе. Писать его на C99 значило бы не приблизить удаление JavaScript, а внести в доверенное основание чужой алгоритм сжатия.

Груз — исходник, а не разбор, и это отдельное решение. Отказ от сжатия делает выбор заново, и исходник выигрывает по трём причинам, из которых первая решающая:

  1. Второй стороне не нужен серийный печатник разбора. Чтобы пересчитать печать разбора, двоичному пришлось бы напечатать дерево в JSON байт в байт как JSON.stringify — включая кратчайшую обратимую запись чисел двойной точности. Исходник печатать не надо: он и так текст. Остаются sha256 (≈130 строк C99) и экранирование строки JSON, которое на flang уже написано («Экранировать», «Печать строки» в flang/core/json.flang).
  2. Исчезает ловушка порядка ключей. Схема 1 обязана была сохранять порядок полей записи в разборе; у текста порядка ключей нет вовсе.
  3. Возвращаются места. См. поправку ниже.

Чем подтверждено. Ветка work/bez-brotli поверх ствола ba9abe99. scripts/lockfile-size.mjs (удалён вместе со второй реализацией) и прямые прогоны CLI:

программамодулейсхема 1схема 2в git (zlib)
orders-api.flang39,1 КБ85 654 Б16 893 Б
library-api/lib/api.flang712,0 КБ95 595 Б19 533 Б
import-check.flang15,0 КБ54 705 Б11 869 Б

То есть на диске замок вырос в 8—11 раз, а в репозитории — вдвое: git жмёт объекты zlib сам. Сжатие не исчезло, оно ушло из доверенного основания туда, где уже было. Замок при этом на 2—3 % больше своих исходников — это нижняя граница подхода «код в замке и лежит», и схема 1 была ниже неё только потому, что платила brotli.

Восемь порч по одному месту каждая (адрес не по исходнику, мёртвая сверка адреса, мёртвая сверка печати списка, мёртвая сверка имени, приём прежней схемы, невыдвинутая схема пакета, замок без разбора, подрезанный груз) — все восемь легли и все восемь покраснели.

Чем ограничено. Перевода схемы 1 в схему 2 нет и быть не может: в схеме 1 лежал разбор, исходника в ней нет. Прежние замки и пакеты отвергаются словами «собран прежним форматом: схема 1, а нужна 2. Пересоберите: …». Цена исходника против разбора в объёме — 15 % (84 931 Б против 73 783 Б на трёх модулях stdlib), и повторный разбор при каждой сборке.

Связано: five-binary-commands-and-the-price-of-each, the-lock-strips-locations-and-the-code-generator-prints-them-back, content-addressing, code-cannot-be-derived-from-its-hash