Skip to content

Commit fda937d

Browse files
flang: печать в Rust — четвёртый целевой язык
После JS, C и Go. Программа печатается в Rust и даёт те же значения и те же коды ошибок, что интерпретатор. Суммы типов — одно динамическое представление (настоящий enum Rust), а не enum на каждую сумму. Довод тот же, по которому в Go отвергнут интерфейс с методом-маркером: SPEC требует структурного равенства ЛЮБЫХ двух значений, доступа к полю по имени и приёма значения снаружи, а это в Rust либо dyn Any, либо крейт сериализации — то есть второе, теневое представление рядом с первым, дающее второй набор расхождений с интерпретатором. Выигрыш enum при этом взят: в Go тег и поля лежали в одной структуре и «число со списком внутри» было представимо, здесь недопустимое состояние не выражается. Rc вместо Box: с Box хвост списка копируется и рекурсия становится квадратичной. Побочно клонирование становится дешёвым, поэтому в печатаемом коде нет ни одного времени жизни. Паника недопустима — ни unwrap, ни индексации вычисленным индексом: ошибка обязана быть значением, иначе коды не совпадут с интерпретатором. Предел глубины срабатывает раньше, чем кончается стек, поэтому вычисление идёт в потоке с 512 МиБ стека: переполнение стека в Rust не паника, а убитый процесс, и вместо FLANG_RECURSION_LIMIT пользователь получил бы truncated-вывод. Дефект ролей в именах, найденный вчера в бэкенде C, здесь закрыт с самого начала и покрыт тестом: модель, где «Значение операнда» — одновременно запись, вариант суммы и функция, обязана дать три разных идентификатора, и она реально собирается и запускается. Rust компилируется по-настоящему: rustc 1.96.0 под -D warnings, причём stderr обязан быть пуст — в языке с образцами неиспользованные имена возникают постоянно, и молчаливые предупреждения означали бы, что бэкенд печатает мусор. Совпадение с интерпретатором доказано на 31 программе, 154 функциях, 2235 входах сетки: значения, коды и тексты ошибок. Известная неполнота: контракта rustfmt нет, в отличие от gofmt у Go, — печатаемый код не нормализован по форматеру, и обещать это без выравнивания печати было бы неправдой.
1 parent 124c3d1 commit fda937d

4 files changed

Lines changed: 5285 additions & 0 deletions

File tree

0 commit comments

Comments
 (0)