Browse Source

feat: 添加编译流程

nicetry12138 1 year ago
parent
commit
b42eeb5a4a

BIN
Build-Project/程序员的自我修养/Image/001.png


BIN
Build-Project/程序员的自我修养/Image/002.png


+ 61 - 1
Build-Project/程序员的自我修养/README.md

@@ -1,6 +1,6 @@
 # 程序员的自我修养
 
-## 静态链接
+## 源码执行过程
 
 源码执行的过程可以被分成四部分
 
@@ -74,3 +74,63 @@ int main() {
 
 在最后执行了**链接**之后,才能够执行
 
+## 编译器做了什么
+
+编译器就是将高级语言翻译成机器语言的工具之一
+
+> 使用汇编语言或机器指令编写程序效率低下,且机器语言和汇编依赖特定机器,一个专门为某种 CPU 编写的程序在另一种 CPU 下完全无法运行
+
+使用高级语言能够使开发者尽量少的考虑计算机本身的限制:字长、内存大小、通信方式、存储方式等
+
+![](Image/001.png)
+
+| 英文 | 中文 |
+| --- | --- |
+| Source Code | 源码 |
+| Scanner | 扫描器 |
+| Tokens | 记号 |
+| Parser | 语法分析 |
+| Syntax Tree | 语法树 |
+| Semantic Analyzer | 语义分析 |
+| Commented Syntax Tree | 语法树 |
+| Source Code Optimizer | 源码级优化器 |
+| Intermediate Representation | 中间代码 |
+| Code Generator | 目标代码生成 |
+| Target Code | 目标代码 |
+| Code Optimizer | 目标代码优化器 |
+
+**扫描器**:简单地进行**词法分析**,运用类似有**限状态机**的算法可以将源代码的字符序序列分割成一系列的**记号**(`Token`)
+
+通过 `Scanner` 扫描器的词法分析产生的记号 `Token` 一般分为一下几类:关键字、标识符、字面量(数字、字符串等)和特殊符号(加号、减号等)
+
+```cpp
+array[index] = (index + 4) * (2 + 6);
+```
+
+上面的代码通过扫描器之后会得到 16 个 Token
+
+| Token | 类型 |
+| --- | --- |
+| Array | 标识符 |
+| `[` | 左方括号 |
+| index | 标识符 |
+| `]` | 右方括号 |
+| = | 赋值 |
+| `(` | 左圆括号 |
+| index | 标识符 |
+| + | 加号 |
+| 4 | 数字 |
+| `)` | 右圆括号 |
+| * | 乘号 |
+| `(` | 左圆括号 |
+| 2 | 数字 |
+| + | 加号 |
+| 6 | 数字 |
+| `)` | 右圆括号 |
+
+词法分析器(`Grammar Parser`) 对扫描器(`Scanner`) 产生的记号进行语法分析,从而产生语法树(`Syntax Tree`),整个过程采用上下文无关语法(`Context-Free Grammar`)
+
+通过**语法分析器**生成的**语法树**就是以**表达式**为节点的树
+
+![](Image/002.png)
+