|
|
@@ -1,6 +1,6 @@
|
|
|
# 程序员的自我修养
|
|
|
|
|
|
-## 静态链接
|
|
|
+## 源码执行过程
|
|
|
|
|
|
源码执行的过程可以被分成四部分
|
|
|
|
|
|
@@ -74,3 +74,63 @@ int main() {
|
|
|
|
|
|
在最后执行了**链接**之后,才能够执行
|
|
|
|
|
|
+## 编译器做了什么
|
|
|
+
|
|
|
+编译器就是将高级语言翻译成机器语言的工具之一
|
|
|
+
|
|
|
+> 使用汇编语言或机器指令编写程序效率低下,且机器语言和汇编依赖特定机器,一个专门为某种 CPU 编写的程序在另一种 CPU 下完全无法运行
|
|
|
+
|
|
|
+使用高级语言能够使开发者尽量少的考虑计算机本身的限制:字长、内存大小、通信方式、存储方式等
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+| 英文 | 中文 |
|
|
|
+| --- | --- |
|
|
|
+| 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`)
|
|
|
+
|
|
|
+通过**语法分析器**生成的**语法树**就是以**表达式**为节点的树
|
|
|
+
|
|
|
+
|
|
|
+
|