标签 编译原理 下的文章

是的,这又是一个教你写个编译器的教程。

你可能已经见过无数个教你写编译器的教程了,但它们也许或多或少存在各种问题,导致你看了它们之后,依然觉得无从下手:

  • 教程并非面向“零编译器基础”的人群,理解起来比较费劲。
  • 只教了怎么做一个编译器,但没教为什么这么做,读完之后还是觉得一头雾水。
  • 开始编码之前,需要复杂的环境配置,开局劝退。
  • 上来先做和“编译一个程序”这件事八竿子打不着的东西,跟着教程学一个月才能看到自己的编译器编出一个能跑的程序,反馈周期过长。
  • 最终写出来的只是个解释器,或者不能编译到真实的 ISA(例如输出了某种字节码),或者高度依赖其他框架(例如 LLVM),让人体会不到那种“我真的写出个编译器”的成就感,以及“所有事情都由自己实现”的酣畅感。
  • 实现的编译器只能编译一些过于简单的程序,比如排序算法等等,看起来非常无聊。谁会没事干排序玩啊?
  • 教程及其配套资源非中文,或需要付费,且不开源。

研究生期间,我一直在担任本科编译原理课程的助教。为了让本科生更好地理解编译器工作的原理,在参考多个其他教程之后,我设计了一套全新的,教你从零开始写个编译器的教程:

- 阅读剩余部分 -

SSA, 静态单赋值形式, 是 “单赋值” 的, 所有的量都只会被赋值一次.

在控制流汇聚的时候, 我们可能需要在汇点后的控制流中取得汇点前的多个控制流中更新过后的数据. 此时, 由于其单赋值的特性, 我们没办法简单地表示, 我们拿到的具体是哪一个数据.

为了解决这个问题, Phi 函数应运而生.

- 阅读剩余部分 -

文章版权所有:MaxXing。
转载须注明来源及原作者,侵权必究!

导言:

轮子哥(@vczh)曾有一言,为我们指出了他心中的程序员的三大浪漫
——操作系统、编译原理和图形学。

操作系统的构建在外行人眼中难比登天。而实际上,从零开始编写、调试乃至最终实现一个具有较高完成度的操作系统(内核)也不算是一件容易的事情。

计算机图形学同样是计算机科学的一个庞大分支。若想在其中做出一番成果,提高自身的数学水平、建模技巧,以及阅读大量论文,对于个人而言都是必不可少的。

而入门级别的编译原理——或者实际一点:小到解析爬虫取回的数据、解析 JSON,大到实现一个小型的解释器/编译器——都不算是一件过于复杂的事情。这便是一条适合初学者踏足的道路,于是我选择了这条路。

在大一下半学期的一学期时间中,我创建了两个项目:一个是致力于提供程序跨平台和运行时支持的虚拟机 ZexVM,另一个是一种自制编程语言的编译器 Saby。这两个项目将仅作为一次尝试,以便我日后深入研究编译原理这一门学科。

- 阅读剩余部分 -