十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

chibicc 实战:如何用这个 C11 编译器编译 Hello World 并逐步调试到汇编输出

chibicc 实战:如何用这个 C11 编译器编译 Hello World 并逐步调试到汇编输出 chibicc 实战如何用这个 C11 编译器编译 Hello World 并逐步调试到汇编输出【免费下载链接】chibiccA small C compiler项目地址: https://gitcode.com/gh_mirrors/ch/chibiccchibicc 是一个小巧而完整的 C11 编译器源码可读性极高能正确编译 Git、SQLite、libpng 等数十万行真实世界代码。本文带你从源码构建 chibicc C 编译器开始一步步编译出你的第一个 Hello World并通过-E、-S、-c等选项逐层调试编译器最终亲眼看到 C 源码变成 x86-64 汇编的完整过程。认识 chibicc为什么适合学编译器原理chibicc 的作者是 LLVM lld 链接器的原作者。它的定位很特别实现几乎全部 C11 必备特性预处理、位域、变长数组、原子变量、线程局部变量、复合字面量等小型编译器常缺的功能它都有每个提交对应一本书的一个章节每个提交都刻意写得为第一次读代码的人而设计是学习编译器原理的绝佳教材四阶段架构清晰分词Tokenize→ 预处理Preprocess→ 递归下降解析Parse→ 代码生成Codegen。项目源码非常精简核心文件一览模块职责文件命令行驱动参数解析、调度各阶段、调用汇编器与链接器main.c分词器把源代码切分为 Token 链表tokenize.c预处理器展开宏、处理#include等指令preprocess.c解析器构建带类型信息的 ASTparse.c代码生成器遍历 AST 输出 x86-64 汇编文本codegen.c公共定义Type、Node、Token 等核心数据结构chibicc.h编译器随附的标准头文件如 include/stdarg.h、include/stdbool.h位于include/目录运行时必须与 chibicc 可执行文件放在同一目录。一键安装步骤5 分钟构建 chibicc 编译器环境要求chibicc 开发平台为 x86-64 LinuxUbuntu 20.04 验证过Debian/Fedora 等主流发行版也可用。只需系统自带 gcc 和 binutilsas、ld。获取源码并构建git clone https://gitcode.com/gh_mirrors/ch/chibicc cd chibicc项目提供了 Makefile直接执行即可make如果系统没有 make也可以按 Makefile 中的编译参数-stdc11 -g -fno-common -Wall -Wno-switch一条命令构建gcc -stdc11 -g -fno-common -Wall -Wno-switch -o chibicc *.c完成后会得到约 300 KB 的chibicc可执行文件——一个完整的 C 编译器就这么小 编译 Hello World第一条命令详解新建hello.c放在任意目录只要include/与 chibicc 在同一级#include stdio.h int main(void) { printf(Hello, world!\n); return 0; }一条命令完成编译 汇编 链接 运行./chibicc -o hello hello.c ./hello输出Hello, world!这一条命令背后main.c 的main()函数依次做了三件事编译fork 子进程运行-cc1模式把hello.c变成汇编文本临时文件汇编调用系统as把汇编变成.o目标文件链接调用ld加入crt1.o、libc、libgcc等生成最终可执行文件见 main.c 的run_linker。 小贴士如果链接时看到missing .note.GNU-stack section警告属新版 ld 的正常提示不影响程序运行。逐步调试编译器-E / -S / -c 三步拆解chibicc 完美复刻了 gcc 的分阶段选项这正是它好懂的精髓——你可以随时拆开编译流程看每一层的产物。第一步-E 只看预处理输出./chibicc -E hello.c输出的是宏展开、#include合并后的纯 C 代码stdio.h的内容全部内联进来。这一阶段对应 preprocess.c源码中的实现入口是 main.c 的print_tokens函数。第二步-S 输出汇编看到 main 函数长这样./chibicc -S -o hello.s hello.c打开hello.s跳过开头的.file标记核心代码一目了然.globl main .type main, function main: subq $16, %rsp movl $.L.str, %edi movq %rsp, %rax ... call printf xorl %eax, %eax addq $16, %rsp ret每行汇编都能追溯到 codegen.c 中的生成逻辑——没有优化 pass指令朴素到近乎人话非常适合对照 C 源码逐行理解调用约定x86-64 System V ABI。第三步-c 只编译到目标文件./chibicc -c -o hello.o hello.c生成hello.o后停止不做链接。这正是 Makefile 中跑测试用例时采用的方式先用 chibicc 编译.c再用系统 gcc 链接测试运行库 test/common。隐藏大招-### 打印内部子进程命令加上-###后chibicc 会把每一步实际执行的子进程命令打印出来见 main.c相当于编译器的调试日志./chibicc -### -o hello hello.c你能清楚看到它 fork 出的-cc1编译进程、as汇编命令和ld链接命令彻底看懂编译器驱动是怎么工作的。进阶用 chibicc 跑自己的测试集仓库自带 40 多个覆盖 C11 特性的测试用例test/ 目录比如 test/control.c 测控制流、test/atomic.c 测原子操作。构建后执行make test即可用刚编译出的 chibicc 自举验证全部用例。更有趣的还有二阶段自举make test-stage2先用 gcc 构建的 chibicc 编译 chibicc 自己stage2 版本再用它跑同一套测试——这是检验编译器正确性的黄金标准。常见问题 FAQQ1为什么运行 chibicc 时找不到 stddef.h 之类的头文件chibicc 从可执行文件同级的./include目录加载自己的标准头main.c构建后请把include/目录保留在 chibicc 旁边。Q2chibicc 生成的程序速度和 gcc 比如何README 中作者坦言没有优化 pass生成的代码可能比 gcc 慢两倍以上。它是学习编译器而非生产工具追求的是简单和可读。Q3哪些 C11 特性不支持复数complex、KR 风格函数原型、GCC 内联汇编不支持digraph 和 trigraph 是刻意省略的。详见 README.md 的 Status 一节。总结用 chibicc 走完Hello World → 汇编的完整链路只需记住四步git clone 一条 gcc 命令构建编译器./chibicc -o hello hello.c ./hello跑通第一个程序-E→-S→-c逐层拆解看预处理、汇编、目标文件用-###观察内部调度再读 main.c、codegen.c 对应源码。chibicc 的每个提交都是为第一次读编译器源码的人精心书写的配合本文的命令实验它是从零理解 C 编译器原理的最短路径之一。祝你玩得开心【免费下载链接】chibiccA small C compiler项目地址: https://gitcode.com/gh_mirrors/ch/chibicc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表