Hacker News 中文摘要

RSS订阅

SDCC:小型设备C编译器 -- SDCC – Small Device C Compiler

SDCC 是一套可重定向的优化标准 C(ANSI C89、ISO C99、ISO C11、ISO C23)编译器套件,面向英特尔(Intel)MCS51 系列微处理器(8031、8032、8051、8052 等)、美信(Maxim)DS80C390 变体、飞思卡尔(Freescale)HC08 系列、Zilog Z80 系列 MCU、Padauk(pdk14、pdk15)、意法半导体(STMicroelectronics)STM8、MOS 6502 和 WDC 65C02。对 Rabbit 5000、6000、Padauk pdk13 及 f8、f8l 的支持仍在开发中,Microchip PIC16 和 PIC18 目标已无人维护,SDCC 也可重定向到其他微处理器。

正文

什么是 SDCC?

SDCC 是一个可重定向、优化的标准 C(ANSI C89、ISO C99、ISO C11、ISO C23)编译器套件,目标处理器包括基于 Intel MCS51 的微处理器(8031、8032、8051、8052 等)、Maxim(原 Dallas)DS80C390 系列、基于 Freescale(原 Motorola)HC08 的(hc08、s08)、基于 Zilog Z80 的 MCU(Z80、Z80N、Z180、SM83、Rabbit 2000/2000A/3000A/4000、TLCS-90、eZ80、R800)、Padauk(pdk14、pdk15)、意法半导体 STM8、MOS 6502 和 WDC 65C02。目前正在支持 Rabbit 5000/6000、Padauk pdk13 以及 f8 和 f8l 目标;Microchip PIC16 和 PIC18 目标已不再维护。SDCC 也可重定向到其他微处理器。

SDCC 套件是源自不同地方、采用不同自由开源软件许可证的若干组件集合,包括:

  • sdas 和 sdld:可重定向汇编器和链接器,基于 ASXXXX,由 Alan Baldwin 编写(GPL)。
  • sdcpp 预处理器:基于 GCC cpp(GPL)。
  • ucsim 模拟器:最初由 Daniel Drotos 编写(GPL)。
  • sdcdb 源码级调试器:最初由 Sandeep Dutta 编写(GPL)。
  • sdbinutils 库归档工具(含 sdar、sdranlib、sdnm):派生自 GNU Binutils(GPL)。
  • SDCC 运行时库(GPL+LE)。其中 Pic 设备库和头文件派生自 Microchip 头文件(.inc)和链接脚本(.lkr)。Microchip 要求“头文件应声明仅用于正版 Microchip 器件”,这使其与 GPL 不兼容。
  • gcc-test 回归测试:派生自 gcc-testsuite(未明确许可,但作为 GCC 一部分可能属 GPL)。
  • packihx(公有领域)。
  • makebin(zlib/libpng 许可证)。
  • sdcc C 编译器:最初由 Sandeep Dutta 编写(GPL)。部分特性包括:广泛的 MCU 特定语言扩展,有效利用底层硬件;大量标准优化,如全局子表达式消除、循环优化(循环不变量、归纳变量强度削弱和循环反转)、常量折叠与传播、复制传播、死代码消除及 switch 跳转表;含全局寄存器分配器的 MCU 特定优化;适用于其他 8 位 MCU 的可适配 MCU 特定后端;独立的基于规则的窥孔优化器;完整数据类型(char 8位、short 16位、int 16位、long 32位、long long 64位、float 4字节 IEEE、_Bool/bool 和 _BitInt);函数任意处加内联汇编的能力;报告函数复杂度以帮助决定改用汇编重写的部分;大量自动化回归测试。

SDCC 最初由 Sandeep Dutta 编写并以 GPL 发布。初始发布后有许多 bug 修复和改进。1999年12月代码移至 SourceForge,所有“用户变开发者”可访问同一源码树。SDCC 不断根据用户和开发者输入更新。

新闻

2026-06-22:SDCC 4.6.0 发布。适用于 STM8、MCS-51、DS390、HC08、S08、Z80、Z180、Rabbit、R800、SM83、Z80 模式 eZ80、Z80N、TLCS-90、MOS 6502、WDC 65C02、Padauk 和 PIC 微处理器的可移植优化编译器的新版本已发布(http://sdcc.sourceforge.net)。提供 GNU/Linux amd64、Windows x86 和 amd64、macOS amd64 的源码、文档和二进制文件。

SDCC 4.6.0 新特性列表:

  • C2y _Countof 运算符
  • C2y 八进制
  • C2y if 声明
  • C2y 省略第二操作数的条件运算符(原 GNU 扩展)
  • C99 复合字面量
  • C23 带存储类说明符的复合字面量
  • 实验性 f8l 移植
  • C2y 宽度为 1 的有符号位精确整数类型
  • C2y 以位精确整数类型作为 enum 固定底层类型
  • C2y umaxabs
  • C2y 位工具
  • realloc(ptr, 0) 改为遵循 C99 语义而非 C90
  • 面向 Rabbit 4000 的 r4k 移植
  • 面向 Rabbit 5000/6000 的实验性 r5k 和 r6k 移植
  • z80 相关移植支持 Dynamic C 调用约定
  • z80 相关移植代码生成大幅改进
  • ez80 移植取代 ez80_z80 移植
  • C2y 函数 uabs、ulabs、ullabs
  • 对无效 C2y 的改进诊断(部分至 C23 前是 UB)
  • C23 constexpr(大部分)
  • C2y containerof 宏
  • 基于 [static 赋值表达式] 数组参数语法的诊断
  • 数组参数访问越界警告
  • 基本参数前向声明(GNU 扩展)
  • C23 va_start 和可变参数函数
  • _Optional 限定符
  • 普通 int 位域为有符号
  • strsep
  • uCsim 中 TLCS-870C(1) 支持
  • Rabbit 移植中 __far 支持以使用 1MB 数据地址空间

2026-06-14:SDCC 4.6.0 RC2 发布。提供 amd64 GNU/Linux、amd64 Windows、amd64 macOS 的源码、文档和二进制包(http://sourceforge.net/projects/sdcc/files/)。

2026-05-28:SDCC 4.6.0 RC1 发布。同上位置提供对应包。

2025-10-15:SDCC 获得资助。SDCC 主要由无酬志愿者开发,偶尔有外部支持(如大学员工带薪兼职、厂商提供硬件样品)。但志愿者时间碎片化导致功能或 bug 修复常被打断,再次上手需额外时间。若有资助,开发者可持续工作而不必返回其他有偿工作。近期两个重要资助申请成功:

NGI0 Commons Fund 捐资改善 SDCC 对各类目标硬件的支持及机器无关的改进以提升对比非自由编译器的竞争力。硬件相关改进包括增强 Padauk 低成本 MCU、Rabbit MCU(旧 IoT 设备常用)和 Toshiba TLCS MCU 支持。机器无关改进聚焦近期 ISO C 标准支持、减少局部变量内存占用的优化,以及链接时优化以剔除未用函数和对象(近年用户最需求特性)。该项目由五位 SDCC 开发者联合完成。

Sovereign Tech Fund 委托改进 SDCC 以增强嵌入式固件安全性。将改进安全相关现代 C 标准支持、为后量子密码学准备、缓解侧信道攻击,并通过扩展测试(覆盖不常用命令行参数组合)提升可靠性。由一位开发者完成。

设想为基于 eZ80 或 Rabbit 4000 SoC 的 IoT 设备写固件:用户将受益于改进的目标架构支持、现代 C 效率与便利特性、高级优化(NGI0 项目),以及安全相关现代 C 特性、无侧信道密码学代码(STF 项目),还有改进测试与修复带来的可靠编译(视情况属 STF 或 NGI0)。

2025-01-28:SDCC 4.5.0 发布。适用于上述微处理器的可移植优化编译器新版本发布(http://sdcc.sourceforge.net)。提供 GNU/Linux amd64、Windows x86/amd64、macOS amd64 的源码、文档和二进制。

SDCC 4.5.0 新特性:

  • msc51 和 ds390 移植的完整 atomic_flag 支持
  • 实验性 f8 移植
  • ISO C2y case 范围表达式
  • ISO C2y 带类型操作数的 _Generic 选择表达式
  • K&R 风格函数语法(初步采用非 K&R ISO 风格函数语义)
  • ISO C23 用户指定底层类型的枚举
  • 初始化器中的 struct/union

支持哪些平台?

GNU/Linux amd64/x86、Microsoft Windows amd64、macOS amd64 是主要的“官方支持”平台。SDCC 在 GNU/Linux 和 macOS 用 gcc 原生编译;Windows 发布和快照构建通过在 Linux 主机交叉编译到 mingw32 生成。SDCC 也已知可在 GNU/Linux aarch64、ppc64、FreeBSD aarch64 工作。Windows 用户可试 Cygwin(https://www.cygwin.com/)或不支持的 MSVC 构建脚本。

下载 SDCC

见 Sourceforge 下载页获取含 Linux amd64、Windows x86/amd64、Mac OS X ppc/amd64 源码和二进制的上个发布版。主要 Linux 发行版自行提供 SDCC 包,但常过时,建议用户自编译最新版或从 Sourceforge 下预编译二进制。SDCC 应能在任何现代类 Unix OS 编译;以下包含在自动化回归测试:Linux x86、FreeBSD aarch64。SDCC 始终活跃开发,若遇 bug 或发布超两月,请考虑下快照构建。可用 Subversion 获取最新开发源码,执行以下命令可获取: svn checkout svn://svn.code.sf.net/p/sdcc/code/trunk/sdcc sdcc 这会在当前目录创建 sdcc 目录并放入全部下载代码,可在线浏览仓库。

报告 bug 前请用 -v 选项查版本和日期并附完整版本串,例如: sdcc/bin > sdcc -v SDCC : mcs51/gbz80/z80/avr/ds390/pic14/TININative/xa51 2.3.8 (Feb 10 2004) (UNIX)

SDCC 的支持

SDCC 及支持包带大量文档和示例。若不足,可到下述地方求助。提高获助几率的简短清单:附上用 SDCC 编译的代码(应能直接编译,片段须完整含头文件);指定运行 SDCC 的确切命令或 Makefile;指定 SDCC 版本(sdcc -v)、平台和系统;提供错误信息或不正确输出的精确拷贝。请务必包含这四点,开发者因缺可重现代码的报告受阻,报 bug 一定要提供样例代码。

网页:您在此。 邮件列表:开发列表 ;用户列表 (首选)。 Bug 报告:附上重现代码和邮箱,也报文档错误。 消息论坛:需 Sourceforge 账号。 开放知识网站:由 Thorsten Godau 维护。

SDCC 是谁开发的?

主要开发者:

  • Sandeep Dutta:原作者。
  • Jean Loius-VERN:后端代码生成大幅改进。
  • Daniel Drotos:8051 免费模拟器。
  • Kevin Vigor:ds390 树大量增强修复。
  • Johan Knol:测试修补 ds390 树。
  • Scott Dattalo:Microchip PIC 目标。
  • Karl Bongers:mcs51 支持、winbin 构建。
  • Bernhard Held:快照构建和日常维护。
  • Frieder Ferlemann:文档和代码生成末段贡献。
  • Jesus Calvino-Fraga:数学函数、AOMF51、链接器改进。
  • Borut Ražem:WIN32 MSC、cygwin、mingw 移植等。
  • Vangelis Rokas:PIC16 目标开发。
  • Erik Petrich:前端、8051、z80、hc08 修复改进。
  • Dave Helton:网站设计。
  • Paul Stoffregen:mcs51 优化和网站维护。
  • Michael Hope:初始 Z80 目标。
  • Maarten Brock:mcs51 等修复改进。
  • Raphael Neider:PIC16 修复优化、完成 PIC14。
  • Philipp Klaus Krause:STM8、f8、Z80 等后端及编译研究。
  • Leland Morrison:Rabbit 2000 支持。
  • Molnár Károly:添加 pic 设备、维护生成脚本。
  • Ben Shi:前端、STM8 和 MCS-51 后端维护。

外部帮助来源:

  • Alan Baldwin:ASXXXX 和 ASLINK 初始版。
  • John Hartman:移植 ASXXXX/ASLINK 到 8051。
  • Dmitry S. Obukhov:malloc 和串口 I/O 例程。
  • Pascal Felber:部分 Z80 文件借自 GBDK。
  • GCC 开发团队:sdcpp 和测试套件基础。
  • GNU Binutils 团队:sdbinutils 基础。
  • Boost 社区:编译器所用 C++ 库。
  • Timo Bingmann:编译器所用 B+ 树模板类。
  • Malini Dutta:Sandeep 妻子,耐心支持。

评论

这场讨论围绕 SDCC 这款老牌开源编译器展开,气氛是务实的「不好用但离不开」:没人否认它毛病多,分歧在于这些毛病能否被「免费、够用」抵消,以及它还该不该往更多 8 位芯片上扩展。一个反直觉的声音则指出,有了 LLM 之后,汇编和 C 之间的落差正在消失。

认为 SDCC 虽然毛病多,但免费且够用

  • 它是 8051 上最好的开源编译器,bug 多到出名,可是不要钱,很多时候这就够了(较多人)
  • 在 8051 和 STM8 上实际使用下来表现足够好(较多人) > 意译:它 bug 多得要命,但它是免费的,有时候这就够了。(@dmitrygr)

希望 SDCC 能覆盖更多 8 位芯片

  • 对 PIC10、PIC12 这类 8 位 PIC 芯片缺乏支持感到遗憾,期待哪天能补上(少数人)

开源编译器的真正价值在于把门槛降下来

  • 有人少年时用 SDCC 写 PIC16,相比手写汇编是巨大进步;家里愿意买编程器,却不肯为商业 C 编译器授权掏钱,缺口正是被 SDCC 填上的(较多人)

有了 LLM 之后,汇编和 C 的差距被抹平了

  • 让 LLM 写整个程序时,用汇编还是用 C 已经差别不大(少数人)

有价值的补充

  • 达拉斯半导体(Dallas Semiconductor)的历史被顺带翻了出来,有老硬件爱好者把它当作「硅草原」传说的一部分来怀念。