首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器-编程:最基本的成分是什么?

问编译器-编程:最基本的成分是什么?
EN

Stack Overflow用户
提问于 2009-02-17 22:31:24
回答 8查看 929关注 0票数 6

我对编写一个非常简约的编译器很感兴趣。

我想编写一小块软件(用C/C++编写),以满足以下条件:

  • ELF格式输出(*nix)
  • 输入是单个文本文件。
  • C类语法和语法
  • 无链接器
  • 无预处理器
  • 非常小(最多)。1-2 KLOC)

语言特点:

  • 本机数据类型: char、int和floats
  • 数组(适用于所有本机数据类型)
  • 变量
  • 控制结构(如果-否则)
  • 函数
  • 循环(会很好)
  • 简单代数(div,add,sub,mul,boolean表达式,位移位等)
  • 内联asm (用于系统调用)

有人能告诉我怎么开始吗?我不知道编译器是由哪些部分组成的(至少我不能马上开始),也不知道如何对它们进行编程。谢谢你的想法。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-02-17 23:00:28

首先,您需要决定是做编译器还是做解释器。编译器将您的代码翻译成可以直接在硬件上运行、在解释器中运行的代码,也可以编译成另一种语言,然后以某种方式进行解释。两种类型的语言都是图灵完整的,因此它们具有相同的表达能力。我建议您创建一个编译器,将代码编译成.net或Java字节码,因为它为您提供了一个非常优化的解释器来运行,以及许多标准库。

一旦做出决定,就有一些常见的步骤需要遵循。

  1. 语言定义--首先,您必须定义语言在语法上的外观。
  2. Lexer第二步是创建代码的关键字,称为令牌。这里,我们讨论的是非常基本的元素,如数字、加法符号和字符串。
  3. 解析下一步是创建与标记列表匹配的语法。您可以使用上下文无关语法来定义语法。许多工具都可以使用这些语法之一,并为您创建解析器。通常,被解析的令牌被组织成一个解析树。解析树是将语法表示为可以移动的数据结构。
  4. 编译或解释最后一步是在解析树上运行一些逻辑。制作自己的解释器的一个简单方法是创建与树中每个节点类型相关联的逻辑,然后遍历树,无论是自下而上还是自顶向下。如果希望编译到另一种语言,则可以插入如何在节点中转换代码的逻辑。

维基百科是很好的学习更多,你可能想要启动这里。

关于现实世界的阅读材料,我建议由David & Deryck F Brown编写的“JAVA编程语言处理器”。我在我的编译器课程中使用了那本书,在这个领域里,以身作则是很棒的。

票数 5
EN

Stack Overflow用户

发布于 2009-02-18 00:28:28

有了你希望达到的所有目标,最具挑战性的需求可能是“非常小(最多为1-2Kloc)”。我认为单是您的第一个需求(生成ELF输出)本身就可能需要超过一千行代码。

简化问题的一种方法,至少首先是用汇编语言文本生成代码,然后输入到现有的汇编程序中(nasm将是一个很好的选择)。汇编程序将负责生成实际的机器代码,以及构建实际可运行的可执行文件所需的所有ELF特定代码。然后,您的工作将简化为语言解析和程序集代码生成。当您的项目成熟到想要消除对汇编程序的依赖时,您可以自己重写这个部分,并随时插入它。

如果我是你,我可能会从一个汇编程序开始,并在上面构建一些片段。最简单的“编译器”可能只使用一些非常简单的语句:

代码语言:javascript
复制
print "hello"
a = 5
print a

把它翻译成汇编语言。一旦开始工作,您就可以构建一个lexer和解析器以及抽象语法树和代码生成器,这是现代块结构化语言所需要的大部分部分。

祝好运!

票数 7
EN

Stack Overflow用户

发布于 2009-02-17 22:43:03

这些是绝对必要的部分:

  • 扫描器:这会将输入文件分解成令牌。
  • 解析器:它从扫描器标识的令牌构造抽象语法树(AST)。
  • 代码生成:这将产生AST的输出。

您也可能希望:

  • 错误处理:这告诉解析器在遇到意外令牌时应该做什么。
  • 优化:这将使编译器能够生成更高效的机器代码。

编辑:你已经设计语言了吗?如果不是,你也会想要研究语言设计。

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

https://stackoverflow.com/questions/559025

复制
相关文章

相似问题

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