llvm-mos 项目将 LLVM 和 Clang 编译器适配到 MOS 6502 等 65xx 系列微处理器上,让开发者能用现代 C/C++ 语言开发 8 位复古系统程序,而非局限于过时的汇编或 BASIC。这种 fork 继承了 Clang 的优秀诊断信息和 LLVM 的优化框架,同时针对 6502 的寄存器稀缺(仅 A/X/Y)和零页内存特性进行了深度定制。
核心观点在于,llvm-mos 通过多项创新优化,将传统 6502 编译器的代码体积和速度劣势转化为优势。例如,全程序静态栈优化能自动识别非递归函数,将栈帧转为静态全局变量,避免软栈开销;程序无复杂函数指针时,甚至可完全消除栈使用。这直接落地为参数:编译时使用 -Os(优化大小)和 -flto(链接时优化),可将 hello world 从数百字节压至数十字节。证据见官方 Godbolt 示例,一段计算 pi 的 C64 程序在模拟器中高效运行。
另一个关键是寄存器分配策略:引入 16 个“虚拟零页寄存器”(实际为零页的 2 字节槽,可非连续放置),结合 A/X/Y 实现高效分配。调用约定优先寄存器传递参数,循环优化自动选 6502 寻址模式(如零页间接)。这些在 SDK 中体现为内置 IEEE-754 浮点支持和集成 GAS 兼容汇编器。实际参数建议:-O2 -fno-stack-protector -mno-soft-float,针对 freestanding 环境禁用栈保护和软浮点;链接时加 -Wl,--lto-emit-asm 查看优化后汇编。
安装极简:下载预编译 SDK(Linux/Mac/Windows),解压后可选加 PATH(警告:勿与上游 LLVM 冲突)。例如 Linux:wget https://github.com/llvm-mos/llvm-mos-sdk/releases/latest/download/llvm-mos-linux.tar.xz; tar xf llvm-mos-linux.tar.xz。然后直接编译 Commodore 64 示例:
#include <stdio.h>
int main(void) {
const char *cur = "HELLO, 6502!\\n";
while (*cur) putchar(*cur++);
return 0;
}
命令:mos-c64-clang -Os -o hello.prg hello.c。生成 .prg 可直载入模拟器如 VICE。CMake 项目更便捷:set(LLVM_MOS_PLATFORM c64); find_package(llvm-mos-sdk REQUIRED); add_executable(game game.c),构建时指定 -DCMAKE_PREFIX_PATH=/path/to/sdk。
平台支持清单覆盖 20+ 目标,分类如下:
卡带/ROM 系统:
- NES:NROM、MMC1/3、UNROM 等 mapper,命令如
mos-nes-nrom-clang。
- Atari 2600:4K 或 TigerVision 3E,
mos-atari2600-4k-clang。
- Atari 8-bit:DOS (.XEX)、MegaCart,
mos-atari8-cart-megacart-clang。
家用机:
- Commodore:C64/C128/PET/VIC-20,
mos-c64-clang 等。
- Commander X16/MEGA65:
mos-cx16-clang。
其他:
- Ben Eater 6502 面包板、
mos-eater-clang。
- 模拟器:内置 6502 sim,
mos-sim-clang 测试无硬件。
监控要点:用 llvm-objdump -d hello.elf 检查反汇编,关注代码大小(目标 <64KB ROM)和循环指令(如 INC zp)。基准测试显示,llvm-mos 在 dhrystone 等 suite 中超 legacy 编译器 20-50%。风险:无完整 stdlib(仅 printf/malloc),C++ 无异常;回滚策略——纯 C + 静态分配,阈值设代码 >80% 零页利用时手动零页固定。
高级落地:全程序优化参数 -fuse-ld=lld -Wl,--gc-sections 启用垃圾回收和符号导出;零页分配监控用 --print-after-all 查看 pass。Rust 支持初步验证(如 Atari 800 hello),未来扩展潜力大。
总之,llvm-mos 桥接复古硬件与现代工具链,参数如 -Os -flto -mstack-direction=-(栈向下增长匹配 6502)确保高效。项目 Discord 活跃,贡献欢迎。
资料来源:https://llvm-mos.org,https://github.com/llvm-mos/llvm-mos-sdk(“llvm-mos enables modern software development for many classic platforms.”)。