c++ - 编译器编程 : What are the most fundamental ingredients?

标签 c++ c compiler-construction low-level

我有兴趣编写一个非常简约的编译器。

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

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

语言特点:

  • 原生数据类型:char、int 和 float
  • 数组(适用于所有 native 数据类型)
  • 变量
  • 控制结构(if-else)
  • 职能
  • 循环(会很好)
  • 简单的代数(div、add、sub、mul、 bool 表达式、位移等)
  • 内联汇编(用于系统调用)

谁能告诉我如何开始?我不知道编译器由哪些部分组成(至少在我可以立即开始的意义上)以及如何对它们进行编程。谢谢你的想法。

最佳答案

对于您希望实现的所有目标,最具挑战性的要求可能是“非常小(最多 1-2 KLOC)”。我认为仅您的第一个要求(生成 ELF 输出)本身就可能需要一千多行代码。

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

如果我是你,我可能会从一个装配器开始,然后在其上构建部件。最简单的“编译器”可能采用一种语言,其中只有一些非常简单的可能语句:

print "hello"
a = 5
print a

并将其翻译成汇编语言。一旦你开始工作,你就可以构建一个词法分析器和解析器以及抽象语法树和代码生成器,这是现代 block 结构化语言所需的大部分部分。

祝你好运!

关于c++ - 编译器编程 : What are the most fundamental ingredients?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/559025/

相关文章:

c++ - C++ 中是否有类似于 Objective C 属性的类比

在 mac osx 上用纯 c 创建窗口应用程序

python - 除了 CPython 之外,还有其他 Python 编译器吗?

C语法分析器

c++ - 如何定义查找函数?

c++ - 为提升精神编译自定义容器时出错

c++ - 如何报告 C++ 程序中的函数计算次数

c - 从 C 中的文件中读取特定行和列

c - 从两个数组中输出不同的元素

c++ - LLVM 有后端优化器吗?