MiniJava语言编译器的Golang实现。
Dog-compAbstract文章介绍一个编译器的实现流程。源语言选用MiniJava. MiniJava是一个面向对象语言,支持继承,对象创建等面向对象的特性。具体语法参考Tiger book 附录。 lexer虽然目前已经有了词法分析器的生成器,但是Dog-comp使用了转移图(TDA)算法手工实现lexer。 parserDog-comp的parser使用LL(1)。在Exp与Stm的处理上进行了文法改写,避免了二义性。 elaborator编译器是一个典型的现行结构,类型检查的输入就是parser的输出,也就是源语言的Ast。 codegen在代码生成的环节,将源语言的Ast翻译成了C语言的Ast,时候将C-Ast进行打印,实际上就完成了翻译。但是,这里有几个地方需要注意。将一个面向对象的语言翻译成C这样的语言,我们需要在中间做一些变换,这些变换实际上也就是面向对象语言的实现技术。 什么是对象?这里要说对象到底是什么。对象里面可以有数据,还可以有函数,所以我们可以说对象是数据和操作这些数据的函数的集合。换到C语言里面,对象不能仅仅用一个structure表示,这里也就出现了虚函数表的概念。我们可以将数据和一个函数表组合成一个structure,这个structure其实就是java的对象。 Flattening所谓的平坦化,就是将java的Class全部消除。显然,在C里面,所有的函数都是平坦的。 垃圾收集器编译生成的C文件和runtime.c一起编译成可执行文件,使得c带有垃圾收集的功能。为了支持垃圾收集,必须在c的structure里面在加入一些字段,用于GC记录对象的状态。比如需要记录这个对象中那些字段是引用,这个对象是普通对象还是数组对象等等。 优化!Dog-comp在源码Ast级别上做了4个优化。
DeadClass Elimination
DeadCode Elimination
AlgSimp代数化简主要是针对运算,比如i=ab0*(a+2)/m),右侧的表达式可以直接优化为0. ConstFold常量折叠是在编译期把常量上的运算做完。 CFG控制流图是一种方便优化的中间表示。如下图就是LinkedList.java中Equal函数的控制流图。 可以使用 dog-comp/$ ./dog-comp ../test/LinkedList.java -visualize svg 生成。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |