Loment 0.1.4 Alpha2 与 FujoOS 内核 FOC-0.1.0
两个发布同日落地。Loment 0.1.4 Alpha2 的主题是「去 clang」——编译器自己的后端接手了最后一段外包给 LLVM 的工作;FOC-0.1.0 是 FujoOS 内核的第一个 tag。
bench / cov / dbg 不在发行版的命令面里——它们是开发侧入口 python tools/loment.py 的子命令;那一页说「自举页、工具链页、冻结面与已知边界页都已按这一版更新」,实际上它们停在 Alpha2.2/Alpha2.3 之间,直到本站重新校对才对齐。另外那一节里 genesis 写的 72136 字节是当天的实测,今天实测是 90504 字节——它随种子变,不是常量。原文保留不改。
Loment 0.1.4 Alpha2:clang 出局
clang 在这个仓库里只出现在两处,但两处都是必经之路:把种子 .ll 变成 stage1,以及把每一个发射出来的 .ll 变成可执行文件。根因是仓库里没有自己的汇编器与链接器——IR 到可执行文件这一段一直外包给 LLVM。WSL 是这条依赖的连带后果:产物是 Linux ELF,Windows 侧就只能把整套工具链装进 WSL。
新增的 lomelf 是第三个后端:读取 LLVM IR 子集,直接产出 x86-64 静态可执行文件。它不吃 AST、不吃编译器内部结构,所以冻结面里的 codegen.lomt 与 driver.lomt 一行未动,既有的两后端逐字节等价也不受影响。设计上有三条自觉的取舍:栈机、不做寄存器分配(要的是正确,不是快);调用约定是它自己定的,不是 System V;不支持的构造一律报错退出,绝不静默编出一个错的。
判据分两层。第一层是行为:同一份 IR 分别喂 clang 与原生产物,比较标准输出字节与退出码,四个程序全部一致。第二层是自举镜像:用 Loment 写的 lomelf.lomt 走种子自举链编成二进制后,对四个语料产出的可执行文件与参考实现逐字节相同。也就是说,编译一个 Loment 程序从发 IR 到出可执行文件,全程不需要 clang。
这一版补上的最后一格是能力域:带 capability 的程序此前在原生产品的链接期就会死——域描述表是一张结构体全局初值,而解析器原先只认标量、字节串与数组,于是直接报「不支持的全局初值」,连仓库自己的 native_cap.lomt 都编不出来。这个洞一直没被语料扫到,因为原生产品的语料里没有带能力域的程序。现在它有一条判据同时钉三件事:域内 guard 放行、非字面量越界在运行期 trap、字面量越界在检查期就拒。
链条的起点也换了。loment/build/genesis/ 里现在是一份提交进仓库的二进制(72136 字节,由种子构建出来、可复现、有自己的 SHA256)。sh loment/bootstrap.sh 在 PATH 里没有 clang 的环境下走完四条证明。残留的诚实点写在这里:genesis 消不掉——它可复现、有来源、有哈希,但它是个二进制,不装作没有。
Windows 侧随之原生:同一个 IR 产出静态 PE32+,loment build / loment run 在一台干净的 Windows 上开箱即用,包里的链接器本身就是自举产物。发行包不再需要 WSL,loment.cmd 里也不再出现 wsl——这一条有判据:把 PATH 收成只剩 Python,照样编得出、跑得起来。
顺带收了两处口径。其一,自举 parser 的语料从 42 涨到 43(lomelf.lomt 加进 PE 常量后第一次被扫到),同时补上「整数字面量按数值出」——参考实现出 (int 4096),此前的 Loment 版会照抄原文出 (int 0x1000)。其二,loment ir 的反汇编也改走原生后端。
FOC-0.1.0:内核的第一个 tag
FOC-0.1.0 指向 project-dev 的分支顶点,内容 = B 段收口(W63a–W70a)加并行开发基础,共六个提交。它的意义不是「内核完成了」,而是内核第一次有了一个可被引用的字节快照——所有验证都在那个 tag 指向的那份字节上跑过。
验证读数:门禁 parallel_gate 8/8 OK;全量矩阵 79 例 78 PASS / 0 FAIL / 1 FLAKY,那 1 例是已知的「连续盒用例抢 COM2 端口」竞态(harness 重跑即过,本次单独复跑 2/2);镜像预算余量 562,864 字节 ⇒ T = 156.3 波;池账本 Σ(r+h) = 80,312 / B = 102,400 ⇒ T = 308.3 波;从 index 抽树冷编 0 error。
这一版里唯一与 Loment 直接相关的是 W70:台账准入(0x831A)的判定层改由 Loment 写的代码承载。边界要写清楚——L3 不等于 L4:换成 Loment 的只有判定,内核本体仍是 Rust,接口面那五个 op 与返回码一字未动。
还没做完的
Loment 侧:一百个里程碑完成 87 个、部分完成 8 个、未开始 4 个(全部在内核侧)、未达 1 个(M100,缺的是第三方复核,作者无法自证)。构建与发布脚本仍有 Python;CLI 里 bench / cov / dbg 三条仍在外调 clang。已知边界页现在把自举链上两条仍开放的缺口也写进去了——违背它的写法会踩到,改名 / 绕开只是本次的处理。
内核侧:池迁移前的历史数据混着两种布局,镜像轴增速因此有两种读法(同布局窗口约 1,148 字节/波 ⇒ T ≈ 490 波);两种读法的镜像 T 都远大于 50,不影响任何裁定。发行与外部审计(M100)仍是未达状态——这一条两个发布都一样。
站上的自举页、工具链页、冻结面与已知边界页都已按这一版更新。工具链页此前写着包管理器「还没重写」,那句在 0.1.4 就已经不成立,这次一并改掉。