自举
自举在这个项目里的定义比通常窄:不是“一门语言能写自己的编译器”,而是“编译器编出的编译器,产出的东西与参考实现逐字节相同”。判据是可判定的,不是感受性的。
自举的阶段
| 阶段 | 内容 | 状态 |
|---|---|---|
| 词法 | Loment 版 lexer,与 Python 版 token 流逐 token 一致 | OK |
| 语法 | 全语料 43/43 逐字符一致,dump 助手零跳过;两道棘轮(已知缺口表)已清空,且门禁拒绝过期条目 —— 覆盖不准回退(下限钉成 CORPUS_FLOOR)。 | OK |
| 类型检查 | 规则等价 63/63;另有 63 条负例直接喂自举驱动,全部非零退出且无假阳性。 | OK |
| IR 生成 | .ll 与 Python 版逐字节一致,目标覆盖 39/39 | OK |
| 三阶段定点 | stage1 编译 driver.lomt,产物与种子逐字节相同(种子自身就是个定点);stage2 与 stage3 逐字节相同;换一个非自身入口(native_res.lomt),stage1 与 stage2 的产物也一致 —— 最后一条用来排除“只会编译自己”的巧合。 | OK |
| 原生后端 | 编译一个 Loment 程序从 IR 到可执行文件不再经过 clang:ELF 与 PE 两个目标各有参考实现与自举镜像,四个语料产物与参考逐字节相同;带能力域的程序也在内。 | OK |
| 无 clang 引导 | 起点是一份提交进仓库的 genesis:loment/build/genesis/lomelf-linux-x64.elf,90 504 B,sha256 926c4ebb…。它就是 lomelf——把 .ll 汇编成可执行文件的那一个后端——由种子加一次 clang/lld 构建、可复现,然后被提交进仓库。sh loment/bootstrap.sh 在 PATH 里没有 clang 的环境下走完四条判据。 |
OK |
那一格为什么重要
在此之前,自举链只能从 Python 版编译器起步:stage1 由 tools/lomentc.py 现编。也就是说,“想重建 Loment 编译器”这件事本身依赖一个解释器。这条依赖比工具链(格式化、文档、语言服务)更根本 —— 它不在使用侧,在重建编译器那一步上。
把起点固化成工件之后,从“重建或使用 Loment”出发的路径上已经没有解释器,也没有 C 编译器。剩下的 Python 只在开发期判据(一致性套件、CI)与构建 / 发布脚本上 —— 每一项都写了可测量的迁移判据,而产品路径是干净的。
clang 原本站在两处必经之路上:把种子 .ll 变成 stage1,以及把每一个发射出来的 .ll 变成可执行文件。仓库里没有自己的汇编器 / 链接器,IR 到可执行文件这一段一直外包给 LLVM。现在这件事由 lomelf 接手 —— 它是第三个后端,不改冻结面里的 codegen.lomt / driver.lomt,也不动既有的两后端逐字节等价。WSL 是这条依赖的连带后果(产物是 Linux ELF,Windows 侧只能把整套工具链装进 WSL),所以“去 clang”和“去 WSL”是同一根绳子上的两段。
种子本身也有一道棘轮:门禁每次都拿参考实现重新发射一遍并逐字符比对 —— 自举产物变了而种子没跟上,门禁就红。这是“种子不许过期”。
还有一条要写明的:链条总要有第一个可执行文件,genesis 就是那个。它有来源(种子加一次 clang/lld)、有哈希、可复现 —— 但它确实是个二进制。所以 clang 并没有从这个项目里消失,它只是被从链条上拿掉了:重新铸造 genesis(python tools/loment_genesis.py --emit)仍然要一次 clang 或 WSL;只核对哈希(--check)不需要。另外 genesis 是 Linux ELF,所以这条无 clang 的路跑在 Linux / macOS / WSL 上。
还差什么(写清楚)
- 源代码已经公开,第三方审计还没过 —— 版本 0.1.4 Pre2 已经完成(冻结面见
docs/158),且源代码已在github.com/FujoJTOP/loment公开;未达的 M100 是第三方审计本身。100 个里程碑口径下完成 96 个、部分 2 个(M56 LSP 宿主已就位、编辑器内人工点验待做;M92 交叉编译到 aarch64 通过但没有模拟器可验)、未开始 1 个(M39)。 - 构建 / 发布路径还有 Python —— 用户侧工具链(格式化、文档、语言服务、包管理)与 L0 生成器都已 Loment 化,构建路径也走了两格(
lomstatus、lomrel)。剩下的是构建与发布脚本这一侧:lom_spec_emit/loment_release/loment_src/loment_dist/loment_seed/loment_manual。命令面本身已经不是 Python 了——发行包里的loment是一个 Loment 程序(loment/tools/lomcli.lomt)。开发侧入口python tools/loment.py里的bench/cov/dbg仍是 Python 而且外调 clang,但它们是开发侧命令,不在产品路径上。 - 内核侧只剩一项,而且它可能不是真缺口 —— 这一片原先整排标着 P7。现在:撤销由内核真正实施(M37,串口
INV_RUN … rev=2 nonrev=0)、A1–A4 断言接进内核并启动自检(M40/M50,CAP_ASSERTS n=2 bad=0 guards=2)、信任自适应域宽接口(M42)、中断与断言表接入(M33)都已完成,证据来自 compat 线 2026-09-15 的报告。唯一没翻的是 M39(与内核域模型对齐),而那次复核的结论是内核侧不缺东西:域表早已从静态初值搬进 arena、由replay_init()在启动时填满,是对比工具tools/loment_caps_diff.py还在找静态初值——那两条红是假阳性,要修的是工具。 - 自举版比参考实现慢约 10 倍 —— 编译自身 12.8 秒,参考实现 1.2 秒。目前只记了基线与护栏(M86),没做优化。