900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > c语言编译器是怎样开发的 如何编写属于自己的 C 语言编译器

c语言编译器是怎样开发的 如何编写属于自己的 C 语言编译器

时间:2020-03-12 19:55:17

相关推荐

c语言编译器是怎样开发的 如何编写属于自己的 C 语言编译器

本文为编写 C 语言编译器系列文章的第一篇,为此我先说明一下我要如此做的一些理由:

1. 通过编写过程,你会对抽象语法树(AST)以及程序如何表示和操作其他程序有清晰地了解,并可以熟练地使用 linters、静态分析器与各种各样的元编程。

2. 你将对汇编,调用约定,以及所有相关的技术细节有个系统了解。

3. 由于这是很困难的项目,所以整个过程我都在探索,有不对的地方请大家多指正。

在过去的几个星期里,我一直在借鉴 Abdulaziz Ghuloum 的" 编译器构建的增量方法 ",在自己的 C 语言编译器nqcc进行探索。Ghuloum 的方法的大致是这样的:

第一,本文介绍的只是基本的 X86 汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令、逻辑计算指令、算数运算指令),以及函数的调用规则。

第二,添加新的语言特性,整个添加过程可以一步一步地慢慢进行。一开始,只会返回常数,而随着步骤的增加,就要处理加减法了。

第三,虽然每一步的进展都很慢,但这保证了你对每一步进行充分的管理,在每一步的末尾,都有一个编译器。

我将在本文中,介绍算术运算,条件语句,局部变量,函数调用等概念。除此以外,我还编写了一些测试程序,以方便验证编译器的每个阶段是否在正常工作。

准备阶段

在编写 C 语言编译器之前,你还需要完成两件事:

1. 决定使用哪种编译器的语言;

2. 如何处理解析和词法分析。

对于编写语言,虽然我没有什么硬性规定,你可以用你喜欢的任何语言来编写编译器,但我的建议是使用具有和类型 ( sum types ) 和模式匹配的语言,比如 OCaml,Haskell 或者 Rust。因为根据我的经验,这些语言在构建和遍历一个 AST 时会更加容易。其实最初,我也用的是 Python,但是到最后,我还是选择了 OCaml。

另外,你还需要决定是编写自己的解析和词法分析器,还是使用自动解析器和扫描生成器(例如 flex 和 bison)。我会在本文中,向你展示如何手动去编写紫的词法分析器(或扫描器)以及递归下降语法分析器。虽然使用 解析生成器可能更容易编写,但我还没有尝试过该方法。你还可以使用扫描生成器来实现词法分析,但前提是要手动编写自己的解析器。

整数分析

一开始,我会编译一个可以返回单个整数的程序。另外,我还将为编译器设置三个基本的路径(pass)。这些被定义的体系结构将为以后添加更多的语言功能提供便利。

下面就是一个经过编译的程序,我将其称为 return_2.c。

int main ( ) { return 2;}

我只能用一个单一的函数来处理程序 main,它由一个单一的 return 语句组成。唯一不同的是正在返回的整数值,不过我不会处理十六进制或八进制的整数。为了验证你的编译器运行是否正常,你需要编译一个程序,运行它,然后检查它的返回码。

$ ./YOUR_COMPILER return_2.c # compile the source file shown above $ ./gcc -m32 return_2.s -o return_2 # assemble it into an executable

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。