Hi Stack Overflow,现在不要误解我的意思,我不打算为C ++编写一个编译器(虽然我打算用C ++编写)或Java或其他一些高级复杂的编程语言。我只是想学习将基本指令集转换为Windows可执行文件的基础知识(比如说,只是一个带有5-6个函数的简单语言,完全自定义)。另外,我不想下载任何库或头文件。如果您可以将我链接到任何非常基本的示例源或教程,我们将不胜感激!
答案 0 :(得分:6)
Jack Crenshaw的Let's Build a Compiler是一个很好的教程。他是一位优秀的作家,使这个主题易于理解。
答案 1 :(得分:4)
要解析输入,你应该阅读recursive descent parsing(那些可能是最简单的手工实现的解析器),尽管你还需要某种类型的词法分析器为你的解析器生成标记。它们可以手工编码(我已经完成了),尽管使用像lex
或flex
这样的词法分析器更容易。
解析输入后,您需要将其转换为适当的输出。我在那里帮不了多少,因为我不太了解Windows工具链。 “简单”的方法是生成程序集并通过NASM,MASM或编译器环境随附的任何汇编程序运行它。如果您的语言足够简单,您可以在解析器代码中生成程序集。
答案 2 :(得分:3)
以下是编写基本编译器所需的内容:
答案 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。,