建立项目
- 基本介绍
- 建立项目
- 编译系统的过程
- 下一步要做什么
基本介绍
在本专栏中我们将使用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语言的编译过程