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

Снятое препятствие — не цена: lock и package стоили 2 066 строк C при оценке в 280

Оценка была такая: brotli из формата убран, значит у lock осталось «sha256 (≈130 строк) плюс ≈150 на сборку записи», а package «всё остальное уже имеет». Вышло 2 066 строк своего C (15 628 → 17 694 по четырём файлам flang/src/emit/c/*.c), то есть в 7,4 раза больше.

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

Разложение замером (wc -l по разделам файла):

ЧтоСтрокБыло ли в оценке
sha256 переносимым C99155да, ≈130 — сошлось
сборка замка: обход импортов, порядок, печать, ключи379да, ≈150 — вдвое больше
чтение замка: груз вместо диска, четыре заставы347нет
пакет: объявление, ведомость, пакет над пакетом, подключение1 058нет
справка и разбор ключей127нет

Три из пяти строк таблицы в оценке не значились вовсе, и каждая — обязательная:

Признак, по которому это ловится заранее. Оценивая цену команды, надо перечислить не то, что ей МЕШАЕТ, а то, что она ДЕЛАЕТ, — и по каждому пункту спросить, где это уже написано. Снятое препятствие меняет знак ответа с «невозможно» на «сколько-то», но самого числа не даёт.

Ловушка соседней функции, попавшаяся в том же заходе. Экранирование строки JSON в двоичном компиляторе брать было решено готовое — «уже написано на flang, ноль новых строк» («Экранировать» и «Печать строки» в flang/core/json.flang). Рядом в flang_repl.c лежала своя buf_json_text, и по имени она подходила идеально. Чтение её тела показало расхождение с JSON.stringify на двух символах из 34: 0x08 и 0x0c она пишет шестью байтами вида \u0008, а JSON.stringify — короткой формой в два байта. Адрес модуля есть sha256 по грузу, то есть любой такой байт разошёлся бы на первом же исходнике с управляющим символом — и разошёлся бы молча, потому что оба вывода остаются законным JSON. Взята версия на flang; своего кода на экранирование — ноль.

Расхождение потом ПРОВЕРЕНО, а не оставлено доводом: модуль с сырыми байтами 0x08 и 0x0c в примечании, замок по нему двумя реализациями — сошлись байт в байт, и в обоих стоит короткая форма (по одному \b и \f на файл, ни одного \u0008). С соседней функцией здесь было бы восемь лишних байт, другой sha256 у модуля и другая печать замка.

Чем подтверждено. Ветка work/zamok-dvoichnyy, коммиты 441aeb7b (сборка замка), 5610f0cc (чтение), dea28116 (пакет). Числа строк — wc -l по flang/src/emit/c/*.c до и после; разложение по разделам — счёт строк между заголовками разделов в flang_repl.c. flang_cli.c не тронут (1 084 строки до и после) и остался переносимым C99.

Чем ограничено. Число 2 066 включает комментарии, которых в этом дереве принято писать много: голого кода примерно вдвое меньше. Сравнение с оценкой от этого не меняется — оценка тоже называлась в строках файла.

Связано: five-binary-commands-and-the-price-of-each, a-module-address-is-the-sha256-of-its-source, vedomost-dvoichnogo-byvaet-slabee-i-nikogda-ne-silnee