我一直在研究编译器设计。我在大学完成了一个学期的课程并且已经阅读了Grune等人的现代编译器设计,这本书似乎提倡一个带注释的抽象语法树作为中间代码,这就是我们在课程中使用过。
我的问题是这种方法的好处是什么,而不是产生某种堆栈机器语言或低级伪代码,特别是关于拥有可以针对许多机器的编译器。
简单地定位已经存在的低级别表示(如LLVM)并将其用作中间表示是不是一个好主意?
答案 0 :(得分:5)
如果您的语言足够复杂,您最终会以任何方式获得一系列略有不同的中间表示。并不重要,哪种表示将是您的最终目标 - llvm,C,本机代码,CLR,JVM等等。它不应该影响编译器的设计和体系结构。
而且,根据我的个人经验,您拥有的中间步骤越多,其间的转换尽可能微不足道,您的编译器架构就越好。
答案 1 :(得分:1)
答案 2 :(得分:0)
我在编译器的讨论中没有听说过带注释的语法树,所以我将使用相同的成语AST(抽象语法树)。
通常你可以让你的解析器创建一个AST,等待它,代码的抽象表示。它不包含任何间距或语义风格,如括号,parens等。它还解决了代码中的任何歧义。
AST可以很容易地从中生成icode。这个icode基本上是您的语言的指令代码。它将包含诸如move,goto等基本操作。
这个过程会转到Code - > AST - > ICode。然后可以通过VM运行ICode。
我认为生成针对另一个平台的ICode没有任何问题。
<强>更新强>
我再次重读了这个问题,我理解现在正在谈论的内容。他说的不是创建一个icode表示,而是在带注释的语法树上留下叶子。我很好奇,如果你构建了自己的机器来处理带注释的语法树,或者那个树然后被转换成另一个众所周知的中间代码?
我认为处理语法树的引擎设计会比代表基本内容的中间格式(如mov,goto等)更复杂。
我需要选择这本书。我从龙书中学到了一切,并通过ANTRL,yacc,byson和自定义标记器和解析器进行搜索。