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

15

可能重复:
学习编写编译器

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


1
这是我从未能够找到任何解释的东西。很抱歉让你摊手了 =( - user477582
2
原始版本 学习编写编译器。如果你想要简单的话,可以选择Crenshaw教程,但是如果你不想使用C++的话,也可以选择其他简单的教程。 - dmckee --- ex-moderator kitten
@dmckee +1,不想要C++ - 需要解析树的复杂编译器需要大量的树操作,而C++(以及Java和几乎所有ML / Haskell家族之外的语言以及受Scala等类似语言启发的语言)在树操作方面真的很糟糕。 - Michael Ekstrand
@Michael:你不想学习C++的原因是因为即使在允许使用模板之前,C++的语法也非常恶心。 - dmckee --- ex-moderator kitten
1
“简单”和“编译器”这两个词不应该出现在同一个句子中。即使只是构建一个具有非常有限功能的小型编译器都需要大量的工作量。 - ubiquibacon
我尝试用Python编写一个解释器,进展顺利... - J-Cake
6个回答

7

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

1. 解析器。您需要解析您的语言并创建一个抽象语法树。您可能需要学习如何编写解析器。您可以手动编写解析器,也可以使用解析器生成器,例如lex/yacc。

2. 汇编语言。您需要从语法树中生成汇编指令。

3. 指令集。您需要将汇编翻译成机器码,使用某个特定的指令集(典型的Intel和AMD CPU使用x86指令集;或者,您可以针对Java虚拟机的指令集或.NET的IL)。


@mathepic:我没说它是解析器。 - Lie Ryan
我想说的是解析器生成器。 - alternative

4
为了解析输入,您应该了解递归下降解析(这些可能是最容易手工实现的解析器),尽管您还需要某种类型的词法分析器为解析器生成标记。它们可以手工编码(我已经做过了),尽管使用词法分析器生成器如lexflex更容易。
一旦您解析了输入,您将需要将其转换为适当的输出。在这方面,我无法提供太多帮助,因为我不太了解Windows工具链。 "简单"的方法是生成汇编代码并通过NASM,MASM或与您的编译器环境一起提供的任何汇编器运行它。如果您的语言足够简单,您可以在解析器代码中随时生成汇编代码。

1
谢谢,个人学习这个的原因(也是我讨厌库的原因)是因为我喜欢自己编写代码,而这是我想要理解的一个主题。我理解词法分析等内容,但是我不理解文本何时变成可执行代码的神秘点。另一方面,我想感谢您提供的链接。 - user477582

4
实际上,你需要做的最重要的事情是弄清楚.exe文件的二进制格式(除非你计划使用现有的链接器,在这种情况下,我认为你需要输出也具有二进制格式的obj文件)。
此外,你还需要处理大量汇编代码,除非你已经非常熟悉x86指令集,否则我建议你尝试其他方法。
以下是一些可能性:
- 曾经有一个叫做“Tiny C”的东西——我猜这就是它:http://bellard.org/tcc。 Tiny C是一个足够好的编译器,可以构建自身,但不会太复杂,难以理解。 这是一个简单的“如何构建编译器”的课程。 我曾在8088上使用过它。 - 输出嵌入式CPU。 它们往往有简单的汇编语言和非常明确定义的可执行文件格式。 这将是一个很好的起点。 - 输出C代码而不是二进制代码。 这肯定是个骗局,但你可以专注于你的语言,而不必过多担心汇编语言。 - 最后,如果你真的想直接创建一个.exe文件,请首先编写一个生成“Hello world”exe的应用程序。 不要费心“编译”任何东西,只需手动编辑代码,将其放入exe格式并运行它——这样你就会知道你已经将所有位对齐并放入正确的位置,然后你可以有些信心地开始编写编译器。
完成这些后,通过这里给出的许多过程可以创建语言,但如果你只想看看它是如何工作的,我肯定会先做几个小迭代,不要担心直到你遇到它。

0

我会推荐使用ANTLR。我在C#中使用过它,但它也支持C、Java、Python等语言。


0

如果想了解如何在C++中构建编译器与C或Pascal有何不同,可以尝试使用Boost Spirit解析器框架。

这需要对C++有一定的了解。

如果想学习如何创建编译器,我建议先使用比C++更简单的语言,然后再逐步转向C++。

祝好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接