小型设备 C 编译器(SDCC)于 2026 年 6 月 22 日发布了 4.6.0 版本,该项目的发展历程可以追溯到 1999 年。SDCC 是一个可重定位的优化 C 编译器套件,支持 ANSI C89、ISO C99、ISO C11 和新兴的 ISO C23 标准。与主流编译器主要关注 32 位和 64 位处理器不同,SDCC 针对 8 位微控制器进行优化,这些架构仍然广泛应用于嵌入式控制、消费电子和传统工业设备中。
This image is from the official SDCC GitHub repository (swegener/sdcc) and provides visual context for the open-source compiler project discussed throughout the article. SDCC is an open-source, retargetable optimizing C compiler for 8-bit microcontrollers that has been in development since 1999.
### 支持的架构和当前状态
SDCC 的主要目标包括 Intel MCS‑51 系列(8031、8032、8051、8052)、Maxim(原 Dallas)DS80C390、Freescale/Motorola HC08 和 S08、Zilog Z80 系列(Z80、Z180、eZ80、Rabbit 2000/3000/4000、SM83、TLCS‑90、R800)、Padauk(pdk14、pdk15)、STMicroelectronics STM8,以及 MOS 6502 和 WDC 65C02。正在进行中的工作覆盖 Rabbit 5000/6000、Padauk pdk13 以及 f8/f8l 目标。PIC16 和 PIC18 端口被标记为已停止维护。该编译器在 Linux(amd64、x86、aarch64、ppc64)、macOS(amd64)和 Windows(通过 MinGW 交叉编译)上运行,并已在 FreeBSD aarch64 上测试。
### 4.6.0 版本的新功能
4.6.0 版本新增了大量 C23 和 C2y 功能:_Countof 运算符、八进制字面量、if‑declarations、带第二个操作数省略的条件运算符、带存储类限定符的复合字面量、精确位整数类型 `_BitInt`、位工具、umaxabs、uabs/ulabs/ullabs、constexpr(大部分)、containerof 宏、_Optional 限定符、C23 可变参数函数(va_start)。语言级变更包括将普通 int 位字段设为有符号,采用 C99 语义处理 `realloc(ptr, 0)`,并警告对数组参数访问超出声明范围。该版本还引入了实验性的 f8l 端口、新的 r4k 端口(适用于 Rabbit 4000)、实验性的 r5k/r6k 端口(适用于 Rabbit 5000/6000)以及 Rabbit 端口的 `__far` 支持,支持 1 MB 数据地址空间。对 Z80 相关端口的代码生成进行了“大量改进”,并用 ez80 端口取代了原有的 ez80_z80 变体。
### 资金和开发模式
SDCC 一直由 unpaid volunteers 开发,偶尔得到允许在付费时间内贡献的大学员工的支持,以及来自 MCU 供应商的硬件样品支持。2025 年 10 月,该项目宣布了两项资金奖励。NGI0 Commons Fund 支持针对 Padauk、Rabbit 和 Toshiba TLCS 目标进行硬件特定改进,以及对最近的 ISO C 标准、局部变量内存使用优化和移除未使用函数的链接时优化(后者是长期的用户请求)进行机器独立工作。Sovereign Tech Fund 则委托对嵌入式固件的的安全性和安全性进行改进:与安全编码相关的现代 C 特性、后量子密码学准备、侧信道缓解措施以及对较少使用的命令行组合的扩展测试。两个项目都涉及现有的开发团队。
### 社区背景和替代方案
长期用户回忆起 SDCC 是 2000 年代早期对 PIC16 开发的免费商业编译器的关键替代品(如 Hi‑Tech C)。8051 端口经常被引述为该架构下最强大的开源选项,尽管一些开发者指出存在持续的 bug。MOS 6502 端口最初是 HC08 后端的修改,后来被 Gabriele Gorla 清理和合并。如今,其他 6502 工具链(如 llvm‑mos 和 Oscar64)提供了不同的优化配置文件。对 PIC10/PIC12 支持的请求仍然未解决。该编译器的组件套件包括一个可重定位的汇编器/链接器(sdas/sdld,源自 ASXXXX)、一个预处理器(sdcpp,源自 GCC cpp)、模拟器(ucsim)、一个源级调试器(sdcdb)以及基于 binutils 的存档工具——所有这些工具均采用 GPL 或兼容许可证。
### 仍不确定的事项
该项目不发布正式的路线图和日期,因此完成 Rabbit 5000/6000、Padauk pdk13 和 f8/f8l 端口的时间表尚不清楚。PIC16/PIC18 端口被标记为已停止维护,但没有关于移除或复兴的计划。链接时优化虽然获得了资金支持,但尚未在版本中出现。用户在评估 SDCC 对商业编译器的替代品时,应核实当前代码质量和针对特定目标的 bug 状态,因为提供的源代码并未提供比较基准。