公告

FujoOS公布日延期,以仓库发布为准

新闻

Loment 0.1.4 Pre2:FFI,以及源代码开源

两件事在同一天。源代码公开github.com/FujoJTOP/loment——一个 clone 就到手,不用把整个 FujoOS 拖下来。以及 0.1.4 Pre2——它是 0.1.4 正式版前的最后一个测试版。

Pre2:调用别的语言写的库

这一版给语言加的东西只有一个:extern fn。它是只有签名、末尾分号的顶层形式,调用点按平台 C ABI 传参——Loment 与 Loment 之间照旧走自家约定(实参走栈),只有声明了 extern 的调用点换一套。构建时用 loment build --link lib.o 把外部目标文件链进来。

两条腿,按「对方是什么」分。C ABI 那一族——C / C++ / Rust / Zig / Go / Swift / C# / Fortran——导出的是同一种符号与同一套传参约定,所以加一个语言就是加一条构建配方加一条判据。运行期那一族——Python / Java / JS / Lua——它们不是导出 C ABI 的库而是解释器,走新加的进程桥 loment/lib/proc.lomt:起一个解释器进程,把代码交给它,把 stdout 读回来。

这台机器上真跑通的: C(退出码 52)、C++(42)、Rust(42)走 --link;Python(9)、JS(7)走进程桥。Java / Zig / Go / Swift / C# / Fortran 的配方写在判据里,但本机没装那些工具链,所以是 SKIP——缺的是工具链,不是通路。这句区分很重要:机制上两条腿各自覆盖一族,"7 个语言"是保守说法。

纯 Loment 程序不受影响。它仍然是 freestanding 的——无运行时、无 libc、不需要 Python。只有声明了 extern 的程序才带外部依赖,而且它自己负责把目标文件准备好。既有程序零改动:extern 是新语法,不用它的程序一个字节都不变(语料 54/54 仍逐字节一致)。

Pre1:把两个面交给使用者

Pre1 在一天前,做的是另一类事——它把两个原先由官方说了算的面交出去。后缀不再属于语言:只有 .lom 是特殊的(L0 接口契约),别的任何后缀都是 L1 源;名字形式 use 找哪个后缀由项目根的 loment.conf 里一行 source_ext() 定。自定义命令:像 git——PATH 上放一个 loment-fooloment foo 就能用,官方命令优先,没有注册表。

Pre1 顺带修掉三处静默错编——同一份源码,两个实现给出不同的单元。其中一处的后果值得单说:名字形式的搜索原先只认仓库相对的四个根,所以装在用户机器上(没有仓库)时 use std 一个都找不到。现在搜索分三层,第二层就是工具链自带的 store——use std 在打包版上第一次能被找到

找到不等于编得过。实测:打包版编译器解析到 std 之后,把 135 个文件全装进来——耗时 9 分 4 秒(同一台机器上一个普通文件的 check 是 0.088 秒)——然后仍然编不出来:合并出来的单元里有重复的顶层名字(E13),另有一批元数与类型不符(E3 / E1)。所以实际用法照旧是按需 use 具体模块。这也说明那个「三处静默错编」的修法解决的是找得到,不是合得起来

alpha 系列到此为止。Pre1 的这两条是给别人用这门语言的口子,之后语言面不再改——所有触及冻结面的改动从此要走 docs/158 §5 那套流程。

还没过的那一项

源代码公开不等于第三方审计过了。M100 仍是未达:门禁侧齐了——一条 tools/loment_audit.py 跑完 24 条主张并落盘证据;缺的是第三方复核本身,而这件事作者无法自证。审计包在 docs/160,里面有主张、不主张、复核步骤与对抗性尝试。100 个里程碑口径下完成 96 个、部分 2 个、未达 1 个、未开始 1 个。

另外一条边界:Lompi 是另一个仓库github.com/FujoJTOP/lompi)。它随 Loment 的包一起安装,是 Loment 库的包管理器,但不是 Loment 官方工具——loment help 里没有它,也不转发给它。

接下来: 想现在就上手,见 快速上手;FFI 的完整设计见 docs/173,这一版的变更清单见 docs/174;库与包管理见 库系统Lompi