首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用C/++编写一个简单的编译器?

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

Stack Overflow用户
提问于 2010-10-15 23:43:48
回答 5查看 32.9K关注 0票数 15

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

嗨,Stack溢出,现在不要误解我的意思,我不打算为C++编写编译器(虽然我打算用C++编写)或其他高级复杂编程语言。我只想学习将基本指令集转换为Windows的基本知识(例如,一种简单的语言,具有5-6功能,完全自定义)。另外,我不想下载任何库或头文件。如果您可以链接到任何一个非常基本的例子源代码或教程,这将是非常感谢!

EN

回答 5

Stack Overflow用户

发布于 2010-10-15 23:49:01

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

  1. 解析器。您需要解析您的语言,并创建一个抽象语法树。您可能想了解有关编写解析器的知识。您可以手动编写解析器的代码,也可以使用解析器生成器,例如lex/yacc。
  2. 组件。您需要从语法树中生成程序集指令。
  3. 指令集在某些特定的指令集中,您需要将程序集转换为机器代码(典型的Intel和AMD使用x86指令集;或者,您可以针对Java的指令集或.NET的IL)。
票数 5
EN

Stack Overflow用户

发布于 2010-10-15 23:49:22

要解析输入,您应该阅读递归下降分析 (这些解析器可能是手动实现的最简单的解析器),尽管您还需要某种类型的lexer来为解析器生成令牌。它们可以手工编码(我已经做过了),尽管使用像lexflex这样的词汇生成器更容易。

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

票数 4
EN

Stack Overflow用户

发布于 2010-10-16 00:13:33

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

您还需要处理大量的程序集,除非您已经非常熟悉x86指令集,否则我会尝试其他方法。

以下是一些可能性:

  • 曾经有一个叫做“微小C”的东西--我猜就是它了:http://bellard.org/tcc。微型C是一个足够好的编译器来构建自己,但并不是那么复杂,很难理解。这是一个基本的“如何构建一个编译器”的教训,在一个盒子。在8088上搞砸了。
  • “嵌入式”cpu的输出。它们往往有简单的汇编语言和非常明确定义的可执行格式。这是个很好的开始。
  • 输出C代码而不是二进制代码。这无疑是一种欺骗,但您可以专注于您的语言,而不必过多地担心汇编语言。
  • 最后,如果您真的想直接创建一个.exe,那么首先编写一个生成"Hello“exe的应用程序。不要费心让它“编译”任何东西,只需手工编辑代码,把它转换成exe格式并运行它--这样做你就会知道你把所有的数据都排好了,放到了正确的位置,然后你就可以有信心地开始编译了。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3946911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档