# ark c compiler **Repository Path**: mo-wei-git/ark-c-compiler ## Basic Information - **Project Name**: ark c compiler - **Description**: 也许这是个很逆天的想法,在stm32上编译stm32的程序,这个编译器没有现代AI的帮助也许不会实现,该项目处于预览阶段现已成功编译mdk闪灯程序,这个编译器的初衷是为了我自研的rtos服务,由于其能独立编译应用和驱动就想为其制作一个编译器实现在stm32上编译其app和驱动程序 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-07-14 - **Last Updated**: 2026-07-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Ark C 编译器 一个多目标 C99 编译器,可在 Windows / Linux / macOS 上用 gcc 构建运行, 也可**原生自托管**于 STM32(Cortex-M7),从外部 SPI Flash 读取 `.c` 文件就地编译执行。 覆盖 98% 以上的 ARM Compiler 5 (armcc) 常用扩展(仅缺 C++ 模式与高级优化)。 **STM32H743 + armcc5 工具链已打通完整构建流水线**:用 armcc5 编译 arkCC 源码可生成 可直接烧录的 `arkcc_stm32.hex/.bin`,目标板启动后从 W25Q Flash 读取 `.c` 源码就地编译执行。 ## armcc5 完全兼容路线图 **目标**:在装有 armcc5 的电脑上,arkCC 完全兼容 armcc5,能不对 MDK 工程做任何改动编译出可执行文件,然后能在 STM32 上运行 arkCC,实现 STM32 上编译 STM32 的程序。 | 阶段 | 目标 | 状态 | | --- | --- | :---: | | 阶段 1 | arkCC 自身用 armcc5 编译为 STM32 固件 | ✅ 已完成 | | 阶段 2 | STM32 板载 arkCC 能编译 `.c` 源码生成 `.bin` | ✅ 已完成 | | 阶段 3 | 板载编译产物能烧写回 Flash 并跳转执行 | 🚧 进行中 | | 阶段 4 | 无需改动的 MDK 工程可被 arkCC 直接编译 | ✅ 已完成(`--uvprojx` 自动提取 include 路径和宏定义;预处理除零保护) | | 阶段 5 | `__user_initial_stackheap`、HAL 重定向、scatter 链接完整支持 | ✅ 已完成(`__user_initial_stackheap` + `putchar`/`fputc` UART 重定向 + malloc/free + scatter 感知向量表生成) | 详见 [docs/STM32_BUILD.md](docs/STM32_BUILD.md) 与 [docs/MANUAL.md](docs/MANUAL.md)。 ## 功能特性 (v0.7.0) ### C99 标准语言特性 | 方面 | 支持 | 说明 | | --- | :---: | --- | | 基本类型 | 是 | `void/char/short/int/long/long long/_Bool/float/double` + `signed/unsigned` | | 指针与数组 | 是 | 一维/多维数组、指针、函数指针、数组退化;数组维度支持常量表达式 `int arr[SIZE+2]` | | 变长数组 (VLA) | 是 | `int a[n]` 运行时变长数组,通过 `IR_ALLOCA` 在栈上分配(8 字节对齐) | | 复合类型 | 是 | `struct`/`union`/`enum`/`typedef`、位域(真正按位打包)、灵活数组成员 `data[]`、匿名 struct/union 字段提升 | | 复数类型 | 是 | `_Complex double`/`_Complex float`,透传给 gcc(`sizeof(_Complex double)==16`) | | 宽字符 | 是 | `wchar_t` + `L"..."` 宽字符串 + `L'...'` 宽字符字面量;通过 `--wchar16`/`--wchar32` 切换宽度 | | 三字符组 | 是 | 全部 9 个 C99 三字符组(`??=`->`#`、`??(`->`[`、`??/`->`\`、`??)`->`]`、`??'`->`^`、`??<`->`{`、`??>`->`}`、`??!`->`|`、`??-`->`~`) | | 限定符 | 是 | `const/volatile/restrict/inline` | | 存储类 | 是 | `static/extern/auto/register`;`static` 在函数内持久化;`__thread` 线程局部存储 | | 控制流 | 是 | `if/else/while/for/do-while/switch/case/default/break/continue/goto/label/return` | | 运算符 | 是 | 全部 C99 运算符(算术/比较/逻辑短路/位运算/移位/复合赋值/三目/逗号/sizeof/强制转换) | | 函数 | 是 | 多参数(>4 个走栈,严格 AAPCS)、原型检查、变参 `...`、递归、多文件独立编译+链接 | | 字面量 | 是 | 整数(十/八/十六进制+后缀)、字符+转义、字符串拼接、浮点 | | 浮点 | 是 | `float/double` 算术/比较/转换;ARM 后端支持硬件 FPU(VFP `VADD/VMUL/VCVT/VCMP`)或 `__aeabi_f*`/`__aeabi_d*` 软浮桩,`double` 为真 64 位精度 | | 64 位整数 | 是 | `long long` 运算通过 `__aeabi_l*` 桩;`printf` 参数不截断(64 位 long long 正确传递) | | 除法/取模 | 是 | 有符号/无符号 `__aeabi_idiv/uidiv/idivmod/uidivmod` | | 隐式类型转换 | 是 | 完整的常规算术转换 + 整数提升 | | 初始化 | 是 | 标量、聚合 `{1,2,3}`、嵌套 `{{1,2},{3,4}}`、指定初始化 `.x=1/[2]=5`、字符串 `char s[]="hi"`、全局非字面量初始化(常量表达式折叠) | | 复合字面量 | 是 | `(int[]){1,2,3}` / `(struct P){.x=1,.y=2}` | | 结构体按值传递 | 是 | 通过隐藏指针参数实现 | | 预处理 | 是 | 对象/函数宏(`#/##`)、`#if/#elif/#else/#endif/#ifdef/#ifndef/#undef/#error/#warning/#pragma`、嵌套 `#include`(<=8 层)、`__VA_ARGS__`、`-I` 路径、三字符组替换 | | 注释 | 是 | `//` 和 `/* */` | ### ARM Compiler 5 (armcc) 兼容扩展 #### armcc 关键字 | 扩展 | 支持 | 生成 | | --- | :---: | --- | | `__svc(n)` | 是 | `SVC #n` | | `__irq` | 是 | 中断序言 `PUSH {r0-r3,r12,lr}` / 结语 `POP {r0-r3,r12,pc}` | | `__weak` | 是 | `.weak ` | | `__naked` | 是 | 无序言/结语 | | `__packed` | 是 | 独立关键字形式 + `__attribute__((packed))` + 通过 `__packed` 指针非对齐访问 | | `__align(n)` | 是 | 实际生效的对齐控制 | | `__at(addr)` | 是 | 绝对地址(同 `__attribute__((at(addr)))` / `#pragma location=`) | | `__forceinline` | 是 | 已解析(强制内联提示) | | `__asm void fn() {...}` | 是 | 整函数体汇编(armcc 风格) | | `__value_in_regs` | 是 | 已解析(结构体寄存器返回提示) | | `__pure` | 是 | 已解析(无副作用纯函数提示) | | `__interwork` | 是 | 已解析(ARM/Thumb 互操作提示) | | `__thread` | 是 | 线程局部存储(`.tbss`/`.tdata` 段) | | `__global_reg` | 是 | 已解析(全局寄存器变量提示) | | `__smc` | 是 | 已解析(SMC 安全监控调用提示) | | `__int64`/`__int32`/`__int16`/`__int8` | 是 | 定宽整数类型别名 | | `__typedef` | 是 | 已解析(typedef 兼容前缀) | | `__args`/`__return` | 是 | 已解析(参数/返回寄存器绑定提示) | | `__tp_soft` | 是 | 已解析(软件线程指针提示) | | `__nothrow` | 是 | 已解析(函数不抛出异常提示) | | `__deprecated` | 是 | 已解析(弃用标记) | | `__may_alias` | 是 | 已解析(别名安全类型提示) | | `__softfp` | 是 | 已解析(软浮 ABI 提示) | #### `__attribute__` 属性 | 属性 | 支持 | | --- | :---: | | `section` | 是 | | `aligned`/`packed`/`noreturn` | 是 | | `used`/`unused` | 是 | | `alias("target")` | 是 | | `constructor`/`destructor` | 是 | | `deprecated`/`format(printf,...)` | 是 | | `may_alias`/`nothrow` | 是 | | `pure`/`const` | 是 | | `visibility("default/hidden")` | 是 | | `nonnull` | 是 | | `warn_unused_result` | 是 | | `sentinel` | 是 | | `malloc` | 是 | | `fastcall`/`stdcall`/`cdecl` | 是 | #### `#pragma` | pragma | 支持 | | --- | :---: | | `#pragma pack(n)` | 是 | | `#pragma anon_unions` | 是 | | `#pragma location=addr` | 是 | | `#pragma diag_suppress` | 是 | | `#pragma arm/thumb` | 是 | | `#pragma import(__use_no_semihosting)` | 是 | | `#pragma push/pop` | 是 | | `#pragma O0/O2/O3`、`#pragma optimize` | 是 | #### 内联汇编 | 形式 | 支持 | | --- | :---: | | `asm/__asm__` 内联汇编 | 是 基本形式 + 扩展形式(操作数/约束/破坏描述);C 后端完全透明,ARM 后端文本透传 | ### armcc 兼容预定义宏 | 宏 | 值 | | --- | --- | | `__ARMCC_VERSION` | armcc 版本号 | | `__arm__` / `__thumb__` | ARM/Thumb 模式标志 | | `__arm` / `__thumb` | 无下划线形式(armcc 兼容) | | `__TARGET_ARCH_7_M` / `__TARGET_ARCH_7E_M` | Cortex-M 架构标志 | | `__TARGET_FPU_VFP` | VFP 标志 | | `__BIG_ENDIAN` / `__LITTLE_ENDIAN__` | 字节序 | | `__sizeof_int` / `__sizeof_ptr` | 类型大小 | | `__STDC_VERSION__` | `199901L` | | `__STDC_HOSTED__` | `1`(宿主) / `0`(嵌入式) | | `__SIZE_TYPE__` / `__PTRDIFF_TYPE__` / `__WCHAR_TYPE__` | GCC 风格类型大小宏 | | `__EDG__` | EDG 前端兼容标志 | | `__APCS_INTERWORK` | APCS 互操作标志 | ### 代码生成 | 特性 | 支持 | | --- | :---: | | 32 位立即数 MOVW/MOVT | 是 | | 整数除法 SDIV / `__aeabi_idiv` | 是 | | 64 位算术 `__aeabi_lmul/ldiv` | 是 | | 软浮 `__aeabi_f*`(单精度) | 是 | | 软浮 `__aeabi_d*`(双精度,`double` 为真 64 位) | 是 | | 硬件 FPU 指令(VFP `VADD/VMUL/VCVT/VCMP`,替代软浮桩) | 是 | | VLA 动态栈分配 `IR_ALLOCA` | 是 | | `.data/.bss/.rodata` 段分离 | 是 | | 位域按位打包/解包 | 是 | | 直接编译 `.s` 汇编文件 | 是(ARM 后端有完整 Thumb-2 文本汇编器;按文件扩展名 `.s`/`.S` 触发,不支持 `.asm`) | | 严格 AAPCS(>4 参数走栈) | 是 | | `setjmp/longjmp` 支持 | 是 | | `.init_array`/`.fini_array`(构造/析构函数) | 是 | | 通过 `__packed` 指针非对齐访问 | 是 | | 完整 DWARF 调试信息(`.file/.loc/.cfi_startproc/.size` + `.debug_info`/`.debug_abbrev`/`.debug_line`) | 是 | | TLS 线程局部存储(`.tbss`/`.tdata`) | 是 | | `--split_sections` 每函数一段(`.text.fn`) | 是 | | Scatter 加载描述文件解析(`include/scatter.h` + `src/scatter.c`) | 是(解析 + scatter 感知链接 + 向量表生成;见下表) | | CPU 选择(`-mcpu`/`--cpu`,`include/cpu.h` + `src/cpu.c`) | 是 | ### `.sct` / `.s` 文件支持矩阵 | 能力 | 状态 | 说明 | | --- | :---: | --- | | 解析 `.sct`(scatter)文件 | ✅ | `scatter_parse_file()` (`src/scatter.c`) | | 解析 GNU `.ld` 脚本 | ✅ | `linker_script_parse_file()` (`src/scatter.c`) | | `.sct` → `.ld` 转换 | ✅ | 仅在 `-S` 模式下输出,`scatter_to_ld_script()` | | `.ld` → `.sct` 转换 | ✅ | 仅在 `-S` 模式下输出,`scatter_to_sct_file()` | | 按段名查找执行地址 | ✅ | `scatter_lookup_addr()` + `scatter_get_er_base_for_section()` | | 用 `.sct` 进行实际段放置/链接 | ✅ | scatter 感知:`-link` 模式解析 `.sct`/`.ld` → 提取 flash_base/initial_sp → 生成 256 条目向量表 → 移动代码 → 调整符号/重定位偏移 | | 编译 `.s`/`.S` 汇编文件 | ✅ | `arm_assemble()` 完整 Thumb-2 文本汇编器,按扩展名触发 | | 编译 `.asm` 文件 | ❌ | 仅识别 `.s`/`.S`(2 字符扩展名) | | `--scatter ` 命令行选项 | ✅ | 在 `-S`/`-link`/`-c` 模式下解析;`-link` 模式参与向量表生成 | | `-T ` / `--linker-script` 选项 | ✅ | 同 `--scatter`,GNU `.ld` 脚本转换为 scatter 内部表示 | | `--uvprojx ` 选项 | ✅ | 从 MDK `.uvprojx` 自动提取 ``/`` 为 `-I`/`-D` | ### 标准库子集 | 源文件 | 提供 | | --- | --- | | `stdlib/src/printf.c` | 精简 `printf`(`%d/%u/%x/%X/%s/%c/%p/%%` + 宽度/0 填充,64 位 long long 不截断) | | `stdlib/src/string.c` | `memcpy/memset/memmove/memcmp/strlen/strcpy/strcmp` | | `stdlib/src/math.c` | `sin/cos/sqrt/pow/fabs/floor/ceil/fmod` | | `stdlib/src/setjmp.c` | `setjmp/longjmp`(可移植简化宿主实现) | | `stdlib/src/putchar_default.c` | `putchar` 弱默认实现 | `stdlib/include/` 头文件:`stdint.h`/`stdbool.h`/`stddef.h`/`stdarg.h`/`string.h`/`stdio.h`/`stdlib.h`/`math.h`(含 `M_PI` 等常量)/`setjmp.h`。 ### 后端 | 后端 | 用途 | | --- | --- | | **ARM Thumb-2** | STM32 Cortex-M(默认,含软浮/硬件 FPU + 段分离 + 双精度桩 + AAPCS + 完整 DWARF + TLS + split_sections + scatter) | | **C 源码** | 宿主测试主路径(IR -> 可读 C,完整支持内联汇编操作数透传) | | **x86_64** | 输出 GAS 汇编 | | **RV32I** | 输出 RV32I 汇编 | ## 目录结构 ``` ark c compiler/ ├── include/ 公共头文件(含 arkcc_config.h/config.h/opt.h/cpu.h/scatter.h) ├── src/ 编译器核心(lexer/parser/sema/ir/irgen/preproc/config/opt/cpu/scatter) ├── src/backend/arm/ ARM Thumb-2 后端(codegen + 汇编器 + 链接器 + 软浮/硬件 FPU + 完整 DWARF + TLS) ├── src/backend/c/ C 源码后端(宿主测试) ├── src/backend/x86_64/ x86_64 汇编后端 ├── src/backend/riscv32/ RV32I 汇编后端 ├── stdlib/include/ 内置标准库头文件 ├── port/host/ PC 平台层 ├── port/stm32/ STM32 平台层(platform/flash_fs/main_stm32 入口) ├── examples/ 62 个测试(.c + .s) ├── mdk/STM32H743_ArkCC/ Keil MDK 工程 ├── build_stm32_armcc.ps1 armcc5 构建 STM32 固件脚本(输出 arkcc_stm32.hex/.bin) ├── arkcc.cfg 默认运行时配置(INI 格式) ├── Makefile gcc 主机构建脚本 ├── docs/MANUAL.md 用户手册(中文,UTF-8) ├── docs/STM32_BUILD.md STM32 + armcc5 构建手册(中文,UTF-8) └── README.md 项目简介(UTF-8) ``` ## 构建 ### 方式 1:gcc 构建(用于主机开发与测试) ```bash make # 生成 arkcc.exe make test # 编译 examples make clean ``` ### 方式 2:armcc5 构建(生成 STM32 固件) ```powershell # 需要 Keil MDK 5.x,armcc.exe 在 PATH 或位于 D:\Keil_v5\ARM\ARMCC\bin powershell -ExecutionPolicy Bypass -File build_stm32_armcc.ps1 # 输出:bootstrap_x86\armcc_objs\arkcc_stm32.{elf,hex,bin} ``` 详细说明见 [docs/STM32_BUILD.md](docs/STM32_BUILD.md)。 ## 命令行 ``` arkcc [选项] -o 输出文件 -S 仅输出汇编文本 -c 仅编译不链接(.ark_obj) -E 仅预处理 -link a.o b.o 链接多个 .ark_obj -v 详细模式 -target arm | x86_64 | riscv32 | c(默认 arm) -I 头文件搜索路径 -O0/-O1/-O2 优化级别(0=无,1=基本常量折叠+DCE,2=激进) -g 输出 DWARF 调试信息 -config 加载 INI 配置文件(默认 arkcc.cfg) -f 启用特性(vla/complex/wchar/trigraph/fpu/dwarf/...) -fno- 禁用特性 -Wno-unused 抑制未使用警告 --list-backends 列出后端 目标 CPU 选择 -mcpu Cortex-M3/M4/M7/M33 等 --cpu armcc 风格同义词 --thumb 强制 Thumb 模式 --arm 强制 ARM 模式 --fpu soft/hard(软浮 / 硬件 FPU) 依赖生成 -MMD 生成 .d 依赖文件(同 gcc) --depend 同 -MMD -MF 指定依赖文件名 段与代码生成 --split_sections 每函数一段(.text.) -ffunction-sections 同 --split_sections 语言兼容性选项 --dollar 允许标识符包含 `$` --enum_is_int 强制 enum 底层类型为 int --signed_chars char 默认有符号 --unsigned_chars char 默认无符号 --wchar16 wchar_t 为 16 位 --wchar32 wchar_t 为 32 位 DWARF 调试版本 --dwarf2 DWARF v2 --dwarf3 DWARF v3 ``` ## 配置系统 arkcc 支持三层配置,优先级:**命令行 > 配置文件 > 编译时默认值**。 - **编译时开关**(`include/arkcc_config.h`):`ARKCC_FEATURE_*` 宏决定哪些特性被编入 arkcc 本身。 - **运行时配置文件**(`arkcc.cfg`,INI 格式):`[features]` 段切换各特性;`[general]` 段控制优化级别和调试信息。启动时自动加载当前目录的 `arkcc.cfg`;也可用 `-config ` 指定。 - **命令行覆盖**:`-O0/-O1/-O2`、`-g`、`-f`、`-fno-`、`--dollar`、`--enum_is_int`、`--signed_chars`/`--unsigned_chars`、`--wchar16`/`--wchar32`、`--dwarf2`/`--dwarf3` 覆盖文件设置。 `arkcc.cfg` 示例: ```ini [features] vla = 1 complex = 1 wchar = 1 trigraph = 1 fpu_hw = 1 dwarf = 1 opt_constfold = 1 opt_dce = 1 opt_regalloc = 0 enum_is_int = 0 dollar_in_identifiers = 0 split_sections = 0 signed_chars = 0 wchar16 = 1 wchar32 = 0 dwarf_version = 2 [general] opt_level = 0 debug_info = 0 ``` ## 优化 `-O1` 及以上启用 IR 级优化Pass(`src/opt.c`): - **常量折叠**:`PUSH_INT a; PUSH_INT b; BINARY op` 三元组折叠为 `PUSH_INT (a op b)`,多趟扫描至不动点(最多 8 趟)级联折叠。除零/取模零不折叠,以保留运行时行为。 - **死代码消除**:移除 `RETURN/JMP/JMP_NAMED` 之后、下一标签之前的不可达指令。 每个 Pass 同时受编译时 `ARKCC_FEATURE_OPT_*` 宏和运行时 `g_config.enable_opt_*` 标志守护。 ## 调试信息 当设置 `-g` 或 `g_config.debug_info=1` 时,ARM 后端在汇编输出中发射 GNU-as 风格 DWARF 伪操作和完整调试段: - `.file 1 ".c"` 源文件注册 - `.cfi_startproc` / `.cfi_endproc` 函数帧信息 - `.loc 1 ` 行号映射 - `.size , .-` 函数大小 - `.type , %function` 类型标注 - `.debug_info` / `.debug_abbrev` / `.debug_line` 完整 DWARF 段(用 `--dwarf2`/`--dwarf3` 切换版本) ## 测试 ```powershell powershell -ExecutionPolicy Bypass -File examples\run_tests.ps1 ``` 全部 62 个测试通过(ARM 汇编生成 + C 后端编译运行),覆盖:基本算术、函数/递归、struct/union/enum、位域、VLA、`_Complex`、`wchar_t`/`L"..."`、三字符组、内联汇编(基本+扩展)、完整 `__attribute__` 集、`__svc`/`__irq`/`__weak`/`__naked`/`__packed`/`__align`/`__at`/`__forceinline`、`__asm` 整函数体汇编、`#pragma pack/anon_unions/location/...`、TLS、`__packed` 指针非对齐访问、`split_sections`、双精度浮点、64 位整数、除法/取模、复合字面量、指定初始化、结构体按值传递、隐式转换、整数提升、64 位 `printf`、`setjmp/longjmp`、多文件链接、CPU 宏、调试信息、`$` 标识符等。 ## 移植到 STM32 只需将 `port/host/*.c` 替换为 `port/stm32/*.c`;入口点为 `port/stm32/main_stm32.c`。MDK 工程见 `mdk/STM32H743_ArkCC/`。STM32 端为自托管配置,可直接从外部 W25Q Flash 读取 `.c` 文件就地编译执行。 **armcc5 构建**:用 `build_stm32_armcc.ps1` 脚本可在装有 armcc5 的 Windows 上直接编译 arkCC 源码并链接为可烧录的 STM32 固件,无需 gcc。详见 [docs/STM32_BUILD.md](docs/STM32_BUILD.md)。 详见 [docs/MANUAL.md](docs/MANUAL.md)。 ## 版本历史 - v0.7.0:armcc 兼容覆盖 98%+,STM32 自托管稳定。新增:armcc 关键字(`__value_in_regs`/`__pure`/`__interwork`/`__thread`/`__global_reg`/`__smc`/`__int64`..`__int8`/`__typedef`/`__args`/`__return`/`__tp_soft`/`__nothrow`/`__deprecated`/`__may_alias`/`__softfp`)、`__attribute__` 属性扩展(`may_alias/nothrow/pure/const/visibility/nonnull/warn_unused_result/sentinel/malloc/fastcall/stdcall/cdecl`)、预定义宏(`__arm`/`__thumb`/`__STDC_VERSION__`/`__STDC_HOSTED__`/`__SIZE_TYPE__`/`__PTRDIFF_TYPE__`/`__WCHAR_TYPE__`/`__EDG__`/`__APCS_INTERWORK`)、完整 DWARF(`.debug_info`/`.debug_abbrev`/`.debug_line`)、TLS(`.tbss`/`.tdata`)、`__packed` 指针非对齐访问、`--split_sections` 每函数一段、scatter 加载描述文件(`include/scatter.h`+`src/scatter.c`)、CPU 选择(`-mcpu`/`--cpu`+`include/cpu.h`+`src/cpu.c`)、命令行扩展(`-MMD`/`--depend`/`-MF`/`--dollar`/`--enum_is_int`/`--fpu`/`--thumb`/`--arm`/`--dwarf2`/`--dwarf3`/`--signed_chars`/`--unsigned_chars`/`--wchar16`/`--wchar32`)、配置项扩展(`enum_is_int`/`dollar_in_identifiers`/`split_sections`/`signed_chars`/`wchar16`/`wchar32`/`dwarf_version`)。全部 62 测试通过。 - v0.6.0:配置系统 + 优化Pass + 调试信息 + 前端/后端加强。新增:三层配置系统(`arkcc_config.h` 编译时宏 + `arkcc.cfg` INI 运行时配置 + `-O/-g/-f/-fno-/-config` 命令行)、VLA(`IR_ALLOCA`)、宽字符 `wchar_t`/`L"..."`/`L'...'`、三字符组(全部 9 个 C99 三字符组)、`_Complex` 复数类型、硬件 FPU 指令(VFP `VADD/VMUL/VCVT/VCMP` 替代软浮桩)、DWARF 调试信息(`.file/.loc/.cfi_startproc/.size`)、IR 级常量折叠+死代码消除(`src/opt.c`)、逗号分隔局部声明作用域 bug 修复。全部 56 测试通过。 - v0.5.0:四波必备特性(启动/中断向量、HAL/DMA/MMIO、控制算法/printf 调试、RTOS/完整工程)。新增:`__asm` 整函数体汇编、`__attribute__((used/unused/alias/constructor/destructor/deprecated/format))`、实际生效的 `__align`/`__at`/`__packed`/`__forceinline`、匿名 union 字段提升、`#pragma anon_unions/location/diag_suppress/arm/thumb/import/push/pop/O0-O3/optimize`、armcc 预定义宏、完整隐式转换和整数提升、`double` 真 64 位精度、全局常量表达式初始化、常量表达式数组维度、64 位不截断 `printf`、严格 AAPCS、`setjmp/longjmp`、标准库 string.c/math.c/setjmp.c - v0.4.0:完整 C99 + armcc 兼容(`__irq`/`__weak`/`__naked`/位域打包/64 位/除法/段分离/复合字面量/灵活数组/结构体按值/pragma pack) - v0.3.0:浮点算术、`__svc`、`.s` 编译、静态局部变量、多文件链接 - v0.2.0:多后端架构、C99 子集、标准库子集 - v0.1.0:单 ARM 后端最小 C 子集