Commit fda937d
committed
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
0 commit comments