page contents

用 Python 写 C 编译器?这个 GitHub 神仙项目,降维打击学习编译原理!

老铁们,咱就是说,有时候在 GitHub 上闲逛,真能挖到宝,一个项目标题直接给我干精神了——ShivyC。你猜这是啥?一个用 Python 3 写的 C 语言编译器!

attachments-2025-12-oTlx1R9j6953290fc3633.png老铁们,咱就是说,有时候在 GitHub 上闲逛,真能挖到宝,一个项目标题直接给我干精神了——ShivyC。你猜这是啥?一个用 Python 3 写的 C 语言编译器!

这玩意儿有啥了不起的?

可能有些刚入门的朋友会问:“不就是个编译器吗?我 gcc hello.c 一敲,不就完事儿了?”

哎,此言差矣。编译器这东西,可以说是计算机科学皇冠上的明珠。它连接了人类能看懂的高级语言和机器能执行的二进制码,是整个软件世界的地基。我们平时觉得理所当然的 gccclang,背后是几十年、无数顶尖大佬智慧的结晶,复杂得像一座迷宫。

它最大的价值,不是去替代 GCC,而是降维打击了学习编译原理的难度。让你能像看故事一样,理解我们写的 C 代码,到底是怎么一步步变成机器指令的。

别光说,上手试试!

这项目最骚的一点是,用起来简单到令人发指。作者把所有复杂的依赖都给你搞定了。只要你电脑上有 Python 3.6+,在 Linux 环境下,两步就搞定:

1. 安装:

pip3 install shivyc

2. 编译运行:

整个经典的 hello.c:

#include <stdio.h>

int main() {

  printf("hello, world!\n");

}

然后,见证奇迹的时刻:

$ shivyc hello.c  # 编译

$ ./out           # 运行

hello, world!

就这么简单!没有复杂的 Makefile,没有成吨的依赖库要装。一个 pip 命令,一个编译命令,程序就跑起来了。作者甚至贴心地为非 Linux 用户准备了 Docker 环境,简直是保姆级服务。

庖丁解牛:ShivyC 是怎么把 C 代码变成可执行文件的?

这才是最精彩的部分。ShivyC 的代码结构非常清晰,完美地展示了一个编译器的工作流。我给你用大白话捋一捋,它拿到你的 hello.c 之后,都干了些啥。

这整个过程,就像一个高度精密的翻译工厂:

步骤ShivyC 内部模块干的活儿我们的比喻
1. 预处理preproc.py把注释干掉,把 #include 的头文件内容“粘”进来。小秘书:在正式开会前,把资料整理干净,把附件都订在一起。
2. 词法分析lexer.py把一长串代码,切成一个个有意义的“单词”(Token),比如 intmain(){ 等。单词老师:把一篇英文文章,拆成一个个独立的单词和标点。
3. 语法分析parser/*.py把这些“单词”串起来,建成一棵“语法树”(Parse Tree)。检查语法对不对,比如 if 后面有没有括号。语法老师:检查单词组成的句子,主谓宾是否齐全,语法结构是否正确。
4. 中间代码生成il_gen.py遍历语法树,把它翻译成一种 ShivyC 自定义的、更接近机器码但又与平台无关的“中间语言”(IL)。翻译官:把中文句子,翻译成一种国际通用的“中间语”(比如世界语),方便后续翻译成各种具体语言。
5. 汇编代码生成asm_gen.py把中间语言一条条翻译成 x86-64 架构的汇编代码。这里面还用了一个很牛的寄存器分配算法(Iterated Register Coalescing),这是优化的关键!总工程师:拿着“中间语”说明书,指挥机器(CPU)具体怎么操作,比如把数据搬到哪个寄存器,进行什么计算。

看完这个流程,你是不是瞬间感觉编译器的神秘面纱被揭开了一大半?ShivyC 的牛逼之处就在于,它不仅实现了这个流程,还用非常 Pythonic、非常清晰的代码风格把它展现了出来。每一部分的代码都不算特别长,非常适合我们去阅读、学习,甚至自己动手改改试试。

不只是个玩具,更是艺术品

虽然作者在 README 里很谦虚地说,这项目已经不怎么活跃更新了,不太可能合并大的新功能。但在我看来,这恰恰说明了它的另一个价值:它已经是一件完成度很高的艺术品了

对于所有对底层技术有好奇心的程序员来说,ShivyC 就是这样一个“建筑模型”。你想知道:

  • • 为什么 C 语言里变量要先声明类型?(看看语法分析和类型检查部分)
  • • 函数调用是怎么实现的?参数是怎么传递的?(看看汇编生成里的栈帧操作)
  • • 编译器是怎么决定用哪个 CPU 寄存器来存临时变量的?(这就是那个高大上的“迭代寄存器合并”算法干的活儿)

所有这些问题的答案,都藏在 ShivyC 的源码里,等着你去发现。

代码的世界,真的太酷了。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-12-30 09:23
  • 阅读 ( 51 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1783 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1783 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章