Native 编译战略(自主生态的终局执行底座 + 开发形态逃逸)
日期: 2026-09-06 立稿;2026-09-08 补"理由 e + 可选粒度原则 + 四段路线 + Stage 0.5 fork-rustc 方案"(当日在 auto-musk 会话推导定案);同日复核:Release 全档纳入(零优化损失)、MVP 收缩、分期 A/B/C、上游"早于成熟"策略、 命名定案:推广用词 Versioned ABI,规避 Stable ABI状态: Draft→细化中(远期必做后端选型 + 近期刚需开发形态逃逸,双动机) 关联: ecosystem-portfolio-strategy(伞形总战略·寄生期 合作层原则的终局对应面)、c-ecosystem-strategy §2(现阶段 "C 即 IR"是其寄生期表达)、GOAL-017(自举)、 Design 28 Rust 互操作架构(ABI 分析底稿)
0. 定性:从"寄生"到"自主"的分水岭
现阶段 Auto 以源码级转译(a2r/a2c)寄生在 Rust/C 生态上——这是短期务实选择,不是终局。 Native 直发(直接产出原生可执行文件)是远期必做项,五条理由:
a. 系统语言的资格:缺乏原生二进制生成能力,无法自称系统语言。
b. 全链路优化空间:Auto AST → 机器码的全链路编译器能实施转译路线永远拿不到的 优化(跨语言边界的内联、整体逃逸分析、语义级优化、寄存器分配全局性)。
c. 独立生态:Auto 现在寄生在别的生态(Rust/Python 等)上,终局需要自己的独立 生态(AI·Lang·OS)。
d. 自有硬件:未来自研硬件一旦选定架构方向(如 RISC-V),可基于它构建全链路 Auto 自主生态。
e. 开发基础设施逃逸(2026-09-08 补,近期刚需):Auto 的基础设施本身用 Rust 写,因此 Rust 构建模型的所有硬伤由本团队亲身承受,且被 AI 多 agent 时代结构性放大。 痛点均有精确机制对应(ABI 部分详见 Design 28):
-C metadata把检出路径卷进哈希 → 同源同配置的不同 worktree 产出符号名不同的 "同一个 crate",互不认账、各存一份;- rlib 静态链接模型 → 每消费者内嵌全量依赖机器码,1 依赖图 × N 检出 × M profile 变体乘法爆炸(8 agent × worktree 实测 200GB+;sccache/增量/cranelift 只攻 CPU 时间维,不碰共享与链接模型维);
- 无稳定 ABI、无插件机制(业界唯一通用插件方案竟是 WASM——这本身是市场对原生 ABI 的控诉);测试二进制全量链接 → "改 1 句编译测试 10 分钟"。
多 agent 错配的本质:worktree 隔离(agent 避互踩)× path 进指纹(隔离即不共享)× 静态链接(不共享即各编各的)。这是模型层不匹配,调优不可解——也正是 "给 Rust 做解释器"(Auto 的立身之本)的动机在基础设施层的镜像。
产品反转注:Auto 的 VM 本身就是 Rust 从未有过的插件层——.at 作为热插拔、可沙箱、 版本化制品,对 AI-agent 生态(agent 逻辑作为可动态装载制品)是产品级机会,不只是 基础设施救济。
0.5 指导原则:可选粒度稳定性(版本即兼容域)
(2026-09-08 定案)ABI 之争的两个已知极端:Itanium C++ = 永久冻结(布局成公共 契约,std::string COW→SSO 被迫双 ABI 并存、std::regex 失误永久冻结——稳定性随时间 积累成不可偿还的债);Rust = 完全不确定(布局无承诺,换编译器自由)。 两者都不要。第三条路:把稳定性从时间轴摘下来,变成空间轴上的一个键—— 版本即兼容域:
- 同一编译器版本 + target + 涉界 crate 配置 = 兼容;跨版本 = 不承诺,按版本管理制品;
- 先例成熟:CPython
cp312-manylinuxwheel 标签、NodeNODE_MODULE_VERSION、 glibc 符号版本化——全是"按运行时/编译器版本管理原生模块 ABI"的现成制度; - rlib 其实已经按版本键运作(跨 rustc 版本链接立刻报 "incompatible version"; rustc 自身就以 dylib 集群 + 共享 std dylib 形态运转多年)——本战略的多项主张 是把 rlib 的 de facto 行为正式化并延伸到 .so 共享,不是发明新物理。
Zig 参照系的精确分解("像 Zig 那样"≠"跳过 LLVM"——Zig release 档仍走 LLVM): ① 自举(编译器自写,约八年收口);② 双档后端(debug 自发朴素机器码秒级、release 上 LLVM)——可选粒度在后端层的实现;③ 全局内容寻址缓存(全机共享,同 编译器+源码+标志 = 同哈希 = 同产物,跨项目复用)——Zig 在构建层直接消灭了 path-指纹与 200GB 问题。三者可分别借鉴,不必整包照搬。
C 的角色定位:接口语言而非实现语言——C ABI 作为互操作世界语(430 管线已经是 这个形态);作为本团队基础设施实现语言则不可取(527K 行 Rust 形态代码迁 C = 拿内存 安全换编译速度,且 unsafe × agent 集群 = 灾难放大器)。
1. 四段路线图(2026-09-08 定)
| 阶段 | 内容 | 救济对象 | 见效 |
|---|---|---|---|
| Stage 0(现在) | 冻结 Rust 核心于低频变更态;新基础设施模块 .at 优先(PLAN-591 扩大 .at 可达 Rust 面);核心 cargo 构建集中化(共享 target-dir/构建服务 + sccache),.at 增长面走解释器不过 cargo | agent 集群乘法爆炸 | 立即 |
| Stage 0.5(方向已确认,见 §2 分期) | fork-rustc:「Versioned ABI」发行版——符号身份去路径化 + ABI 键嵌入/装载校验 + CAS 缓存默认化(Release 键第一天就带,全档零优化损失);布局 profile 为可选件 | 存量 527K 行 Rust 核心(不重写一行) | A 期月级 |
| Stage 1 | cranelift dev 档后端(Rust 库形态嵌入 VM 进程,可兼 JIT tier-up;LLVM 留作后续 release 档可选件,Wasmtime 同构) | .at 增量层主权 | 月-年级 |
| Stage 2 | Auto 自有版本化产物格式 + 按 §0.5 键管理的 ABI + dlopen 装载——Rust 永远不给的插件机制,.at 制品第一天就有(两端都是我们的,兼容域我们定义) | 插件生态 + agent 制品复用 | 紧随 Stage 1 |
| Stage 3(远期) | 自举收口(GOAL-017,编译器用 .at 重写,Zig 式闭环);LLVM 仅在某 release 优化主战场成立时引入 | 终局主权 | 年级 |
互补性(非竞争):fork-rustc 治存量 Rust 核心的痛(装修租的房子);native 线养 .at 增量层的主权(盖自己的房子)。两条线并行,Rust 逐步降级为"发射目标之一 + 经 430 消费的库超市"。
2. Stage 0.5 方案明细:fork-rustc「Versioned ABI」
命名定案(2026-09-08,用户裁定):对外/上游统一用词 Versioned ABI (版本化 ABI),规避 "Stable ABI"(rustc 社区负资产词,关联 C++ 式永久冻结)。 叙事锚点 = "可复现制品身份 + 版本化 ABI 键"——机制提案,非政策提案。
核心洞察(2026-09-08 复核后升级三点):
- Release 全档零优化损失:布局不是随机数——同一 rustc 二进制对同定义+同配置 产出确定布局,含 Release 全优化档(重排/niche/枚举打包都是确定性算法,
-Z randomize-layout须显式开启恰好反证)。版本键管理只要求"同版本内一致", 跨版本不承诺(键不同即不装载)——因此 Release 插件化不需要 debug-only 的妥协; - MVP 不含布局补丁:开发痛(重复编译/磁盘/链接)由 P2+P6+P3 即解——用 今天的 repr(Rust) 原样工作(同版本确定性 de facto 成立);P1(layout=C)只是 "偏移可静态分析"的可选便利件(探针路线在优化布局下同样可得真偏移);
- 版本键化把"永久政策承诺"(C++ 之路)降维成"每版本一个确定函数"(键即版本)。
ABI = 布局 + 符号 + 调用约定 + 运行时服务,工件清单(含分期归属):
| # | 工件 | 内容 | 期 |
|---|---|---|---|
| P2 | 符号身份去路径化 | -C metadata 强制为 (crate, version, features, fork 版本) 纯函数 | A |
| P6 | ABI 键嵌入/装载校验 | 制品自报兼容域键 + 小型装载校验库(宿主键 vs 制品键,不符拒载;§0.5 六工件之 2/3);Release 键从第一天带 | A |
| P3 | CAS 缓存默认化 | cargo 层内容寻址全局缓存 + 硬链接复用(AutoCache Plan 082 同构,可统一为 fork/Auto 双侧底座) | A |
| P1 | layout=C profile | 声明序+C 填充布局档(与 layout=opt 全优化档并存,各自构成合法版本域;niche 关闭改类型尺寸为已知代价) | B(可选件) |
| P4 | 泛型跨 dylib 约定 | comdat/弱符号导出纪律;win32 导出约定最难,或跨库调用限定非泛型面(=430 manifest 面) | C |
| P5 | 运行时服务一致 | 同 fork 同版本天然钉死调用约定/unwind;std 共享 dylib(rustc 自建先例) | C |
分期执行:
| 期 | 内容 | 产出 | 前置 |
|---|---|---|---|
| A(月级) | P2 + P6 + P3 | agent 集群痛消解 + 版本键动态装载可用(今日 repr(Rust) 即工作) | 专职 owner 落位(rustc 构建+rebase 不能兼职) |
| B | P1 layout=C profile | 偏移=签名纯函数,430 探针可退役,manifest 从签名直接生成 | A |
| C | P4/P5 完整插件面 | 真正的插件生态(win32 导出纪律 + std 共享 dylib) | A/B 收益实测 |
收益判定(2026-09-08 推演,扩至 Release):
- ✅ Debug/Release 双档版本键动态装载(A 期即带键,C 期齐插件面);
- ✅ 依赖不变 → 缓存全命中,99% 库免重编重链,自己 crate 走 dylib 后链接趋零;
- ✅ 多 agent 共享同一份(CAS 语义);
- ✅ B 期后 430 管线简化(偏移静态可得)——AutoVM 直调 Rust 库的原始愿景兑现;
- ✅ 热重载两层分工:符号级热替换(fork 产出);带状态热重载(Auto VM 已有, GOAL-002 含数据迁移)——又是互补分工。
风险清单:fork 税(rustc 六周版次,metadata/符号区常动,rebase 永久支出;A 期 面积已缩至最小可缓解);全团队+CI+agent 集群版本钉死(rust-toolchain.toml 可钉); proc-macro 全生态经 fork 重编一次(缓存摊薄);B 期 niche 关闭改类型尺寸需文档化; 装修/盖房平衡——fork 治存量、native 线养主权的互补格局不变,最危险的失败模式 是 fork 太成功导致自建底座失速(五年后守着大型 fork 而非拥有一门语言)。
上游策略(2026-09-08 修正:早于成熟,而非成熟后):P2/P6 随 A 期即以 -Z flag 提案——机制非政策("可复现制品身份 + 版本化 ABI 键"),reproducible-builds 天然同盟,clippy/rust-analyzer"社区先行→官方吸收"先例;fork 的存在本身是谈判 筹码(需求/实现/用户三证明),上游接纳概率随成熟度单调上升,fork 面积随之收缩 ——fork 是桥梁不是归宿。
3. 路线选项(后端选型,Stage 1 的战略级分析输入)
CPU
| 选项 | 代表 | 优势 | 风险/代价 |
|---|---|---|---|
| LLVM | Swift/Rust 等 | 目标矩阵免费、优化成熟、生态最全 | 重依赖(体量/编译时/治理) |
| 自研 emitter | Go/Zig 路线 | 全链路自主、编译快、行为可控 | 工程量极大、优化成熟度是长跑 |
| Cranelift | Wasmtime 系 | Rust 生态内、编译快、体量适中 | 优化上限低于 LLVM、定位偏 JIT |
| MIR | 轻量 C 编译器 | 极小、可嵌入 | 社区小、长期维护风险 |
2026-09-08 预裁注:在理由 e(开发形态逃逸)新动机下,Cranelift 先行论证 增强——它是 Rust 库而非工具链(无独立构建/版本协商,可嵌 VM 进程、可兼 JIT tier-up),代码生成较 LLVM 快一个数量级且优化上限低对 dev 档无碍; 不锁死(Wasmtime 同构:cranelift 默认 + LLVM 可换)。「native 编译器用 Auto 写 还是 Rust 写」的务实答案:先 Rust 引导(因为它是库,拿来就用),自举归 Stage 3。
GPU/NPU(Triton/TileLang 模式)
把 Auto 做成 GPU/NPU 的原生语言:张量类型/comptime 设施是天然抓手;与 Python 轨的 PyTorch 消费形成"调用面 → 自主发射面"的演进闭环(先消费 Triton 生态学语义,后自主发射)。
4. 与现阶段的关系与触发条件
- a2c 不因 native 而废弃:C 发射仍是嵌入式/内核等消费面的发布形态;native 是新增的 自主执行底座,两者并存。
- 产业锚点(2026-09-06 补):半导体自主化——native 线是三大市场需求侧的供给侧对应 面(portfolio"需求侧 3 + 供给侧 1"结构):GPU/NPU 语言面(Triton/TileLang 模式)切入 AI 芯片软件栈(半导体增长最快的段,同时在 AI 市场内);HLS(C→RTL)是远期连续路线 (comptime + 动静结合映射"算法级仿真→HLS/RTL 发射");与自有硬件/RISC-V 倾向(理由 d) 构成完整产业叙事。
- 主战场先行:届时锁定 1–2 个硬件架构方向(如 RISC-V/Arm)做全链路打通,不铺开矩阵。
- 触发条件(2026-09-08 重排):
- Stage 0.5(fork-rustc / Versioned ABI):方向已确认,即时可启动——动机是 当前开发效率刚需(理由 e),不依赖自举或硬件立项;A 期(P2+P6+P3)最小集先行 实测,B/C 期按收益决定。启动前置:专职 owner 落位。
- Stage 1(cranelift dev 档):Stage 0.5 落地后按 .at 层的编译需求触发 (解释器性能顶点 / 需要脱离 rustc 语义的发布形态)。
- Stage 2-3:维持原条件——① 自举收口(GOAL-017)② 一个需要 native 的主战场成立 (自有硬件立项 / 性能临界的旗舰应用)。
5. 待扩充
- [x]
选型评估框架与决策时点(2026-09-08 预裁注:cranelift 先行论证入 §3,正式 裁决随 Stage 1 触发时收口) - [ ] GPU/NPU 路线对标 Triton/TileLang 的深度分析
- [x]
与 AAVM 自举的关系(2026-09-08:先 Rust 引导(库形态),自举归 Stage 3) - [ ] 中间表示选择:沿用 VM bytecode 降低,还是新 IR
- [ ] 主战场架构(RISC-V/Arm)选择的分析输入与自有硬件路线的联动
- [ ] Stage 0.5 A 期(P2+P6+P3)原型验证报告(8-agent 场景磁盘/CPU 实测基线与收益)
- [ ] P2/P6 上游提案稿(Versioned ABI 键机制叙事——可复现制品身份,-Z flag 形式,reproducible-builds 同盟;机制非政策)
- [ ] Versioned ABI 命名规范落地检查(对外文档/提案/发布说明统一用词,规避 "Stable ABI")