用Java写Java编译器?编译自举及其原理

用Java写Java编译器?编译自举及其原理

其实我们熟知的Java编译器javac不是用C语言或者是C++语言写的,而是用Java本身写的(源代码可以看这里:http://hg.openjdk.java.net/jdk6/jdk6/langtools/file/779c45081059/src/share/classes/com/sun/tools/javac)

或许我们会觉得奇怪,为什么可以用Java语言编写用来编译自身的Java编译器,其实这在编译器技术中叫做自举(bootstrap),可以用如下过程来解释其原理:

如果你想创造一门V语言,而且用V语言来写V编译器的话,你得按照下面的方法做:

1、用C++把那个编译器(A)写出来,顺便留下很多测试用例。

2、用V语言把那个编译器写(B)出来,用A.exe来编译B,修改直到所有测试用例都通过为止。

3、B.exe来编译B自己得到B2.exe,修改直到B2.exe所有测试用例都通过为止。这是为了保证,就算B本身有很多bug,至少编译自己是没有bug的,从而你就可以走到第四步。

推荐阅读