来源

学习编译原理之后,想尝试着用学习的知识写一个简单的编译器,并把它放在 github 上,当作对自己学习成果的检验和练习。而写博客,则是一种鞭策,驱动我坚持不懈地写下去。所以准备从无到有写一个系列,希望能对后来的学习者有所帮助。

准备

首先写前端,然后翻译成字节码,构建运行时程序,并在这个基础上,进行代码优化相关内容。其中涉及到的知识有词法分析、语法分析、语义分析、类型检查、全文CPS变换、字节码解释器、垃圾回收、控制流程图、数据流分析。鉴于能力有限,不可能面面聚到,有的只能做一个简单介绍。

目标

这个目标分为三个阶段,第一个阶段是自己动手写一个编译器,将源代码翻译成中间代码。第二个阶段是设计一个Scheme解释器。第三个阶段是研究现有的编译器中间代码及优化等部分。

编译器实现的是一种简单的编程语言,在设计的时候尽可能的精简、方便实现。这个语言设计来源于虎书的 MiniJava , 代码则是采用的 http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/ 中提供的代码基础上进行了一定的修改,使用 java 实现。首先看一个简单的例子:

function f(arg1, arg2) {
	var condition = arg1;
	if (condition) {
		// todo
	} else {
		// todo
	}

	while (condition) {
		// todo
	}
}

function main() {
	f(1, 2);
}

这是一门脚本语言,这样设计的目的是使得 parse 部分能够轻松的写出来。关于其他细节,在后续过程中进行阐述。

作为PLT领域的初学者,没有系统全面的掌握相关知识,那么设计的语言肯定是不合理、存在缺陷的。所以第二个阶段采用现有的语言为实现模板,而Scheme精简美丽,再加上能够应用到一些PLT中的理论,所以成为了不二之选。至于第三个阶段,通过现有的、已经比较成熟源码学习应该是比自己手写收获更大,所以选择使用现有源代码。