Compiler construction 为编译器设计中间表示

Compiler construction 为编译器设计中间表示,compiler-construction,language-design,Compiler Construction,Language Design,我一直在研究编译器设计。我在大学上过一个学期的课程,一直在阅读Grune等人的《现代编译器设计》,这本书似乎提倡使用带注释的抽象语法树作为中间代码,这就是我们在课程中使用的 我的问题是,与生成某种堆栈机器语言或低级伪代码相比,这种方法的好处是什么,特别是对于可以针对许多机器的编译器而言 简单地针对已经存在的低级表示(如LLVM)并将其用作中间表示是一个好主意吗?在编译器的讨论中,我没有听说过带注释的语法树,所以我将使用相同的习惯用法AST(抽象语法树) 通常,您可以让解析器创建一个AST,等待它

我一直在研究编译器设计。我在大学上过一个学期的课程,一直在阅读Grune等人的《现代编译器设计》,这本书似乎提倡使用带注释的抽象语法树作为中间代码,这就是我们在课程中使用的

我的问题是,与生成某种堆栈机器语言或低级伪代码相比,这种方法的好处是什么,特别是对于可以针对许多机器的编译器而言


简单地针对已经存在的低级表示(如LLVM)并将其用作中间表示是一个好主意吗?

在编译器的讨论中,我没有听说过带注释的语法树,所以我将使用相同的习惯用法AST(抽象语法树)

通常,您可以让解析器创建一个AST,等待它,它将是代码的抽象表示。它不包含任何空格,也不包含任何语义风格,如括号、括号等。它还解决了代码中的任何歧义

AST将使从中生成icode变得非常容易。此icode基本上是您语言中的指令代码。它将包含基本的操作,如移动、转到等

该过程将转到Code->AST->ICode。然后可以通过VM运行ICode

我不认为生产针对另一个平台的ICode有什么错

更新

我重新读了一遍这个问题,我明白现在谈论的是什么。他说的不是创建icode表示,而是在带注释的语法树上留下叶子。但是我很好奇,如果您构建了自己的机器来处理带注释的语法树,或者该树随后被转换为另一个众所周知的中间代码

我可以想象,处理语法树的引擎设计将比以表示基本内容(如mov、goto等)的中间格式更复杂


我需要把这本书拿起来。我从《龙之书》中学到了一切,并通过Antll、yacc、byson和自定义标记和解析器进行了搜索

在编译器从高级语言到目标代码的过程中,AST和低级伪代码是程序的两种不同抽象

与任何完整的数据表示形式一样,您可以使用任何一种表示形式来完成所需的一切。有些事情一个比另一个更容易做

例如,在AST上进行语义和语法分析更容易。在伪代码上进行指令调度更容易


编译器前端开发人员倾向于喜欢AST。后端开发人员倾向于喜欢伪代码。

如果您的语言足够复杂,您最终会得到一系列稍微不同的中间表示。实际上,哪种表示形式将是您的最终目标并不重要——llvm、C、本机代码、CLR、JVM等等。它不应该影响编译器的设计和体系结构


而且,根据我个人的经验,中间步骤越多,中间的转换越简单,编译器的体系结构就越好。

有很多转换有一个主要缺点:很难报告引用原始源代码的错误。这就是《米老鼠》学术翻译人员和作品编撰人员之间的巨大区别。如果研究人员能够发明一种跟踪概念,并将其与提出的语义转换相结合,这样不仅可以证明语义的属性,还可以证明错误的回溯能力,那将是一件好事。@Yttrill,我看不出有任何缺点:将所有源位置信息一直保存到程序集是很简单的。无论如何,您必须这样做,否则您将无法发出调试信息。这里没有什么可以发明的。