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

Октеты в этом языке выразимы списком чисел, а не строкой, и решает это отсутствие «символа по коду»

Труба соединения возила текст: поручения «Прочитать из соединения» и «Ответить в соединение» объявлены со строка, и хозяин на Node раскодировал сокет как UTF-8. Очевидный ход — сделать так, чтобы строка возила произвольные октеты (latin1, суррогатное экранирование, режим у соединения). Все такие ходы невозможны, и мешает им не хозяин, а язык.

В языке есть код символа (строка → число) и нет обратной формы «символ по коду» (flang/SPEC.md, раздел 5; решение записано там же вместе с ценой: «стоила бы восьми рантаймов и решения про то, что делать с числом, которое кодовой точкой не является»). Значит программа не может построить строку с наперёд заданным октетом. Двоичный запрос был бы неотправляем даже при идеальном хозяине: испортилось бы не чтение, а сама возможность что-либо сказать. Строка, которую нельзя собрать, — не носитель.

Список чисел из [0, 255] эту стену обходит целиком и не вводит нового понятия: это уже принятая в дереве мера байта. flang/stdlib/utf8.flang («Байты текста», «Кодовые точки из байтов») и flang/stdlib/base64.flang («Закодировать байты») говорят октетами именно так. Второй способ назвать байт был бы вторым способом хозяевам разойтись.

Что получается даром: длина списка — число октетов, то самое, которое просит всякий протокол с длиной в заголовке; нулевой октет — обычное число 0, а не конец строки; и ни один хозяин ничего не декодирует, значит расходиться им негде.

Чем подтверждено. Ветка vypusk/hozyain, коммиты d0678d9, b48a5a9. Прогон против настоящего PostgreSQL 17.10 (flang/test/oktety.test.mjs): полный сеанс — стартовое сообщение, ответ сервера, запрос, строки данных — 557 октетов, 21 сообщение протокола; через октетные поручения приходит 557 октетов и 21 сообщение, разбивка совпадает с эталоном на голом сокете, знаков замены ноль. Через текстовые поручения на тех же данных: 3 знака замены, 4 сообщения из 21 не доезжают целыми, обратный перевод даёт 632 октета вместо 557.

Чем ограничено. Список из миллиона чисел тяжелее строки в миллион знаков — это плата за то, что октет остаётся октетом; замера этой платы нет. Октетной пары нет у файлов: «Прочитать файл» и «Записать файл» по-прежнему возят UTF-8, и двоичный файл через них не проходит — это перестало быть правдой 22 августа 2026, когда та же пара заведена и файлу (ADR-0006), а текстовая пара научилась на нетексте отказывать вместо молчания. Сама форма «символ по коду» этой правкой не появилась — она делается в ветке vypusk/simvol-po-kodu, и когда появится, у октетов будет второй, более дешёвый носитель.

Связано: two-hosts-corrupted-the-binary-stream-in-different-places, an-empty-string-from-read-means-end-and-that-traps-the-decoder