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

8zzbczxx  于 2023-02-10  发布在  其他
关注(0)|答案(6)|浏览(138)
    • 此问题在此处已有答案**:

12年前就关闭了。

    • 可能重复:**

Learning to write a compiler
嗨,堆栈溢出,现在不要误解我的意思,我不打算为C编写编译器(虽然我打算用C或Java或其他一些高级复杂编程语言编写它。我只想学习将基本指令集转换为Windows可执行文件的基础知识(比如说,一个简单的语言,有5 - 6个函数,完全自定义)。我也不想下载任何库或头文件。如果你能链接到任何非常基本的例子源代码或教程,我将不胜感激!

cunj1qz1

cunj1qz11#

JackCrenshaw的Let's Build a Compiler是一个很好的入门教程,他是一个很好的作者,使主题易于理解。

cclgggtu

cclgggtu2#

下面是编写基本编译器所需的内容:
1.语法分析器。你需要分析你的语言,并制作一个抽象语法树。你可能想学习如何编写语法分析器。你可以手工编写语法分析器,也可以使用语法分析器生成器,例如lex/yacc。
1.汇编.您需要从语法树中生成汇编指令.
1.指令集。您需要将汇编转换为机器代码,在一些特定的指令集(典型的英特尔和AMD CPU使用x86指令集;或者,您也可以将Java VM的指令集或.NET的IL作为目标)。

zsohkypk

zsohkypk3#

要解析输入,您应该阅读recursive descent parsing(这些可能是最容易手工实现的解析器),尽管您还需要某种类型的lexer来为解析器生成标记,它们可以手工编码(我已经完成了),尽管使用像lexflex这样的lexer生成器更容易。
一旦你解析了输入,你就需要把它转换成适当的输出。我在这方面帮不了你什么,因为我对Windows工具链不是很了解。“简单”的方法是生成汇编并通过NASM、MASM或任何编译器环境自带的汇编程序运行它。如果你的语言足够简单,你可以在解析器代码中生成汇编。

laik7k3q

laik7k3q4#

实际上,您需要做的最重要的事情是弄清楚.exe文件的二进制格式(除非您计划使用现有的链接器,否则我认为您需要输出也具有二进制格式的obj文件)。
你还需要处理大量的汇编,除非你已经非常熟悉x86指令集,我会尝试其他东西。
以下是几种可能性:

  • 曾经有个东西叫“Tiny C”--我猜就是这个http://bellard.org/tcc。Tiny C是一个足够好的编译器,可以自己编译,但又不复杂到难以理解。这是一个简单的“如何构建编译器”课程。在8088上搞砸了。
  • 为“嵌入式”cpu输出。他们倾向于有简单的汇编语言和非常明确定义的可执行格式。这将是一个很好的开始。
  • 输出C代码而不是二进制代码。这肯定是一个骗局,但是你可以专注于你的语言,而不必太担心汇编语言。
  • 最后,如果你真的想直接创建一个.exe,首先编写一个能产生“Hello world”exe的应用程序。不要麻烦让它“编译”任何东西,只要手工编辑代码,把它转换成exe格式并运行它--这样做你就会知道你已经把所有的位都排好了,并放到了正确的位置,然后你就可以自信地开始编译了。

在这之后,创建语言可以通过这里给出的许多过程来完成--但是如果你只是想看看它是如何工作的,我肯定会先做一些小的迭代,在你遇到它之前不要担心你会遇到什么。

cczfrluj

cczfrluj5#

要了解在C中构建编译器与在C或Pascal中构建编译器有何不同,请尝试Boost Spirit解析器框架。
这假定您熟悉C

为了学习如何创建编译器,我建议使用比C更简单的语言,然后可能会升级到C
干杯,

xienkqul

xienkqul6#

我会推荐ANTLR。我用C#工作过,但它支持C、Java、Python等等。

相关问题