编译器是如何开发的,它们如何翻译代码?

时间:2011-05-15 00:29:03

标签: compiler-construction

我最近对程序的开发和执行非常好奇,并且一直在尝试更多地了解它们。编者特别感到困惑和兴趣。

如何开发和创建编译器?您是否需要使用其他编译器来编译为新编译器编写的程序?生成编译器需要采取哪些步骤..?

更重要的是,编译器如何“深入”地将高级代码转换为?我已经阅读了所有关于编程语言的不同“代”和“级别”的内容,但编译器的给定范围是多少?他们是否直接转换到最低级别的编程,即机器代码?或者他们是否会编译成其他语言再次重新执行以执行?

但只是为了澄清,我不是在问构造编译器是一个合理的想法,还是我应该尝试编译的东西。我只是对如何开发编译器,构建它们采取了哪些步骤以及它们通常编译的深度感到好奇。

非常感谢您阅读!!

2 个答案:

答案 0 :(得分:3)

历史上,编译器使用“Lexer”来执行词法分析,将源代码分解为“部分”。例如,这个句子由单词组成,词法分析器会根据空格识别单词。词法分析者不知道“意思”这个词是什么,但能够理解包含一个词的内容。对于编程语言,词法分析接受源代码并输出“标记和运算符”流(或语言定义为基本的任何原子单位)。

然后,将词汇成分(单词)输入另一个系统以执行语义分析。例如,英语具有“NOUN-VERB”的句子结构,如“Jack run”。还有许多其他可接受的逻辑句子结构,包括使用副词,命题短语等,用于英语或任何其他语言(包括源代码语言)。如果词汇组件在语义分析系统中“匹配”接受的模式,则编译器“理解”所说的内容(或句子应该“意味着什么”)。

最后阶段是将语义分析(“理解”)“翻译”为目标平台(Windows,Mac,Posix等)的可执行指令。因此,lexing和语义分析将是任意的。平台,对可执行指令的最终翻译非常依赖于平台。

最后,编译器历史上通过这三个步骤“编译”到特定于平台的可执行指令,其中结果被送入最后阶段以“链接”所有部分。例如,函数调用必须“连接”这些函数调用的定义。这是由链接器完成的。

我说“历史性”,因为对于将上述步骤稍微合并的解释语言,它可能略有不同。我们倾向于将它们称为“解释器”,而不是称它们为“编译器”(它们“有点”,有时实际上)。此外,一些技术有各种各样的混合动力车。例如,C ++是最难处理的语言之一(语言本身在如何解释源代码中发现的内容方面非常复杂),因此一些方法将词法分析和语义分析“合并”为“帮助确定” “所说内容的背景。

这是一个很大的世界/领域,但了解它可以非常令人满意并且有助于了解如何利用语言和解决问题。

答案 1 :(得分:0)

以下是我对最简单形式的步骤的理解:

  1. 使用语法和词法分析器/解析器解析源代码。
  2. 创建抽象语法树(AST)
  3. 走AST,生成编译代码。这可以是特定平台的汇编指令或JVM的字节码。这是内置编译时优化的地方(如果有的话)。