使用Rust开发编译系统(基本介绍以及建立项目)

释放双眼,带上耳机,听听看~!

建立项目

  • 基本介绍
  • 建立项目
  • 编译系统的过程
  • 下一步要做什么

基本介绍

在本专栏中我们将使用rust编写C语言的编译系统,包括编译器,链接器,汇编器,文章跟之前的风格一样,将项目分为独立的子模块,每篇文章对每个模块或者子功能进行讲述,编写代码之前会讲述所需要的理论知识

建立项目

Rust安装请看这里

建立一个项目需要用到Cargo,Cargo在安装Rust时就会安装

通过Cargo提供的命令很容易创建一个Rust项目


1
2
3
4
1admin@admin:~: cargo new compiler--bin
2    Created binary (application) `compiler` package
3
4

上面的命令意思是使用Cargo创建一个新的项目,名字为compiler –bin参数表示要创建一个二进制文件

现在目录结构为


1
2
3
4
5
6
7
1compiler
2├── Cargo.toml
3└── src
4    ├── .gitignore
5    └── main.rs
6
7

Cargo.toml包含crate所需的配置(比如项目信息,依赖关系等等),src/main.rs文件中包含main函数(程序主入口),你可以使用cargo build来编译compiler并且会在compiler下放生成target文件夹,该文件夹包含着编译的输出结果,编译成的二进制文件包在target/debug目录下

因为我们编译的产物是在操作系统上运行的,因此我们并不需要对项目做特殊设置

顺便提一下,使用Cargo创建项目的时候会顺便初始化成Git本地仓库,所以可以使用git status查看仓库的情况


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1amdins@amdins:~/compiler $ git status
2位于分支 master
3
4尚无提交
5
6未跟踪的文件:
7  (使用 "git add <文件>..." 以包含要提交的内容)
8
9        .gitignore
10        .idea/
11        Cargo.toml
12        src/
13
14提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
15
16

如果你使用的IDEA或Clion,可以使用.gitignore忽略跟踪.idea目录,因此我们在.gitignore文件中添加以下内容。


1
2
3
4
1# 忽略idea
2.idea/*
3
4

如果有依赖关系的话,cargo会创建一个Cargo.lock文件来自动跟踪每个依赖关系,该文件不属于我们的代码所以加入到.gitignore文件中,至于target文件

最终我们的.gitignore文件内容就是这样的


1
2
3
4
5
6
7
1/target
2**/*.rs.bk
3# 忽略idea
4.idea/*
5*.lock
6
7

然后我们需要将其他文件添加到git进行跟踪


1
2
3
1 admin@admin:~/droll_os: git add .gitignore Cargo.toml src/
2
3

再次查看


1
2
3
4
5
6
7
8
9
10
11
12
1位于分支 master
2
3尚无提交
4
5要提交的变更:
6  (使用 "git rm --cached <文件>..." 以取消暂存)
7
8        新文件:   .gitignore
9        新文件:   Cargo.toml
10        新文件:   src/main.rs
11
12

最后我们使用下面的命令完成提交


1
2
3
1git commit -m "init project"
2
3

这样我们的项目就初始化完成了。

编译系统的过程

我们所做的编译系统将会涉及以下内容
编译器:

  • 词法分析: 词法分析器通过对源代码的扫描获得高级语言定义的终结符,例如标识符,关键字,常量,运算符,逗号,分号等等
  • 语法分析:经过词法分析之后我们需要通过语法分析器生成抽象语法树
  • 语义分析:语义分解对生成的抽象语法树进行检查,保证源代码语义上没有问题
  • 代码生成:根据据识别的语法模块翻译出目标机器指令(语法制导)
  • 编译优化:我们根据前端生成的中间代码进行优化,包括冗余消除,消除死代码等等

汇编器:

  • 汇编词法语法分析:对汇编代码进行词法语法的分析并生成抽象语法树
  • 生成表信息:汇编器需要记录段相关的信息以及重定位符号信息
  • 指令生成:根据分析的指令信息生成可执行文件,动态链接库文件 例如 .dll,.exe(windiows),elf文件,.so文件(Linux)

链接器:

  • 地址空间分配:设置目标文件运行时的代码段和数据段基址
  • 符号解析:为段内的符号指令地址
  • 重定位:由于目标文件在链接之前不能获取自己所使用的符号虚拟地址,因此需要重新定位这些符号地址(地址修正)

下一步要做什么

在下一篇文章中我们开始学习C语言和Rust语言的编译过程

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ list, vector, map, set 区别与用法比较

2022-1-11 12:36:11

安全网络

SpringCloud微服务搭建详解

2021-8-18 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索