Свой генератор машинного кода — примерно месяц, и на доказуемость не влияет
Оценка объёма, чтобы вопрос «сколько это займёт» имел числовой ответ.
Что надо написать (одна архитектура, x86-64): выбор инструкций, распределение регистров, вывод объектного файла (ELF), соглашение о вызовах; связывание можно отдать системному линкеру, это экономит много.
Точки отсчёта (по памяти, не замер):
| Проект | Размер | Что даёт |
|---|---|---|
| QBE, минималистичный | ~15 000 строк C | код на уровне ~70 % от GCC |
| Cranelift | > 100 000 строк | команда, годы |
| Наивный без оптимизаций | 5 000–10 000 строк | подъёмно |
По темпу проекта: за один день написано около 24 000 строк в шести генераторах, все сверены побайтово. По объёму наивный генератор — одна-две цели печати, недели две-три.
Ловушка, из-за которой дольше, чем кажется по строкам. Весь метод стоит на byte-for-byte-comparison, а для машинного кода сравнивать не с чем. Проверять придётся запуском и сравнением поведения — в разы медленнее и ловит меньше.
Итог: наивный генератор, одна архитектура, без оптимизаций, код в 3–10 раз медленнее C — примерно месяц. Догнать C по скорости — годы.
И главное: на доказуемость это не влияет ни на грамм. Убирает зависимость от cc и даёт контроль над скоростью. Полезно, но не про цель — what-is-deferred.
Замерено 18 августа 2026, ветка work/native-x86-backend, отчёт docs/native-x86-backend.md. Оценка объёма подтвердилась (5 350–9 200 строк), две величины выше поправлены:
- «в 3–10 раз медленнее» — на самом деле 1.20× на работе компилятора и 2.30× на арифметике (
cc -O0противcc -O2на одной и той же точке раскрутки): форму кода задаётsizeof(fl_value) = 32 байта, а не качество оптимизатора; - «убирает зависимость от
cc» — не убирает. Уходитcc1(37.5 МБ из 42.0 МБ чужой цепочки), остаютсяld, 11 146 строк ручного рантайма на C и glibc — последняя по существу:fl_number_textищет кратчайшую запись числа перебором черезsnprintfиstrtod.
Связано: byte-for-byte-comparison, games-and-video-are-not-our-case