路二(直接生成原生二进制)在 Linux 上的最小闭环样例,底层模式。程序写一行“你好”,从标准输入读至多 64 字节并原样写出,最后以退出码 7 结束。写、读、退出直接发 Linux 系统调用:导入模块名为 Linux,导入名就是系统调用名(write、read、exit_group),寄存器降级按入口表生成系统调用桩,地址类参数在进入系统前加上线性内存基址。
构建与生成(在仓库根目录):
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 原生你好 --输出 yy原生你好.wasm -j 24
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 豫言裸机 原生生成 --输出 yy原生生成.wasm -j 24
YY_GC_INITIAL_HEAP_SIZE_MB=512 node 豫言操作系统/宿主/节点/宿主.cjs yy原生生成.wasm Linux 臂六十四 yy原生你好.wasm yy原生你好臂
YY_GC_INITIAL_HEAP_SIZE_MB=512 node 豫言操作系统/宿主/节点/宿主.cjs yy原生生成.wasm Linux 兼容六十四 yy原生你好.wasm yy原生你好兼
产物是静态 ELF64 可执行文件,在 Linux arm64 与 x86-64 上直接运行,不依赖任何动态库。
原生生成 目前由原生运行时执行,初始线性内存按 64 KiB 一页整块分配,须用环境变量放大初始堆。
在 macOS 上可用 Docker 验证(FROM scratch 镜像,只含这一个文件):
printf 'FROM scratch\nCOPY --chmod=755 yy原生你好臂 /hello\nENTRYPOINT ["/hello"]\n' > Dockerfile
docker build --platform linux/arm64 -t yy-hello .
printf '回声\n' | docker run --rm -i --platform linux/arm64 yy-hello; echo $?
应输出“你好”与“回声”两行,退出码 7。x86-64 换成 yy原生你好兼 与 linux/amd64。
macOS 版
苹果入口。豫 是同一程序的 macOS 版:写、读、退出经 libSystem 的 write、read、exit(导入模块名为“苹果”),生成的 Mach-O 位置无关、由 dyld 绑定导入槽、带特设代码签名,可在本机(arm64)直接运行:
node 豫言操作系统/宿主/节点/宿主.cjs yy豫构.wasm 构建 原生你好 苹果入口 --输出 yy原生你好苹果.wasm -j 24
YY_GC_INITIAL_HEAP_SIZE_MB=512 node 豫言操作系统/宿主/节点/宿主.cjs yy原生生成.wasm 苹果 臂六十四 yy原生你好苹果.wasm yy原生你好苹果
chmod +x yy原生你好苹果
printf '回声\n' | ./yy原生你好苹果; echo $?
Linux 版的生成命令相应为 node 豫言操作系统/宿主/节点/宿主.cjs yy原生生成.wasm Linux 臂六十四 …。