开源:Zig 编译器 MCS-51/251 后端
用 AI 把 Zig 编译器移植到 8051 / 80251(MCS-51 / MCS-251):自托管后端已在真机跑通,已开源求共建
一句话:现在可以用 Zig 写程序、直接编译成 8051/80251 的汇编(ASxxxx),
再和 SDCC 编译的 C 一起用 sdas/sdld 链接成同一个固件;GPIO / UART / 定时器中断二进制日志 / USB-CDC 等已在 AI8051U-34K64 真机验证。代码全部开源,想借助各位大佬把剩下的坑补完。
项目地址:github
一、背景与目的
- 目标芯片:STC 系列(Intel 8051 / 80251,即 MCS-51 / MCS-251)。
- 动机:
- 让 Zig(现代语言、内存安全、编译期计算)也能用在 8051/251 上;
- 顺便验证 AI 能否胜任“编译器后端移植”这种繁重工作——从语言前端到指令选择、寄存器/栈帧、ABI、中断、链接,全部由 AI 辅助完成并由人在真机上逐项排错。
- 分工(如实说明):本项目绝大多数代码由 AI 助手(DeepSeek 4.1 Flash)编写
(后端移植、构建/链接脚本、示例、文档、排错),笔者主要负责提供移植思路与方向决策、真机验证与硬件支持。
- 结果:Zig 的自托管(self-hosted)后端已经能产出可用的 8051/251 汇编,
与 SDCC 的 C 工具链共用同一套 ASxxxx 汇编/链接流程。
为什么选 Zig(选型思考)
嵌入式可用的语言其实不少(汇编 / C / C++,早期的 Java / Python / Go,新兴的 Rust / Zig / C3 等),
每种都有其擅长之处与活跃的社区;这里只是结合本项目的情况谈一点个人取舍,无意比较优劣。
就本项目而言,我觉得比较合适的是 C / Rust / Zig,最终选了 Zig:
- 最吸引我的是 编译期计算(comptime):希望「编译期运行 + 宏系统 + 内存安全」
能同时成立——对 HAL 层保持人类友好,又保留寄存器级编程的高效,并有机会把内存安全
带进嵌入式这种对稳定性要求极高的环境;
- 论内存安全,Rust 的成熟度其实更高,也非常值得学习;没有移植 Rust,主要还是没有预算——
Rust 的功能与生态都很庞大、代码量也大得多,以有限的资源去做移植,成本会高不少,权衡之后选了更轻量的 Zig;
- 另一个动机,是想验证新兴语言能否让老牌平台(8051/251)也享受到内存安全的红利。
需要说明的是,Zig 仍在快速迭代:0.17 相对本项目所基于的 0.16.1 已有语法变化
(0.16 编不过 0.17 的移植版本),因此若项目持续发展,可能与 Zig 主线出现一定脱节,直到 1.0。
对嵌入式而言,语言频繁调整语法是双刃剑——这大概也是新的 C/C++ 标准在嵌入式里不那么流行、
以及暂未选择更年轻的 C3(目前在 0.8,社区仍在成长)的原因之一。
以上仅为个人看法,欢迎指正与交流。
二、上游项目与许可
| 上游 |
地址 |
许可 |
本项目改动 |
| Zig |
https://codeberg.org/ziglang/zig |
MIT |
新增 MCS 自托管后端 |
| SDCC |
https://sourceforge.net/projects/sdcc/ |
GPLv2 为主的混合协议 |
使用其 mcs251 端口 |
| sdcc-c251 |
https://github.com/gevico/sdcc-c251 |
同上 |
未修改任何 SDCC 源码 |
| STC 官方示例/资料 |
STC 官网 |
STC 版权 |
仅作寄存器/外设参考 |
许可说明:Zig 后端沿用上游 MIT;SDCC 系 GPL-2.0;本项目的集成仓/示例/文档以
Apache-2.0 发布,三方各自独立、互不混合。
三、现在能做什么(现状)
1. 三段式管线
Zig 源 --(Zig 自托管后端)--> .asm --(sdas251/sdas8051)--> .rel
C 源 --(sdcc -mmcs251)--> .rel
--(sdld + 运行库 + crt0/中断向量)--> .ihx
2. Zig 后端能力(自托管,非 LLVM)
- 目标:
mcs51 / mcs251,输出 ASxxxx 汇编文本;
- 变量按空间分配:
data / idata / xdata(linksection 指定);
- 运行期下标、运行期指针、切片、结构体字段访问;
- 中断:ISR 采用“无栈帧 + 内联汇编 +
reti”约定,向量表可自定义;
- SFR 直接寻址、内联汇编、
@ptrFromInt 固定地址访问;
- C ↔ Zig ABI 互操作:与 SDCC
--stack-auto 对接,支持 3 字节指针、大端标量、多参数;
- AI8051U 复位于
FF:0000(--code-loc 0xff0000)。
3. 真机验证(AI8051U-34K64)
- P1.1 闪灯、UART1 打印 / 接收中断回环;
- 定时器 T0 1ms 中断(每秒打印一行);
- COBS 二进制日志(真机 821 帧解码通过);
- USB-CDC(
hello world 每秒一行);
- 硬件 MDU 乘除、CORDIC 定点,与 C 参考实现对拍;
data/idata/xdata 各空间读写自检。
4. 8 位 mcs51
- 8 位目标可在软件仿真(ucsim)里跑通自检工程
at89c52_sim(无板验证)。
5. 设备描述表
- 收录 176 款 STC/AI 型号的存储/SFR/中断矩阵(TOML),
- 编译器按所选芯片自动决定变量放置,链接脚本也从设备表生成。
6. 体积优化
- 后端本身支持
-Dmcs-only、条件融合等;
- 构建层提供汇编瘦身/死代码回收工具(实测 CSEG 降 12%~40%)。
7. 便携工具链(零环境变量)
- 自带 zig + sdcc + 构建工具,不需要 Python、不需要配环境变量;
- 含 4 个示例(C 的 USB-CDC、纯 Zig 的日志 / 定时器打印 / UART 回环),
build.cmd all 一键构建。
四、仓库地址
- 集成仓(工具链 / 示例 / 设备表 / 文档):https://github.com/manniuP/mcs8051
- Zig 后端(分支
mcs251-backend):https://github.com/manniuP/zig-mcs51-backend
- SDCC(MCS-251):https://github.com/manniuP/sdcc-c251
(本仓仅作“以后要让 SDCC 支持新特性”的克隆基底,当前未改 SDCC 源码)
- STC 官方示例整理后另传 GitHub/Gitee。
五、快速上手(PowerShell)
# 1) 取集成仓(含两个编译器子模块)
git clone --recurse-submodules https://github.com/manniuP/mcs8051.git
cd mcs8051
# 2) 用系统 zig(0.16.0) 构建 MCS 后端
cd compiler
zig build -Doptimize=ReleaseFast -Dno-lib -Dmcs-only --zig-lib-dir lib
# 产物:compiler\zig-out\bin\zig.exe
# 3) 编 Zig 示例(C 目标走 SDCC)
cd ..
xmake f --mcs_arch=mcs251
xmake build ziglog
也可以直接下载仓库 CI 生成的便携包(Actions 产物 / Release 附件):解压后运行 build.cmd all,无需任何环境变量。
六、想请各位大佬一起做的事
- 真机覆盖:更多型号/外设的实测(STC8 / STC32 / AI8 系列等),帮助项目发现边界问题;
- 调试支持(目前基本没有):
- Windows 版 SDCC 包默认禁用了
ucsim/sdcdb,且 MCS-251 在 ucsim 里没有模型;
- Zig 后端目前不输出调试信息(DWARF/CDB);
- 真机(AI8051U)无 JTAG/SWD,只能靠串口打印/日志。
希望一起做:Zig 后端生成调试信息、补 251 仿真模型,或做基于 UART 的简易调试/单步通道。
- 后端功能补缺:
const → code 放置、更多语言特性、代码尺寸/速度优化;
- C 运行库:STC 的 USB / MDU / DSP 只提供 Keil/IAR 二进制库,
在 SDCC/Zig 下需要替代实现或移植;
- 8 位(mcs51)完善与仿真回归;
- 文档、示例、CI、翻译;
- 欢迎提 Issue / PR,或在帖子里反馈你遇到的问题与建议。
七、已知限制
- C 只能走 SDCC(
zig cc 目前无法为 MCS 生成目标码),C++ 暂不支持;
- 无源码级调试:没有可用的调试器/单步(见「六、2」);
- 251 核无法用 ucsim 仿真,必须真机验证;
- 后端仍有未实现的 Zig 语言特性(细节见仓库
docs/)。
八、致谢
感谢上游 ziglang/zig、SDCC
与 gevico/sdcc-c251 的工作,以及 STC 官方公开的寄存器/外设资料。
本项目绝大多数代码由 AI 助手 DeepSeek 4.1 Flash 编写;笔者提供移植思路、方向决策与真机验证。欢迎大佬们在帖子下交流和批评指正。