我的个人博客:www.moonkite.cn 大家好,我是风筝 前两天看到一个「用200行代码实现编译器」的 GitHub 仓库。这个微型编译器用 JavaScript 实现,最终实现了将类似 Lisp 语法的函数编译为类似C语言的函数。 编译器的作用是什么?就是将一种语言源代码转换成目标语言,这个目标语言可以是另外一种语言,比如 C 语言;可以是中间语言,比如 Java 字节码;还可以直接就是机器码。 作者就是借助 Lisp 的语法格式,以及 C语言的语法格式,将下图中红框中的代码转换为蓝框中的代码。一眼看上去好像很简单,但是编译过程还是很复杂的,如果你之前买过有关编译原理的书,看那书的厚度就应该能看出来。 仓库地址:https://github.com/jamiebuilds/the-super-tiny-compiler 编译原理的过程虽然复杂,但是这么多年来一直都有统一的标准流程,不管是多么简单、多么复杂的编译器一直都是下面这个流程。
如果哪天编译过程能够跳出这个流程,很有可能计算机技术又跃升了一个级别,说不定是下一次技术革命的时候呢。 关于 Lisp很多关于编译原理的书都会提到 Lisp 语言,包括上面这个200行的编译器,也借助了 Lisp 的语法。如果你看过《黑客与画家》这本书,那我相信你很有可能了解过 Lisp 语言,这本书的作者、大名鼎鼎的硅谷创业之父Paul Graham在这本书中对 Lisp 赞赏有加、推崇备至。 直到我开始了解 Lisp ,我才发现为什么以前的程序员技术都比较好,看一段 Lisp 实现的斐波那契数列的实现。 (defun fibonacci (n) 而用 Java 是这样的
Lisp 的语法可谓是没有语法,没有那么多花里胡哨的,就是 还有一个特点就是括号,括号控制优先级。有个笑话说的是苏联黑客偷到了美国用于导弹控制的代码的最后一页,可能能看出一部分逻辑,很可惜的是Lisp代码,这最后一页全是右括号。 Lisp 这种语法你往深里想一下,那真是既酸爽又惊悚啊,就每天写这个,能不厉害吗。而且这种简单粗暴的写法,编译器是很喜欢的,解析起来比较简单一些。 推荐两本书对于我来说,学编译原理的目的很简单,就是了解一下代码是怎么样被解释的、怎么样被编译的、最后如何执行的,仅此而已。要说学完能自己写个编译器,那不好意思,确实没那个实力。 如果你也是同样的目的,我读过的两本比较简单、读起来不那么枯燥的书推荐给你读一下。 一本是关于解释器的,一本是关于编译器的,建议先读读解释器原理的,解释器和编译器有一部分是相同的,但是解释器更简单,也更容易理解。了解了解释器,再去看编译器,能省不少力气。 《用Go语言自制解释器》这本书,作者一步步的实现了一个叫做 而解释器使用 Go 语言实现的,也就是你用 比如 读完之后,当你在 Python 命令行中输入 《自制编译器》这本书,作者也实现了一个语言,叫做 怎么样,学废了吗? |
|
来自: 西北望msm66g9f > 《培训》