豫言操作系统总体架构
状:架构与施行之案,二〇二六年九月二十八日审定。本篇为豫言操作系统之总览,代统一接口方案(九月二十五日)与底层接口方案(九月二十六日)中与之相违者,相违之目见第十四节;二接口逐条之规,仍以语言仓库根目录 豫言操作系统接口/ 与 豫言操作系统底层接口/ 二规范树为准。文中以【已成】【半成】【待为】标其成熟;数皆二〇二六年九月二十八日所计所测。审定之时依审阅之议修之:编译器唯存 Wasm 一后端,C 后端提于 WP1 而删;构建之器合为豫构一器;以原生为常用运行之方,Node 为备。述其志之篇见豫言操作系统之志;汉语本见汉语版。
一、旨与则
豫言操作系统者,有版之程序装载、执行与系统能力之约,及行此约之宿主与系统也。其旨:使同一中文程序,于浏览器、云端 Worker、Windows/macOS/Linux 之桌面,及吾自造之裸机,得同一接口之义。
则六,前五既定,第六乃本篇所立运行之阵:
- 豫言为先。 编译器、运行时、垫层、平台后端、构建与验证之器,皆以豫言书之。非豫言之码,唯留于宿主环境所必自供者(浏览器与 Node 之 JavaScript 外壳),且渐减之。
- Wasm 为执行之通界。 豫言应用、编译器、执行器自身皆经 Wasm;不复别立绕 Wasm 之原生之途以为终。
- 编译器唯一后端:Wasm。 不生 C,不赖 LLVM、clang、外部汇编器、外部链接器与 libc,不用 Wasmtime。今之 C 后端与 C 运行时,宜早删之(第十二节 WP1);既删之后,路二之预编未成之前,开发之工具链以 WasmGC 之形行于 Node。
- 接口二层,束其腰。 应用之面用有 GC 之“豫言操作系统接口”,平台之面用无 GC 之“豫言操作系统底层接口”;每平台唯实现底层接口一次。
- 能即授。 应用所依之能力包皆必具;接口之实现与本次运行之资源授权,分而核之;宿主之 API 虽多,不尽示于程序。
- 每商用平台,运行之路二,以原生为常。 路一:Node.js、吾跨平台之 Wasm、一 JS 文件;路二:吾所径生之原生二进制,AMD64 与 ARM64 二指令集,用各平台正当之系统调用。路二既通,则为常用之方;路一为备,路二未通之前亦用之。
二、总览
自上而下,一程序所经之层:
| 层 | 路一(JS 之路) | 路二(原生之路) |
|---|---|---|
| 源程序 | 高级模式(有 GC)之豫言程序 | 同左;又可行外来工具链所出之 WASI 程序 |
| 编译器 | 豫言自托之编译器:源码 → 类型检查 → 统一 ANF → Wasm 模型 → 标准 .wasm |
同左 |
| 程序之形 | WasmGC 模块 | WasmGC 模块;或 WASI 模块 |
| 应用之面之接口 | 豫言操作系统接口(GC 接口),能力包五十二 | 同左;WASI 程序用 WASI preview1 |
| 实现者 | JS 宿主:浏览器、Node.js、Cloudflare Worker | GC 垫层与 WASI 垫层,与执行器同为豫言底层模式之程序 |
| 平台之面之接口 | 无:JS 宿主径用 JS 环境之 API | 豫言操作系统底层接口:包六,函数四十五,三十二位整数,状态码 |
| 入操作系统 | JS 引擎任之 | Linux 径发系统调用;macOS 导入 libSystem;Windows 导入 kernel32 与 ntdll;裸机呼自造内核之服务 |
| 机器码 | JS 引擎任之 | 吾径生 ELF、Mach-O、PE 或裸机之像,AMD64 与 ARM64 |
观表之要:
- 编译器唯出标准 Wasm。有 GC 之程序出 WasmGC,底层模式之程序出唯含三十二位整数之 Wasm。
- 路一行于有 JavaScript 引擎之处:桌面用 Node.js,网页用浏览器,云端用 Cloudflare Worker。JS 宿主径实现 GC 接口,不经底层接口。
- 路二不须任何运行时:执行器(垫层)与平台后端合编为原生二进制。GC 程序经 GC 垫层,WASI 程序经 WASI 垫层,皆落于底层接口,乃由各平台后端发真系统调用。
- 二层接口不相依,亦不越级:应用不径呼底层接口;底层接口之用者,唯 GC 垫层与 WASI 垫层二者。
三、运行之阵:二路乘诸平台
| 平台 | 路一:Node.js+跨平台 Wasm+JS 文件 | 路二:自径生之原生二进制 |
|---|---|---|
| Windows | 【待为】Node 宿主之适配 | 【待为】PE32+,x64 与 ARM64,导入 kernel32/ntdll |
| macOS | 【待为】Node 宿主之适配 | 【待为】Mach-O,x86-64 与 arm64,导入 libSystem,附代码签名 |
| Linux | 【待为】Node 宿主之适配 | 【待为】ELF64,x86-64 与 arm64,径发系统调用,静态而无 libc |
| 裸机(自有之系统) | 无 | 【已成,唯 QEMU】ARM64 与 AMD64,内核与用户态皆豫言所生 |
| 浏览器 | 【已成】能力包二十有适配 | 无 |
| Cloudflare Worker | 【已成】能力包三十三有适配 | 无 |
二路之义:
- 路一(JS 之路)。 所发者:一
.wasm(WasmGC)、一 JS 启动文件、一清单;机有 Node.js 即可行,同一.wasm通行诸平台。系统之能,由 JS 适配层经 Node 之文件、网络、进程诸 API 供之。此 JS 文件乃 GC 接口之宿主适配,非底层接口之后端。 - 路二(原生之路)。 所发者:原生可执行文件,用者之机不须 Node 或任何运行时。按“操作系统 × 指令集”各出其一,凡三乘二为六,外加自有之裸机。二进制中含执行器与平台后端,后端用其平台正当之入系统之门:Linux 径发系统调用;macOS 与 Windows 无恒定之调用号,由系统库之导入表(第六节)。所发之形有二,出于同码(第四之四):原生宿主,运行时装外来之
.wasm,亦能装合其所支特性之第三方标准模块;独立可执行文件,封程序于宿主之副本,一文件即可行。
常与备。 路二既通,乃为常用运行之方,用者之程序与吾开发之工具链皆然;路一为备,用于路二未通之前、无其原生二进制之平台,及须对照察误之时。
二路于同一程序,须给同一接口之义,以一致之验保之(第十节)。
四、编译与程序之表
四之一 前端之流【已成】
编译器以豫言自书(自托)。前端逐文件:解析、名称解析、类型检查、类型擦除、跨模块优化、闭包转换,得“闭包形式”。诸段依相依之序并行派之。闭包转换之后,全模块构统一 ANF(统一之中间表),乃授 Wasm 后端生 Wasm 模块。
四之二 唯一之后端:Wasm
编译器唯一后端,出标准 Wasm。语言之模二(第四之三),共用同一中文 Wasm 模型与二进制编码器:
| 模 | 何以择之 | 所出 | 状 |
|---|---|---|---|
| 高级模式(缺省) | 包描述不书编译模式;今犹须加 --target=wasmgc |
统一 ANF → 内存中之 Wasm 模块 → 径编为 .wasm 二进制(WasmGC),含豫言所书之垃圾回收运行时;不经 WAT 之文,不呼汇编器;须宿主支 GC、异常处理与尾调用;对外唯一导入 yuyan:gc-host/v1.call |
【已成】 |
| 底层模式 | 包描述书 「编译模式」者『底层』也。 |
闭包前之优化形式 → 唯含三十二位整数之 Wasm,不用标准库与垃圾回收 | 【已成】 |
机器码非编译器后端所出,乃路二之预编(寄存器之降,第六节)自 Wasm 生之;裸机之像即如是而得。
将删之原生后端。 今编译器之缺省目标犹为 --target=native(别名 llvm、shadow):由统一 ANF 生“直接调用”之 C 源,乃由 clang 以 -O3 -flto 编之,与预建之 C 运行时(文件四十二,约四千七百行)相链。编译器自身、豫构与诸器今皆赖之以行。至 WP1 全删之,--target 之选随之而去,编译器唯出 Wasm。
要:路一与路二用同一 .wasm。 同一 .wasm,可授 JS 宿主(路一),亦可授执行器(路二)。所异者唯“谁实现接口”,不在编译。
四之三 语言之模二
- 语言唯一,模乃包之性:
高级(缺省,有垃圾回收,可用标准库)与底层(无垃圾回收,不用标准库)。同一依赖之闭包须同一模,豫构解析包图时核之。 - 底层模式沿全部语法与类型检查,唯后端所受者寡:许整数、爻、单元、
若…则…否则、虑、于整数常量之鉴、一阶函数、自递归与尾调用(尾调用变为回跳)、函数内之可变格、外部调用之原语;不许元组、构造器、字符串、小数、异常、闭包、数组、引用类,越之则编译时报错,终不暗退于垃圾回收。诸值统为三十二位整数。 - 今底层之包十四:底层库及其示例、底层接口之规范包六、执行器
客体二号、WASI库、裸机之探针与样例库,及 WP0 将删之过渡包一。 - 底层模式代前此自造之括号式“低阶语言”;不复新造语言或领域专用之语。
四之四 路二之形与执行之二档
路二之可执行文件,乃同一豫言底层模式之程序,编为整数 Wasm,经寄存器之降与格式之书写器而得;其中次第为:平台后端(底层接口之函数四十五)、垫层二、执行器(含豫言所书之垃圾回收运行时)。其形有二:
- 原生宿主。 命令行给
.wasm之径,运行时装而行之。依《统一接口方案》既定,宿主按真导入处标准模块,不以豫言编译器之所出为唯一合法之入;导入由宿主明供之,否则装时拒之。 - 独立可执行文件。 封
.wasm于宿主之副本(附为数据段),得一文件。此唯移字节,不须编译。他日 AOT 既成,机器码亦并封之。
执行分二档,使路二速成闭环,而终及原生之速:
- 甲档:解释而行。 执行器逐条解 Wasm。此裸机上已验之形(
客体二号),用为正确之准。 - 乙档:预先编译(AOT)。 编 WasmGC 程序为目标之机器码,与 GC 运行时、平台后端合链为一二进制,无解释器。此为终,亦路二中最巨之役(WP8);先预编,后即编(JIT)。
《系统编程语法方案》分全途为五段,今之所至如下:
| 段 | 事 | 状 |
|---|---|---|
| A 统一之表 | 中文 Wasm 模型、文本读写、二进制编解与验 | 【已成】 |
| B 最小执行器 | 豫言所书、择子集之解释器 | 【已成】(客体二号) |
| C 自有预编 | 编 Wasm 为机器码,不须外部汇编器与链接器 | 【半成】唯整数子集,ARM64 与 AMD64 |
| D 托管与系统之能 | 覆今豫言所需之 WasmGC 等特性与宿主之服务 | 【半成】解释一子集 |
| E 独立自举 | 编译器与执行器皆经 Wasm 而生,前代预编后代,禁 clang、cc、as、ld 与 libc 而犹能自举 | 【待为】 |
今生裸机之像之生成器,犹由 C 后端构之;经 Wasm 行之之途,亦犹借 Wasmtime 宿主。故“客体不赖 LLVM 与 libc”,非“全工具链已独立”也。WP1 之后,生成器以 WasmGC 行于 Node。
五、接口二层与垫层二
五之一 豫言操作系统接口(GC 接口)
- 仓库根目录
豫言操作系统接口/,纯源级之规:唯接口包、纯声明与规之文;。接口。豫之函数宿主供之,。应用接口。豫之函数应用供之,其向以文件之后缀定。 - 【半成】凡能力包五十二,函数签名二百六十七,以能分五组:初六包(基础、启动、网页服务、文件、网络、显示);浏览器之页(界面、文树、消息、事件、定时、储存、导航、环境、请求、事件源、编译、应用,及剪贴板);跨宿主之器(时间、随机数、日志、文字规整、网址、网址定位、网址查询、密码摘要、口令派生、压缩);服务端 HTTP 与凭据(入站、答复、转发、事件流、上游、授权服务、服务状态、环境文字、秘密文字);持久与编译(持久事务、告警、独占、频道,命名持久服务,关系查询与数据库,对象存储,消息队列,定时事件,邮件发送,编译运行,隔离运行,平台资料)。
- 豫言之类型系统为规,WasmGC 唯其下投之影。Wasm 层今唯一通用之导入
yuyan:gc-host/v1.call(随需而增之外调之道,不冻)与一导出_start。 - 装载之规:阙一包,或版与签名不合,即装载败;版须全等;依赖皆必具,授权另核。
五之二 豫言操作系统底层接口(无 GC)
- 仓库根目录
豫言操作系统底层接口/,亦纯规。规【已成】,实现今唯裸机后端。包六,函数四十五:基础十一、句柄十三、文件九,三者为核;网络七、终端二、进程三,为可选,平台无之则返五十八(不支)。 - 值唯三十二位整数,数据以(址,长)与出址传之,每函数返状态码;状态码取 WASI preview1 errno 之子集,号不改。记录之布(状态块、目录项、订阅、事件)沿 WASI。
- 柄即能:初授者,启动时所预开之目录;路径皆相对于目录之柄,不得出其子树,越则返七十六。
- 无全局之“当前目录”“路径规整”“HTTP”“JSON”,此皆垫层以豫言为之,不入后端。首版单线,不含显示与输入,不含 HAL。
- 用者唯二:GC 垫层与 WASI 垫层。应用不径呼之。
五之三 垫层二
| 垫层 | 所入 | 所出 | 状 |
|---|---|---|---|
| GC 垫层 | 豫言 GC 程序经 yuyan:gc-host/v1.call 所发之系统原语七十二 |
底层接口之呼 | 【半成】原语在 客体二号/主机*.豫;控制台之出(一至四号)已改经底层接口,余犹径呼内核 |
| WASI 垫层 | 外来工具链(C、C++、Rust 等)所出之 WASI preview1 程序 | 底层接口之呼 | 【待为】WASI库 已有,然未接,不保可用 |
垫层以豫言底层模式书之,与执行器同一编译之单元。GC 值与线性内存间之搬运,于垫层中为之:GC 字节数组之内容本在执行器之内存,可径以(址,长)授底层接口。
五之四 一呼何以穿诸层
以“印一行”为例:
| 步 | 路一(Node) | 路二(Linux 原生) |
|---|---|---|
| 应用 | 呼日志或标准库之印 | 同左 |
| 适配 | 豫言所书之适配包,落于宿主库之外调名 | GC 垫层原语一 |
| 宿主 | Node 适配层之 JS 呼 process.stdout.write |
底层接口 写(柄一, 址, 长, 出址) |
| 系统 | Node 与 V8 | Linux 后端发 write 系统调用 |
六、路二:径生原生二进制
六之一 流水
底层模式(或经垫层之执行器)所出之整数 Wasm → 寄存器之降(指令之择与寄存器之分,ARM64 与 AMD64 二后端,【已成】用于裸机)→ 可执行文件之书写器(ELF、Mach-O、PE,【待为】)→ Apple 平台之代码签名(【待为】)。全程豫言之码,不呼任何外器。机器码由豫言中分字段之构造函数径编字节,核寄存器之号、立即数之域与位域,不书英文汇编之源。
六之二 诸平台何以入操作系统
后端与操作系统之间,唯一入口之表:此乃数据,非码。
| 能 | Linux(系统调用) | macOS(导入 libSystem) | Windows(导入 kernel32/ntdll) | 裸机(内核之服务) |
|---|---|---|---|---|
| 时钟 | clock_gettime | clock_gettime_nsec_np | QueryPerformanceCounter、GetSystemTimePreciseAsFileTime | 滴答与墙钟之服务 |
| 随机 | getrandom | getentropy | BCryptGenRandom | 熵源未定 |
| 读写与位 | read、write、pread64、pwrite64、lseek | 同名之 POSIX 函数 | ReadFile、WriteFile、SetFilePointerEx | 控制台之服务与执行器内之文件系统 |
| 开与径 | openat2 加 RESOLVE_BENEATH、newfstatat、mkdirat、unlinkat、renameat、readlinkat、getdents64 | openat、fstatat 等 | NtCreateFile(RootDirectory)、NtQueryDirectoryFile | 执行器内之文件系统 |
| 候 | ppoll | kevent、poll | WaitForMultipleObjects | 内核之时钟与邮箱 |
| 进程与管 | clone/execve、wait4、pipe2 | posix_spawn、waitpid | CreateProcessW、CreatePipe | 执行器之复制任务与装载 |
| 退 | exit_group | exit | ExitProcess | 退出任务之服务 |
- macOS 与 Windows 何以由库导入。 Apple 不保系统调用之号恒定;Windows 之调用号随版而易。二平台所支之门乃系统库,故书写器必能生 Mach-O 与 PE 之导入表;此非赖 libc,所导入者唯操作系统自有之入口符号。Linux 有恒定之系统调用接口,径发之可也。
- 路径之编。 接口皆 UTF-8;Windows 之路径乃 UTF-16,转之于后端。
- 越界之防,后端中最厚者。 Linux 有一举而成之
RESOLVE_BENEATH;macOS 之同类标志因版而异,Windows 无之,后端须逐段解径而拒其越。此处最易生安全之患,须专验之。 - 线性内存。 Wasm 线性内存映于向系统预留之一段虚址(
mmap或VirtualAlloc),增则提交其页;内存之增乃语言之指令,代码生成任之,非接口之函数。 - 进程之入。 书写器生入口之码:Linux 自初栈读参数与环境,macOS 与 Windows 经系统库取之,乃交底层接口之“取参数块”“取环境块”。
六之三 GC 程序何以行于路二
有 GC 之程序编为 WasmGC,由执行器行之:先解释(正确之准),后预编(AOT,编 WasmGC 为机器码;运行时之垃圾回收器亦以豫言底层模式书之)。每隔离执行之域,各有托管之堆与根,回收行于用户态。裸机上之 客体二号,即此执行器之初版,今唯覆 WasmGC 之一子集(不验模块,不支 SIMD)。欲编译器自身亦行于路二,须覆其所用之全部 WasmGC、异常与尾调用之特性。AOT 与全 WasmGC,乃路二中最巨之役(第十二节)。
既有之原生 C 运行时(约四千七百行),乃同事之旧实现:自有垃圾回收器与系统之操作,然唯受豫言源经 C 所编之程序,不能装任意 Wasm。至 WP1 随 C 后端而删;路二之垃圾回收运行时,以豫言底层模式重书之(WP8)。
七、裸机之系统:吾自造之操作系统
【已成,唯行于 QEMU,未上真机】
- 引导。 ARM64 自造 ELF64 之头,于 EL1 建页表,乃
eret入 EL0;AMD64 由 Multiboot,入长模式后落于 Ring 3。今唯以 QEMU 径装内核。 - 内核。 机器字节由豫言源径生,不用汇编器与链接器;用户之码乃 Wasm 整数核经寄存器之降所得之机器码,二架构同一遍历。
- 内核之服务。 号零至二十七,凡二十八:控制台之写字节与读字节;验收之核验与完成;入用户态;时钟之滴答;任务之号;用户之陷;任务之状与退出码;候、终止、复制、回收任务;发、收消息,问其来源与候消息;退出任务;设备配置之读与寄存器之读写;内存块之分与计;搬入、搬出静态区;墙钟之秒;中断之问。ARM64 用
svc,AMD64 用int 0x80。 - 内存与隔。 二兆大页,每任务各一页表,动态块之池三十二、各二兆;设备 DMA 以 SMMUv3 与 VT-d 隔之。W^X 未成。
- 任务。 任务之槽二,每秒百次抢占轮转,任务之柄带代际;支复制、候、终止、回收;任务间之通,唯一三十二位邮箱加阻塞之收;有故唯终当前之任务。
- 执行器
客体二号。 底层模式之豫言程序,约一万六千行,值皆三十二位整数;解释 WasmGC 之子集,自实现系统原语七十二(其五十四号未成),向内核导入服务二十(平台十五、块设备五)。装载之窗四百四十八 KiB,盘上之程序至多四 MiB,经复制任务原地重启,可多实例;不验模块。 - 存储与终端。 用户态之 Virtio 块设备驱动,双区追加日志之文件系统;输入之环与 Ctrl-C;命令壳本身乃一寻常豫言程序,支文件之操作、运行程序、重定向、管道、环境变量与脚本。
- 限。 任务之槽唯二,故一时唯一子进程;不支 SIMD;唯于 QEMU 之 TCG 单核一百二十八 MB 之配置验之。
- 与底层接口之系。 裸机后端
裸机底层*(函数四十五)已成而验,其十五返“不支”;客体二号与此诸模块已解其相依,GC 垫层之改接方始。
八、路一:JS 宿主
- 浏览器【已成】:前端之主,能力包二十有适配,已于 Chromium 152 逐项验之(百五十五例)。无 JSPI 之浏览器(如 Safari),唯能行但用同步之能之程序;候网络、DOM 事件或流之界面程序,犹须另解异步之续行。
- Cloudflare Worker(云工)【已成】:服务端之主,能力包三十三有适配;其验限于 Node 之拟与本地 workerd,云端之行犹待验。
- Node.js【半成】:今唯编译器自举所用之 V8 宿主(
宿主/节点/),无说明之文,亦无装载之核,接口唯验基础之样。WP1 之后至 WP8 之前,为开发工具链之运行环境;WP8 之后工具链常用原生二进制,Node 存以为备。欲为路一之桌面宿主,必补文件、网络、时间、随机数、日志、环境文字、密码摘要、网址等能力包之 Node 适配、宿主支持之单、装载之核与一致之验(第十二节)。 - 适配之制【已成】:适配包以豫言书于宿主库之上;每宿主附人手所维之“宿主支持单”,每应用附检查器所生之“应用要求单”,单含身份、依赖之闭包、向、签名与规之摘要;启动前之装载之核,要二单相等,并核 Wasm 之唯一导入与
_start之导出。逐函数是否真通,赖运行之验。
九、工具链、自举与发行
九之一 包与构建【已成】
- 万物皆包。 包之身份由“所有者+名称”定;包描述
名。包。豫必具名称、所有者、版本、简介、说明、类型,依赖随需,唯指向库,无远程之仓,亦无锁文件。每包必附双语之“包说明”,阙则构建报错。唯可导入自身与直接依赖;可执行包不可被依;依赖不得成环(标准库 → 构建基础/癸象工具 → 编译器核心 → 包配置 → 豫构)。 - 构建之器:今有二,将合为一。 今
豫构司包之发现、检查、构建、类型检查与自举包之导出;仓库构建乃昔代根 Makefile 与运行时 Makefile 之构建程序,司 C 运行时、编译器自举之链、构豫构自身、试与打包;云仓又有同类之云仓构建。三者共用构建编排之库,以并行调度与缓存。仓库构建所以别立者,主为编排 C 运行时与原生自举之链此类“非包”之步。WP1 删 C 后端,其故多消,故于 WP1 并之入豫构:自举、试、打包为豫构之令;仓所特有之多步编排(如官网之构、裸机之验)书为由豫构编而行之目标包(第十三节 D11),云仓构建依此改书。仓中仍无 Makefile 与 shell 脚本。 - 缓存。 编译之缓存在
.yybuild/下,随编译器可执行文件之改时而分;仓库构建目标之印,按所入之改时而判。同一缓存,同时唯一构建。
九之二 自举之链【已成】
yy_bs_stable(稳定之种)→ yy2_bs → yy3_bs → yy4_bs;yy3_bs 与 yy4_bs 逐字节相同,即为定点。改编译器而或影响所生之义者,必行全自举。首级必串行,其后可并行。
今此链上者,乃 C 后端所出之原生程序,全自举约十分,其时多耗于 clang。WP1 删 C 后端之后,同链改以 .wasm 行于 Node,以 .wasm 逐字节相同为定点。性能研究之录:Wasm 编译器于 Node 上冷缓存自编一代约二十秒,二代与三代逐字节同(二〇二六年九月二十六日前后屡测,未清系统页缓存)。路二之预编既成,乃以之编编译器为原生二进制(WP8),自此常用原生编译器,Node 上之 Wasm 版为备。
九之三 种与起步
| 起步之方 | 所含 | 所须 | 状 |
|---|---|---|---|
| Wasm 工具链之包 | 编译器、豫构、仓库构建之 WasmGC 模块三,加 Node 宿主与值桥。CI 每轮发之,按提交号存档;主 CI 以定址与 SHA-256 取之 | Node.js;今犹须 clang,以构 C 运行时与原生之产 | 【已成】 |
| Linux 可执行程序之包 | 稳定编译器、稳定豫构与运行时之档 | Linux x86-64;编新程序犹须 clang | 【已成,WP1 删之】 |
| 可移植自举之包 | 双种之 C 源、运行时与构建脚本 | 唯须 clang | 【已成,CI 已停发;WP1 删之】 |
| 唯一之种 | WP1 之后唯存此 Wasm 工具链之包,行于 Node;WP8 之后,Node 上之 Wasm 编译器又能径出路二之原生二进制,自举之链可续于原生二进制 | 唯须 Node.js 与一 SHA-256 所定之压缩包,不复须 clang | 【待为】(WP1) |
Node 于此为种之运行环境,亦路一之宿主;乃备用之方,非产品之所依,路二之二进制皆不须 Node。
九之四 所发之物
| 所发 | 所含 | 状 |
|---|---|---|
| Wasm 工具链之包 | 见上表 | 【已成】 |
| 路一之发行包 | 一 .wasm、一 JS 启动文件、一清单 |
【待为】(WP9) |
| 路二之发行物 | 每“操作系统 × 指令集”一可执行文件,凡六,又有裸机之像 | 【待为】(WP3 至 WP6);裸机之像【已成,QEMU】 |
工具之产,名皆以 yy 始或以 .exe 终,版本之管据此忽之。
九之五 非豫言之码:计与所归
二〇二六年九月二十八日之计(git 所跟之文件):
| 类 | 规模 | 所归 |
|---|---|---|
原生 C 运行时 豫言操作系统/宿主/原生/运行时/ 及其试 |
文件四十三,约四千八百行 | WP1 删之 |
构建基础之包内 C(包上下文.c,存编译器之包上下文) |
文件一 | WP1 改书以豫言 |
生 C 之后端(统一原生直生、原生链接、可移植自举包、原生根活跃分析)与 clang 之呼 |
豫言所书编译器之分 | WP1 删之 |
Wasmtime 之 C 桥(网页汇编宿主)与不入库之 yy_wasmtime_c_api |
文件四;犹为裸机之像之生与若干试所用 | WP1:其用者改由 Node,乃删之 |
为验底层接口而建之过渡 Wasmtime C 宿主 底层原生宿主 |
文件二 | WP0 删之 |
WASI 之样 裸机/WASI库/示例/源码 |
C 程序二十二 | 留:此乃 WASI 垫层之“外来程序”之样,非吾之实现 |
| 裸机验证之具 | C 文件二 | 留,以试外部模块 |
| 性能研究、安全外壳之包内 C | 文件十二 | WP1:改书以豫言,或移出仓;C 后端既删,彼不可复构 |
| JavaScript | 文件百十六,约二万二千行,其径含“测试”者约一万二千七百行 | 浏览器、Worker、Node 三类宿主之外壳与 VS Code 扩展必留;试具渐改书以豫言 |
| WAT | 文件二,凡四十一行 | WP1 随 Wasmtime 之桥而删 |
十、验证之制
十之一 今之验
| 验 | 所覆 | 规模 | 所耗(实测) |
|---|---|---|---|
| 裸机验证 | 内核 ABI 与执行器,QEMU 双架构 | 百九十景 × 二 = 三百八十项(又外部 C 模块四景) | 运行约七十秒至二分;构建约十五分(一五十九 MB 所生 C 文件,经 clang -O3 -flto) |
| 普通豫言验证 | 嵌 WasmGC 程序于执行器,QEMU 双架构,比串口之出与退出码 | 四十二项 × 二 = 八十四次 | 约十二分半,全串行;最重之一(AMD64 长打表)独需六十至八十五秒 |
| 全自举 | 编译器三代,三、四两代逐字节同 | 三段 | 原生约十分,段间必串行;Wasm 版于 Node 上每代约二十秒 |
| 全树测试 | 诸库与应用之单元之试 | CI 分二十片 | 本篇未测 |
| 接口检查器与一致之验 | 接口之单、装载之核;浏览器百五十五例、云工之壳三十六项加八十二项差比 | — | — |
十之二 的:全验二分之内毕
所阻者,按已测之实列之:
- 构建之迟,根在生 C。 一五十九 MB 之单文件,授 clang 为全程序之优化,单线,不可并行。WP1 删 C 后端,此项立消:诸器改以
.wasm行于 Node,不复经 clang。 - 运行器串行。 普通豫言验证之主循环,于每试依次:编探针、行 ARM64、行 AMD64。八十四次互不相依之运行,于十八核之机,唯用其力约百分之十八。
- 每试重付定本。 每探针起一全
yy豫构之进程(全仓包之发现);每像皆重降执行器为机器码,而诸试之间所异者,唯所嵌客体之数据段。此二者乃自代码之构与总 CPU 时(约二千四百三十四秒,系统态与用户态相当)所推,未分段剖之,施行时先测而后改。 - 要径有硬之下限。 最迟之 AMD64 一试(QEMU TCG 单线)约需一分,任何并行不能压其下;或减其试之工,或受其限。
- 超时之预算太紧。 每次 QEMU 运行限六十秒(千二百 × 五十毫秒),机忙时最迟之试恒超时,而“首败即全止”使全验若坏。
- 自举之链天然串行。 三段相依。原生版约十分,不能容于二分;以 Wasm 版每代约二十秒推之,全自举约一分,可容之(待 WP1 实测,又见第十三节 D4)。
设计:验分二级。快检(的在二分内):类型检查、按所改之域择试、并行之 QEMU 冒烟;全验:自举、全量双架构与二路一致,许其久,然亦须并行、缓存与可增量。
十之三 一致之验之骨
【待为】以豫言底层模式书接口一致之试,每能一组,于 Linux、macOS、Windows 与 QEMU(ARM64、AMD64)上所出须逐字相同;GC 接口适配一致之例,既行于路一之宿主,亦行于路二;WASI 之样二十二 C 程序,其出与退出码须与 Node 自带之 node:wasi 逐字同。试亦即接口之规样。
十一、今状总表
| 事 | 状 |
|---|---|
| 语言与编译器:自托、自举定点、Wasm 工具链之包 | 【已成】 |
| 编译器径书 WasmGC 与整数 Wasm 之二进制(不经 WAT) | 【已成】 |
| 中文 Wasm IR、ARM64 与 AMD64 寄存器之降 | 【已成】(用于裸机) |
| GC 接口:五十二包之规,浏览器二十包、云工三十三包之适配 | 【半成】 |
| 底层接口:六包四十五函数之规 | 【已成】 |
| 裸机后端与裸机之系统 | 【已成】(唯 QEMU) |
| GC 垫层改接底层接口 | 【半成】(唯控制台之出) |
| WASI 垫层 | 【待为】(WASI库 未接) |
| Linux/macOS/Windows 原生后端与可执行文件之书写器 | 【待为】 |
| 代码签名(Apple) | 【待为】 |
| WasmGC 原生之行(AOT)与豫言所书之 GC 运行时 | 【待为】 |
| Node 为路一之桌面宿主 | 【半成】 |
| 唯一后端:删 C 后端、C 运行时、clang 之呼与 Wasmtime 编译宿主之器 | 【待为】(WP1) |
| 唯一构建之器:仓库构建与云仓构建并入豫构 | 【待为】(WP1) |
| 全系统之验二分 | 【待为】 |
今实可用之运行之方:
| 方 | 说 |
|---|---|
| 浏览器、Cloudflare Worker | 路一之二 JS 宿主,产品之用中 |
| 原生(C 加 clang) | 迁移之旧途:豫言编为 C,乃由 clang 编为本机程序。编译器自身、豫构与诸器皆赖之以行。WP1 删之,不在目标之阵 |
| Node 上之 Wasm 工具链 | 编译器、豫构、仓库构建之 WasmGC 版,用于 CI 起步;WP1 之后为唯一之工具链。亦路一之雏形,然尚无应用之适配 |
| QEMU 上之豫言裸机系统 | 路二于自有系统之形,双架构,已能行命令壳与 WasmGC 子集之程序 |
代码之规模(二〇二六年九月二十八日,git 所跟之文件): 豫言约十五万九千行,其中编译器核心五万、标准库与底层库六千五百、余库二万九千、应用二万、裸机内核与寄存器之降一万、执行器一万六千、命令壳与其余五千六百、宿主适配包二万、接口之规一千四百。非豫言之码见第九之五:C 与头文件八十六,约九千四百行;JavaScript 约二万二千行;WAT 四十一行。JavaScript 多于 C,以浏览器、云端与 Node 三类宿主之外壳及多数试具皆 JS 也。
十二、施行之途
下列工作包依相依之序;规模以相对之量 S/M/L/XL 表之。此途已审定,按此一举施之,中途不改其途;须改则先返本篇。
| 工作包 | 规模 | 主要之事 | 验收 |
|---|---|---|---|
| WP0 对齐与清理 | S | 删离途之产:Wasmtime C 宿主与 底宿主:call 包装之包;退为之所加“Wasm 导出线性内存”之编译器改动;更旧案之状,正第十四节之违 |
仓不含新增之 C;全自举定点通 |
| WP1 唯一后端与唯一构建之器 | L | 编译器、豫构、仓库构建、全树测试、裸机验证、普通豫言验证诸器,皆改以 WasmGC 行于 Node;删原生后端(统一原生直生、原生链接、可移植自举包、原生根活跃分析)、C 运行时与运行时支持库、--target 及其原生诸选、Linux 可执行程序之包与可移植自举之包;Wasmtime 之桥与 WAT 并删;包内 C(构建基础、安全外壳、性能研究)改书以豫言或移出;云仓之原生单元之试改行于 Node;CI 不复装 clang;仓库构建并入豫构(自举、试、打包为豫构之令,仓所特有之编排书为目标包),云仓构建依此改书 |
仓不复有生 C 之途与 C 运行时;唯存豫构一构建之器;于无 clang 之机,自 Wasm 工具链之包起步,成自举定点(.wasm 逐字节同)与今之诸验;公录诸项之时 |
| WP2 目标描述之抽象 | M | 抽寄存器之降中系于“裸机”者(服务号、内存之布、入口)为目标描述:(操作系统、指令集、可执行格式、入口绑定表、内存之策) | 裸机三百八十项与八十四项之验不变,像逐字节同 |
| WP3 Linux 最小闭环 | L | ELF64 书写器(x86-64、arm64);系统调用之降;进程之入;mmap 线性内存;退出、写、读 |
“你好”二进制之出与退出码,于 Linux x64 与 arm64 通;readelf 证其静态无依 |
| WP4 Linux 后端全量与一致之骨 | L | 函数四十五;openat2 越界之防;一致之试之骨 |
一致之组于 Linux 与裸机所出逐字同 |
| WP5 macOS | L | Mach-O 书写器(arm64、x86-64):LC_MAIN、LC_LOAD_DYLIB、绑定之信、ad-hoc 代码签名;libSystem 之导入;函数四十五 |
本机 arm64 通一致之组;x86-64 经 Rosetta 或 CI |
| WP6 Windows | L | PE32+ 书写器(x64、arm64);kernel32/ntdll 导入表;UTF-16 路径;NtCreateFile 之 RootDirectory;函数四十五 |
CI 上 Windows x64 与 arm64 通一致之组 |
| WP7 垫层全改接 | L | GC 垫层文件与时钟原语之适配层(开柄、读、关;错误码之映;整数纳秒转浮点);行模式之 读 改返含换行之字节流,使“文末”与“空行”可辨;WASI 垫层接回执行器 |
今之验于改接后皆通;GC 程序于各平台原生二进制上行通;WASI 之样二十二逐字同 |
| WP8 WasmGC 原生之行与独立自举 | XL | 执行器补全 WasmGC;AOT;豫言底层模式所书之 GC 运行时;隔离执行之域;编译器经 AOT 行于路二,前代出后代 | 编译器自身之 WasmGC 模块行于路二,所出与路一逐字同;禁 clang、cc、as、ld 与系统 libc,由原生二进制成自举定点;核实际构建之呼、动态之依与未定之符号;工具链常用原生二进制,Node 版存以为备 |
| WP9 路一:Node 宿主 | L | GC 接口于 Node 之适配、宿主支持单、装载之核、说明之文;发行包(.wasm 加 JS 加清单) |
三平台上同一 .wasm 通适配一致之例 |
| WP10 验证之制 | M | 并行之运行器、像与探针之缓存、去逐试之重编;快检与全验之分级;CI 增 Windows 与 arm64 运行器 | 快检二分内;全验之时与各段公录之 |
| WP11 文档与官网 | S | 本篇、二接口之规、官网架构之页与图同步 | 双语一致;官网可访 |
相依:WP0 → WP1 → WP2;WP2 之后,WP3 → WP4、WP5、WP6 可并行;WP7 依至少一已成之后端;WP8 依 WP3;WP9、WP10、WP11 与余并行。WP10 宜早始,并于 WP1 中度 Node 上工具链之速。
姑不为:显示与输入(底层接口 v2)、线程、GPU、JIT、真机启动、HAL。
十三、所决之事
审定之时,下列诸事皆从其议。
| 事 | 所决 |
|---|---|
| D1 入系统之门:Linux 径发系统调用;macOS 由 libSystem 导入;Windows 由 kernel32/ntdll 导入 | 从之(与《底层接口方案》第十一节合) |
| D2 原生闭环自何平台始 | Linux ELF 与 macOS arm64 并行:前者格式最简,后者本机可径试 |
| D3 GC 程序于路二,先解释抑径 AOT | 解释器唯为正确之准;器类程序(编译器)必 AOT;先 AOT 后 JIT |
| D4 “二分”之口径 | 快检二分;全验(含自举)另设长之预算,然须并行、缓存、可增量 |
| D5 Node 之路最低之 Node 版与 WasmGC 特性之依 | 定最低之版,书于装载之核 |
| D6 CI 之平台 | 增 Linux arm64、macOS x64、Windows x64 与 arm64 运行器(以托管运行器实可用者为准) |
| D7 C 后端之去留与其时 | 已定:删之,编译器唯存 Wasm 一后端。其时宜在 WP1,不待预编之成:Wasm 版自举每代约二十秒,速于原生一数量级;其价,WP8 未成之前,开发工具链赖 Node |
| D8 JavaScript 之去留 | 留宿主外壳;试具先改书以豫言,终唯留浏览器、Worker、Node 三类外壳 |
D9 裸机 读 于行模式返换行否 |
返之,使读得零字节乃为文末(WP7 之分) |
| D10 路二所发之主形 | 同一宿主程序两用:可装外来之 .wasm,亦可封程序为独立可执行文件;发行以独立可执行文件为主,宿主之形用于第三方模块与动态装载 |
| D11 构建之器既合,仓所特有之构建之步书于何处 | 已定:合为豫构一器。议增一包类“目标包”:以寻常豫言依构建编排之库声明目标,由豫构编之而行于 Node;豫构自身唯内置通用之令(检查、构建、类型检查、试、自举、打包) |
十四、与旧文之系及已知之违
- 《统一接口方案》既立“桌面双宿主”(JS 加 Node,与原生宿主),并要原生宿主能装第三方标准模块;本篇沿此二者。彼书原生宿主“由 LLVM 原生后端发展而来”,并列 Wasmtime 之器之清退为后事;本篇改为:路二不经 LLVM 与 C,自径生机器码与可执行文件,Wasmtime 之器至 WP1 并删。
- 《底层接口方案》第十一节书落地之途为“待定,三择一,议 A”。本篇定为 A,并明排 B(译为 C 或 LLVM IR)与 C(任一 Wasm 引擎加薄胶)。
- 《接口总纲》“首批目标”一栏书 Node.js 与原生,实唯浏览器与云工有适配。
- 《未决事项》中“十包”“装载未成”之说已过时。
客体二号/说明.汉语.md与裸机/说明.汉语.md后于代码:验之项数(书四十一与三百七十八,实为四十二与三百八十)、导入之数、控制台改接之状,皆已变。- 版本之要“全版相等”与“唯增函数”并存,今无兼容之制;须补于版本之规。
- 《设计动机》犹书编译器“以 LLVM 为基础”生“LLVM 后端码”,与今(C 加 clang)及本篇(唯存 Wasm 后端)皆不合。
- 《统一后端迁移》所述乃以 C 为缺省目标之今状,WP1 之后须改书。
- 语言仓与云仓之 AGENTS.md、仓库构建与云仓构建之说明,皆依“构建之器二”而书,WP1 既合,须同改之。
- 《语言技术规范》所述定于提交
4cdeca11之基线;据审,其中犹含已删之 LLVM、WASI 旧后端之述,且方案之“执行约束”未依原样而成(今为包描述之编译模式)。 - 《包系统》书“平台运行时仍单独由 Make 准备”,然仓已无 Makefile,运行时由仓库构建之目标备之。《仓库包构建》依赖之序书“豫言编译器”,当为“编译器核心”。
- 裸机验证之构建,于若干情形而崩(编译器 GC 初堆不足,须设环境变量以避);普通豫言验证中最迟之 AMD64 一试,机忙则超时。
十五、名义
- GC 接口:豫言操作系统接口,有垃圾回收之应用之面。
- 底层接口:豫言操作系统底层接口,无 GC 之整数束腰。
- 垫层(shim):以一种接口译为另一种接口之一层代码;GC 垫层与 WASI 垫层。
- 执行器:行 Wasm 之程序;裸机上之
客体二号为其初版。 - 后端:于某平台实现底层接口之实现包(Linux、macOS、Windows、裸机各一)。
- 入口之表:后端与操作系统间之数据表:系统调用之号,或系统库之导入符号。
- 柄(句柄):平台所颁之非负整数,亦即能。
- 路一/路二:第三节所定运行之二路。
延读
- 豫言操作系统接口总纲:GC 接口之能力包五十二。
- 豫言操作系统底层接口总纲与调用约定:函数四十五、状态码与记录之布。
- 底层接口方案与统一接口方案:前序之设计二篇。
- 系统编程语法方案与底层模式:Wasm 之通界与无 GC 之编译模式。
- 豫言裸机说明:内核、执行器与验证。
- 豫言操作系统之志:述其志与次第之篇。