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

本文是关于如何开发C语言编译器的入门教程,作者分享了为何要编写编译器的原因,包括理解抽象语法树、汇编语言等技术细节。遵循Abdulaziz Ghuloum的增量方法,首先处理X86汇编子集,逐步添加语言特性。文章介绍了手动编写词法分析器和递归下降解析器的过程,并以返回整数的程序为例,展示了编译器如何生成汇编代码。最后,讨论了编译器的结构、词法分析、解析和代码生成的实现,以及测试和验证编译器正确性的方法。
摘要由CSDN通过智能技术生成

本文为编写 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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值