如何用C / ++编写一个简单的编译器?

时间:2010-10-15 23:43:49

标签: c++ compiler-construction

  

可能重复:
  Learning to write a compiler

Hi Stack Overflow,现在不要误解我的意思,我不打算为C ++编写一个编译器(虽然我打算用C ++编写)或Java或其他一些高级复杂的编程语言。我只是想学习将基本指令集转换为Windows可执行文件的基础知识(比如说,只是一个带有5-6个函数的简单语言,完全自定义)。另外,我不想下载任何库或头文件。如果您可以将我链接到任何非常基本的示例源或教程,我们将不胜感激!

6 个答案:

答案 0 :(得分:6)

Jack Crenshaw的Let's Build a Compiler是一个很好的教程。他是一位优秀的作家,使这个主题易于理解。

答案 1 :(得分:4)

要解析输入,你应该阅读recursive descent parsing(那些可能是最简单的手工实现的解析器),尽管你还需要某种类型的词法分析器为你的解析器生成标记。它们可以手工编码(我已经完成了),尽管使用像lexflex这样的词法分析器更容易。

解析输入后,您需要将其转换为适当的输出。我在那里帮不了多少,因为我不太了解Windows工具链。 “简单”的方法是生成程序集并通过NASM,MASM或编译器环境随附的任何汇编程序运行它。如果您的语言足够简单,您可以在解析器代码中生成程序集。

答案 2 :(得分:3)

以下是编写基本编译器所需的内容:

  1. 分析器。您将需要解析您的语言,并创建一个抽象语法树。您可能想学习编写解析器。您可以手动编写解析器代码,也可以使用解析器生成器,例如lex / yacc。
  2. 装配。您需要从语法树生成汇编指令。
  3. 指令集。您需要将程序集转换为机器代码,在某些特定指令集中(典型的Intel和AMD CPU使用x86指令集;或者,您可以定位Java VM的指令集或.NET的IL)。

答案 3 :(得分:2)

实际上,你需要的最重要的是找出.exe文件的二进制格式(除非你打算使用现有的链接器,此时我认为你需要输出也具有二进制格式的obj文件)。

你还需要处理大量的程序集,除非你已经非常熟悉x86指令集,否则我会尝试别的东西。

以下是一些可能性:

  • 曾经有一种名为“Tiny C”的东西 - 我猜这就是它:http://bellard.org/tcc。 Tiny C是一个足够好的编译器来构建自己,但不是那么复杂,以至于很难理解。这是一个简单的“如何构建编译器”课程。在8088上与它混淆。

  • “嵌入式”cpu的输出。它们往往具有简单的汇编语言和非常明确定义的可执行格式。这将是一个很好的起点。

  • 输出C代码而不是二进制代码。这肯定是一种欺骗,但你可以专注于你的语言而不必过于担心汇编语言。

  • 最后,如果你真的想直接创建.exe,首先编写一个产生“Hello world”exe的应用程序。不要打扰它“编译”任何东西,只需手动编辑代码,将其转换为exe格式并运行它 - 在这样做时你会知道你把所有的位排成一排并进入正确的位置,然后你可以放心地在编译器上启动。

在此之后,然后通过这里给出的许多程序来创建语言 - 但如果你只是想看看它是如何工作的,我肯定会先做一些小的迭代,不用担心关于你遇到什么,直到遇到它。

答案 4 :(得分:0)

我会推荐www.antlr.org。我在C#工作,但它支持C,Java,Python等。

答案 5 :(得分:0)

要了解如何在C ++中构建编译器与C或Pascal中的编译器不同,请尝试使用Boost Spirit解析器框架。

这假设您熟悉C ++。

为了学习创建编译器,我建议使用比C ++更简单的语言,然后推进到C ++。

干杯&第h。,