跳到正文豫言教程

仓库包构建

在仓库根目录运行豫构。包名取自 。包。豫 文件名,包根就是文件所在目录。配置只调用 parser,不执行代码。依赖声明和用户身份规则见包系统。

目录结构

仓库根目录只有五个目录:

目录 内容
库/ 多个应用共用的库,按父库层层排布(如 库/密壳/密壳阴书)
应用/ 可执行程序,按领域分组:刊行坊/(发布)、网汇坊/(网页汇编)、书院/(文档站)、百工坊/(开发工具)、机智坊/(人工智能)、浏览器/(网览坊);另有 豫言编译器/、豫构/、度量/
豫寓榫卯/ 带垃圾回收的操作系统接口规范
豫寓底榫卯/ 不带垃圾回收的底层接口规范
豫言操作系统/ 操作系统实现:宿主、适配、裸机(裸机/),以及操作系统工具(应用/)

规则:

包层级

全部包用「包含包」「包含在」组成若干棵树,便于按层级浏览。./豫构。林檎。豫行 发现 --树 打印全部包树:根按目录排列,子包按「包含包」的顺序缩进,每行是包名、目录与简介。层级不改包名与导入,应用仍直接依赖具体的包。

根 目录 子包
百家 库/ 共用的高级模式库;安全外壳(分组父包,其下四个库与验证程序);各库 测试/ 下的测试包
磐石 库/底层库 无;底层文件(名。底层。豫),自成一根
中枢算阵 库/底层库/中枢算阵 无;底层文件,依赖底层库(不能作其子包,父包的库类型子包是隐含依赖),自成一根;其测试包「中央张量内核测试」是可执行文件类型,登记在百家之下
刊行坊、网汇坊、书院、百工坊、机智坊、网览坊 应用/ 下各分组(网览坊在 应用/浏览器) 分组内的程序;数据库连接兼作其私有库「行囊」的父包
豫言编译器 应用/豫言编译器 校场(语言回归测试)、范文(文档示例)
豫构、度量 应用/豫构、应用/度量 无
豫寓榫榫 豫言操作系统/适配 全部接口适配,按接口总纲的顺序;基础适配的验收程序
豫寓百工 豫言操作系统/应用 操作系统工具与用户态程序(发行构建、接口检查、绑定与装载是豫构的命令)
豫言裸机 豫言操作系统/裸机 冶铸(原裸机后端)、客体二号及各样例与探针;汇寓(原瓦西库)依赖客体二号的内部模块、不能单独构建,自成一根
豫寓榫卯 豫寓榫卯/ 全部接口包,按总纲表序;说明文件即《总纲》
豫寓底榫卯 豫寓底榫卯/ 全部底层接口包(名。底层接口。豫);说明文件即《总纲》

分组父包只有包描述与双语包说明,不含模块,放在分组目录;目录里不属于任何子包的文件(如 应用/百工坊/yuyan-vscode、应用/书院/库/文档界面)归它所有。

含 。包。豫.txt 包描述模板的目录(如各适配的一致性验证应用)是另行构建的应用:双宿主构建把模板复制成真正的包描述再构建它。这样的目录不算上级包的源码,豫构的整包类型检查与依赖核对都跳过它。

规则:

包边界

包 目录 职责
豫章 库/豫章 语言核心与基础库;不依赖其他包
豫章试 库/豫章/测试 豫章的测试;要用单元测试框架考课,故独立成包
考课 库/考课 单元测试框架
结绳 库/结绳 结绳(JSON)的数据结构、解析、访问与转义
网页客 库/网页客 纯函数式网页前端组件、文档组件与源码高亮
云工东道 库/云工东道 Cloudflare Workers 宿主能力的豫言封装
网览东道 库/网览东道 浏览器宿主能力的豫言封装
营造 库/营造 包定位、上下文、并行调度;不依赖编译器
译场 库/译场 语法分析、类型检查、优化、代码生成与着色语言翻译
牌记 库/牌记 静态配置解析与包依赖图;使用编译器的 parser
点染 库/点染 着色语言的内建声明(着色源导入的类型与函数签名);不依赖其他包
点染试 库/点染/测试 着色语言的翻译测试与构建集成样例;依赖译场,所以独立成包
算阵 库/算阵 张量计算接口的 GPU 算子内核(着色源译成 WGSL 与 MSL)、绑定约定与参数打包;依赖豫章、点染
算阵试 库/算阵/测试 算阵在金属上的数值测试与计时;依赖借道(系统库调用)、金(金属)与算阵,没有金属时跳过
豫言编译器 应用/豫言编译器 编译器;默认入口为入口。豫
校场 应用/豫言编译器/校场 语言回归测试:语法、网页汇编、名称解析、缺陷等黄金样例
范文 应用/豫言编译器/文档 语言文档及其中的可编译源码示例
豫构 应用/豫构 独立构建工具与自身测试;默认入口为入口。豫
其余工具 应用/<分组>/<工具名>、豫言操作系统/应用/<工具名> 每个工具独立目录、包描述与入口,不再有工具总包
度量 应用/度量 性能实验源码与报告

核心依赖顺序为“豫章 → 营造/结绳 → 译场 → 牌记 → 豫构”(箭头表示先构建者在前)。不能把营造放回依赖译场的牌记或豫构,否则会形成包依赖环。

豫章的测试放在 库/豫章/测试(包「豫章试」),防止豫章反向依赖测试框架。测试包中有预期失败用例,不能将其所有源码一律视为成功构建目标。*_v0 不参与迁移。

导入

寻观「豫章」之书。
寻观「豫章」之「形制」之「次第」之书。
寻观「营造」之「访包」之书。

单段“豫章”按豫章的默认导入展开,共 14 个前置模块:本原的本类、然诺、匣椟、祸福,形制的次第、文章、爻术、筹算、小数术、有无、簿录、对偶,御的缓算,出纳的笔;导入后绑定的命名空间名称是“豫章”。其他豫章模块按路径显式导入。所有库包遵循同一规则:包描述里必填的默认导入列出只写包名的导入所展开的条目,展开只依这份列表,条目都从包根解析,不按当前目录搜索(见包系统“默认导入”)。

库、应用 及其下的分组目录是分类目录,分组目录另有父包(见“包层级”)。导入不带分类目录;旧标准库的转发文件及特殊搜索路径已删除。

包还可以用「包含在」「包含包」两个字段成组:父包登记直接子包,子包声明自己的父包。依赖父包即可用 父之子之模块 引用其子包中的模块,路径止于子包时按该子包的默认导入展开;成组是逻辑关系,不改包名,也与目录嵌套无关。字段、校验与上下文见包系统。

构建与测试

./豫构。林檎。豫行 目标 豫构
./豫构。林檎。豫行 目标 类型检查 豫构测试
./豫构。林檎。豫行 检查 豫言编译器
./豫构。林檎。豫行 构建 豫言编译器 --输出 编译器。林檎。豫行
./豫构。林檎。豫行 构建 源码树浏览器 --输出 源码树。林檎。豫行
./豫构。林檎。豫行 构建 文档网站生成器 --输出 文档网站。林檎。豫行
./豫构。林檎。豫行 构建 豫章试 数据结构 可选值。测试 --输出 可选值测试。林檎。豫行
./可选值测试。林檎。豫行

构建、类型检查命令可在包名后指定入口的各路径段;不带扩展名,不重复包名。省略时使用包文件中的入口字段。没有默认入口的库仍可被依赖,也能通过显式入口构建其中的程序。入口覆盖不允许跨越子包边界,不放宽直接依赖要求。

自举启动

构建统一由豫构的仓库目标(应用/豫构/仓库目标。豫)执行:在仓库根目录运行 ./豫构。林檎。豫行 自举|测试|打包|清理|全部 [-j 并发] [--强制] [--不连带] [--列出],或用 ./豫构。林檎。豫行 目标 名… 运行任意目标。macOS 与 Linux 的稳定工具来自 CI 发布的原生工具链包(historical-binaries 中的 <提交时间>-yuyan-native-<平台>-<提交号>.tar.gz,平台为 linux-x64、linux-arm64、macos-arm64,提交时间取 UTC,形如 20260930T090727Z;最新连续版是 continuous-binaries 中的 yuyan-native-<平台>.tar.gz,CI 自举就从其中最新的 Linux x64 包起步,地址见 .github/workflows/main.yml 的 YY_NATIVE_TOOLCHAIN_URL),包内有原生豫构 豫构稳定。林檎。豫行 与执行器汇编树码 执行器。树码。把包解压到仓库根目录后直接运行:

./豫构稳定。林檎。豫行 构建 豫构 --输出 豫构。林檎。豫行 -j 24 -- --目标 本机 --执行器 执行器。树码
./豫构。林檎。豫行 全部 -j 24

第一条命令以当前源码造出的原生豫构就能日常使用;机器上已装好工具链(PATH 上有 豫构)时,新工作树、新克隆直接用它。第二条「全部」是三级自举,用来验证编译器本身、产出发行用的工具链。仓库目标里连带自举的只有产出工具链的目标:自举、原生工具链、网页汇编编译器、豫构、值桥、打包、原生打包、豫行打包、下载产品、全部,以及造盘工具、启动光盘(盘上带当前源码编出的工具链,预编前导要宿主豫构与盘上豫构的摘要相同,只有自举定点做得到)。类型检查、豫构测试、全树测试工具、行在工具、可执行包程序、各发行、模拟器冒烟、快检用正在运行的豫构;豫构测试先用它把当前源码的执行器与豫构各编一代,放进 .豫构缓存/豫构测试/,交给测豫构程序本身的四项。

已有工具链后,可运行 ./豫构。林檎。豫行 目标 模拟器冒烟 -j 24:它重建普通豫言验证器,并在 QEMU 的 ARM64、AMD64 上运行打印探针。2026-09-28 本机用热缓存约 32 秒通过。这是 WP10 快检中的 QEMU 冒烟步骤;按变更范围选测试及完整快检目标仍待接入。

第一步由包中的稳定豫构配包中的执行器,以当前源码直出一级原生豫构 豫构。林檎。豫行。一级驱动是当前源码的代码跑在包里的旧执行器上,所以工具链自身(编译器、豫构)要用执行器新加的原语时,先合入执行器的支持、等 CI 一轮自举通过、连续版本换上新包,再在工具链代码里用(CI 起步取连续版本里最新的包,2026-10-18 起不钉提交)。第二步“全部”原生自举:一级是正在运行的原生豫构,二级、三级各用上一级先构建执行器汇编树码(客体二号,只有六十四位地址一种构建),再直出原生豫构 豫构二。林檎。豫行、豫构三。林檎。豫行,核对二、三级的豫构与执行器逐字节相同(定点),把三级装成日常用的 豫构。林檎。豫行、编译器。林檎。豫行 与执行器 执行器。树码;最后由原生豫构构建网页后端用的 编译器.wasm、豫构.wasm 与值桥。本机冷缓存约五至八分钟,全程只用原生程序。日常用装好的 豫构 构建|类型检查|目标 …。仓库目标「原生打包」把原生豫构与执行器打成原生工具链包(原生工具链包/:原生豫构 豫构稳定。林檎。豫行 与 执行器。树码):CI 的自举作业打 Linux x64 包,各平台原生自举作业用 Linux 上交叉直出的豫构起步,打 Linux arm64 与 macOS arm64 包。推送到 yybs 时,各平台自举通过就覆盖连续版本(continuous-binaries)里的本平台包;三个平台都自举通过后,再按提交发布历史版本(historical-binaries)。测试失败不挡发布。

Windows 从 Wasm 工具链包起步(Windows 的原生工具链包留待后续版本):包在 historical-binaries 中名为 <提交时间>-yuyan-wasm-<提交号>.tar.gz,最新连续版是 continuous-binaries 中的 yuyan-wasm.tar.gz,内有 编译器稳定.wasm、豫构稳定.wasm 与 Node 宿主 稳定节点宿主/。解压到仓库根目录后用 Node 运行:

node 稳定节点宿主/宿主.cjs 豫构稳定.wasm 构建 豫构 --编译器 ./编译器稳定.wasm --输出 豫构.wasm -j 24
node 豫言操作系统/宿主/节点/宿主.cjs 豫构.wasm 全部 -j 24

豫行工具链包(提案 00021):./豫构。林檎。豫行 目标 豫行打包 -j 24 在 豫行工具链/ 里放两架构的豫构豫行(豫构臂。豫行、豫构兼。豫行)、四个宿主的豫行启动器(豫行启动器臂。林檎。豫行、豫行启动器臂。林纳。豫行、豫行启动器兼。林纳。豫行、豫行启动器兼.exe)与执行器汇编树码 执行器。树码。同一个豫行在豫言操作系统里与各宿主的启动器里都能运行,例如在 macOS 上 ./豫行启动器臂。林檎。豫行 豫构臂。豫行 构建 …。CI 每轮打这个包,在 Linux 两架构与 macOS 上用启动器运行豫构豫行(发现包、构建并运行原生你好的豫行版),在 Windows 上用启动器运行原生你好的 AMD64 豫行版,把 AMD64 豫构豫行合成单文件 豫构。林檎。豫行,发现包(输出与 Linux 上原生豫构的逐字对照)、构建原生你好的豫行版(与 Linux 上原生豫构编出的逐字节对照)并以 -j 4 类型检查一个库(几个常驻工作进程同时运行),推送 yybs 时上传为连续版本的 yuyan-yuxing-toolchain.tar.gz。新检出的仓库也可以从这个包起步:用本机的启动器运行豫构豫行,写明宿主的目标系统与架构直出本机原生豫构,再「全部」,见《快速开始》。

启动光盘:./豫构。林檎。豫行 目标 启动光盘 -j 24 连带「造盘工具」,在 启动光盘/ 里放两架构的 BIOS/UEFI 混合启动 ISO 豫言系统-兼容六十四.iso 与 豫言系统-臂六十四.iso(预置为空、带工具链,同 豫言系统 启动盘 --预置 无 --只出光盘)。这个目标每次都跑,CI 拿它的产物当发行物发布。

下载产品:./豫构。林檎。豫行 目标 下载产品 -j 24 连带「原生工具链」,在 下载产品/ 里放官网下载中心的编译器包 编译器-<系统>-<架构>.tar.gz(豫言、林檎、林纳、轩窗四个系统 × 两种架构;整份源码加交叉构建的豫构、它的拷贝编译器(程序名按系统取后缀,如 豫构。林纳。豫行、编译器。林纳。豫行)与执行器汇编树码)和桌面包 桌面-<系统>-<架构>.tar.gz(林檎、林纳、轩窗 × 两种架构;编译器包加豫言工作台 豫言桌面。林檎。豫行 与文楷字体)。这个目标每次都跑;社区包仓库的 CI 把它和「启动光盘」的产物挂到连续发行,官网下载中心只链这些发行物。

可执行包程序:./豫构。林檎。豫行 目标 可执行包程序 -j 24 把 应用/豫构/仓库目标。豫 的清单「可执行包程序们」里的可执行包编成各目标的程序,放进 可执行包程序/<目标>/<软件名>,连同清单 可执行包程序/清单。数据。豫(数据子语言,顶层「程序们」,每个程序一个记录「程序」,十个字段:软件名、包名、所有者、版本、目标、文件(相对 可执行包程序/)、沙256(小写十六进制)、字节数、简介、源码提交号;版本是包描述里的版本加 + 与 git rev-parse HEAD 的前九位)。目标写成“系统-架构”:豫言-兼容六十四、豫言-臂六十四(豫行,--目标 本机 --目标系统 豫言 --目标架构 …,与造盘放进 /工具 的工具同一种格式)、林檎-臂六十四、林纳-兼容六十四、林纳-臂六十四;环境变量 可执行包目标 选目标(逗号分隔,全部 即全部目标),没设时只编 豫言-兼容六十四。语言仓 CI 每轮编 AMD64 豫行,用林兼启动器运行你好作冒烟。发布走社区包仓库:语言仓 CI 推送 yybs 后把这些应用复制进 yuyan-lang/yuyan-community-packages 的 包/豫言/(作业 community-copy,清单是社区包工具的「社区复制包们」),由社区仓库的 CI 编全部目标、把程序与软件目录发布进包仓库 yuyan-lang.org;豫言操作系统的“安装软件”读全部社区程序的汇总目录 https://yuyan-lang.org/豫/社区/软件/豫言-兼容六十四。数据。豫(所有者“豫言”的程序以包名为名称)。清单只收能用 --目标系统 豫言 编过、并在豫言操作系统里装上后能运行的应用;发布新软件时在这份清单与「社区复制包们」里各加一项。

第一步用包中的稳定豫构与编译器以当前源码造出 豫构.wasm;固定种子默认生成 Wasm,无须指定目标。“全部”在 Windows 上走 Wasm 自举(编译器二.wasm → 编译器三.wasm → 编译器.wasm,比较三、四级定点)。在 macOS 与 Linux 上从 Wasm 包起步时,“全部”先由「原生起步」在 Node 上用当前源码的 豫构.wasm(自带编译器)构建六十四位执行器汇编树码并直出一级原生豫构,再照上文原生自举;CI 按提交号抽样约四分之一的轮次(手动触发时必跑),在三个平台上验证这条路。不再生成 豫构引导,也不使用旧单文件启动模式。

更改依赖、包路径或子包边界后,上下文缓存会隔离,不复用旧绑定。此版本不获取远程依赖、不求解版本,也没有锁文件。