豫言操作系统总体架构
2026-10-13 修订。本篇写豫言操作系统现行的架构与定下的方向。两层接口的逐条规范以仓库根目录的 豫寓榫卯/ 与 豫寓底榫卯/ 为准,格式细节见文末所列的提案与规范。文言本见文言版。
一、要点
- 豫言写到底。 编译器、执行器、内核、驱动、构建与验证工具都用豫言写成;从源码到机器码与可执行文件,全程由豫言自己完成。
- 豫汇是执行边界。 编译器把程序编成豫汇(豫言汇编):带垃圾回收的豫汇,与不带垃圾回收的底层豫汇。各后端都从豫汇出发。
- 树码是豫言代码的统一二进制表示。 豫汇模块存成汇编树码(
。树码);编译器各阶段的中间产物与设计作品沿用同一种外框。原生后端直接读汇编树码生成机器码。 - 豫行是原生程序的格式。 豫言操作系统上的程序、工具与开机程序都是豫行文件(
。豫行),指令集有 ARM64 与 AMD64 两种。 - 网页汇编是面向网页的输出。 浏览器与云工(Cloudflare Worker)两个网页后端运行由豫汇导出的网页汇编(WasmGC);网页汇编与汇编树码一一对应。
- 两层接口,能力即授权。 应用用带垃圾回收的豫言操作系统接口;执行器内部以不带垃圾回收的豫言操作系统底层接口为窄腰。应用依赖的能力一律必需,运行时的资源授权另行核对。
二、总览
| 层 | 原生(豫言操作系统与桌面系统) | 网页(浏览器、云工) |
|---|---|---|
| 源程序 | 豫言程序(。豫) |
同左 |
| 编译器前端 | 解析、名称解析、类型检查、类型擦除、跨模块优化、闭包转换 | 同左 |
| 执行边界 | 豫汇,存成汇编树码(。树码) |
豫汇 |
| 后端 | 裸机后端:预编二、寄存器降级(ARM64、AMD64)、写出器 | 网页汇编编码器 |
| 程序形式 | 豫言操作系统上是豫行(。豫行);macOS、Linux、Windows 上是编译器直出的 Mach-O、ELF、PE |
网页汇编模块(.wasm) |
| 运行时 | 执行器(客体二号):垃圾回收、原语、装载单元、平台层 | 随模块生成的回收运行时,加宿主胶水 |
| 进入系统 | 豫言内核服务;libSystem;Linux 系统调用;kernel32 | 浏览器接口;Worker 接口 |
三、树码
树码(提案 00001)是豫言代码的统一二进制表示。文件以“树码”二字的 UTF-8 开头,文件头写明版本与种类,正文按该种类的结构表编码。现行的种类:
- 汇编树码:一个豫汇模块。编译器的输出路径以
。树码结尾时写出它。执行器以执行器。树码随工具链发布,原生可执行文件与豫行文件都直接从汇编树码生成。 - 编译器的中间产物:各阶段的结果存在构建缓存里,供增量构建与链接取用。
- 设计二进制(
。设计):设计作品沿用树码的外框,播放器装载时验证。
四、豫行
豫行(提案 00005,豫行格式)是豫言操作系统的可执行格式。
- 文件:64 字节的文件头(魔数“豫行”、指令集、入口、栈顶)、段表与附录;段内容按页对齐,装载时直接映射。
- 生成:编译器从豫汇直接写出两种指令集的豫行;普通程序、工具、开机程序与底层程序共用同一个段表生成器。
- 装载:内核按段装载开机程序;子程序由父任务的执行器读入豫行,再交内核“按段建任务”。
- 装载单元:脚本运行模式(提案 00003)沿用豫行的外框,每个模块编成一个单元,含模块元数据、预编机器码、重定位与符号。壳里的每句豫言编成一个组单元,装入即执行。
- 系统里的工具链:
/工具下的豫构、编译器、豫言系统、格式化都是豫行,执行器。树码随盘提供。
五、编译与执行
源码 → 前端 → 豫汇(汇编树码)
├─ 预编二:带垃圾回收的函数转成底层函数,并入执行器
│ → 寄存器降级(ARM64、AMD64)
│ → 写出器:豫行、Mach-O、ELF、PE、装载单元
└─ 网页汇编编码器 → .wasm(浏览器、云工)
- 执行器(客体二号)用底层豫言写成:垃圾回收、实现豫言操作系统接口的原语、装载单元、各平台的平台层。程序代码全部预编成机器码执行。
- 机器码由豫言里的字段化构造函数直接编码,逐项核对寄存器号、立即数范围与位域。macOS 上的可执行文件带特设签名。
六、两层接口
- 豫言操作系统接口(
豫寓榫卯/):应用面,带垃圾回收,是纯规范:。接口。豫里的函数由宿主提供,。应用接口。豫里的函数由应用提供。宿主函数编成带类型的导入,装载时核对接口身份、版本与签名。 - 豫言操作系统底层接口(
豫寓底榫卯/):执行器内部的窄腰,不带垃圾回收,值只有整数,每个函数返回状态码;豫言操作系统、macOS、Linux、Windows 各有一个后端。 - 适配(
豫言操作系统/适配/):各宿主上的接口实现,用豫言写在宿主库之上,并附宿主支持清单。
七、豫言操作系统
- 内核与驱动:豫言内核用底层豫言写成,ARM64 与 AMD64 共用。驱动同样两架构共用一份,覆盖 NVMe、AHCI 与光驱、USB 存储与键鼠、virtio 与英特尔千兆网卡、声卡。
- 任务与内存:多核、多任务,每个任务有独立的地址空间;物理内存按 2 MiB 块分配与交还。
- 存储与网络:数据盘是标准 ext4;网络栈有 IPv4、TCP、UDP 与 DHCP。
- 壳:开机程序就是豫构的交互模式,壳的语言就是豫言;
。脚本。豫与交互输入由同一个运行器处理。全系统只有一个壳:改变状态的动作经壳命令发出,图形程序按状态显示。 - 桌面:平铺桌面,每个窗口是独立的任务。
- 系统内工具链:系统里能构建程序、运行脚本并造出启动光盘,造出的光盘与宿主上造的逐字节相同。
- 引导与安装:自有 UEFI 引导;启动光盘能把系统安装到内部磁盘。
- 运行环境:QEMU(ARM64 可用 macOS 的硬件加速)、VMware Fusion 与 UTM。
八、各宿主
| 宿主 | 程序形式 | 进入系统 |
|---|---|---|
| 豫言操作系统(ARM64、AMD64) | 豫行 | 豫言内核服务 |
| macOS(arm64) | 编译器直出的 Mach-O,带特设签名 | libSystem |
| Linux(x86-64、arm64) | 编译器直出的静态 ELF | 系统调用 |
| Windows(x64、arm64) | 编译器直出的 PE | kernel32 |
| 浏览器 | 网页汇编 | 浏览器接口与宿主胶水 |
| 云工(Cloudflare Worker) | 网页汇编 | Worker 接口与宿主胶水 |
各宿主对同一程序给出相同的接口语义,由一致性验证保证。
九、工具链与自举
- 豫构是唯一的构建工具:包发现、检查、构建、类型检查、测试与仓库目标;它自带编译器。
- 原生自举:一级原生豫构编出二级、三级,两级逐字节相同即为定点,再装成日常用的工具链。
- 发行:每个平台一份原生工具链包;豫言操作系统的启动光盘带上豫行工具链。
十、后续版本的事项
- 同一个豫行通行各宿主(提案 00021,讨论中):豫行的内核服务经服务门调用;macOS、Linux、Windows 上的启动器在进程内把服务翻译成宿主的系统调用;启动器可以自带豫行,合成单个可执行文件。工具链随之以“豫行加启动器”发布与自举。
- 树码的新种类:着色器树码;云端存放的签名与链接单元。
- 实机:按明确的机型逐步验证驱动与安装。
延伸阅读
- 提案 00001 统一二进制表示:树码。
- 提案 00005 自有可执行格式与豫行格式:豫行。
- 提案 00003 脚本运行模式:装载单元与壳。
- 提案 00021 豫行跨平台运行:服务门、启动器与单文件发行。
- 豫言操作系统接口总纲与豫言操作系统底层接口总纲:两层接口。
- 豫言裸机说明:内核、执行器与验证。