Skip to content

Commit 8fd5771

Browse files
committed
Add se/cp notes.
1 parent 03a1a00 commit 8fd5771

224 files changed

Lines changed: 6895 additions & 2 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/index.md‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ title: 主页
3838

3939
- [x] [离散数学](/note/dm)
4040

41+
- [x] [软件工程](/note/se)
42+
43+
- [x] [编译原理](/note/cp)
44+
45+
4146

4247
- :fontawesome-solid-user-tag:{ .lg .middle } __关于我__
4348

@@ -65,7 +70,7 @@ title: 主页
6570
<p style="text-align: center; ">
6671
<span>本站已经运行</span>
6772
<span id='box1'></span>
68-
<span>最后更新:2025-09-02</span>
73+
<span>最后更新:2026-07-01</span>
6974
</p>
7075
<div id="box1"></div>
7176
<script>

‎docs/note/cp/chap1/chap1.md‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Chapter 1: Introduction
2+
3+
## 1.1 课程总目录
4+
5+
![image.png](image.png)
6+
7+
## 1.2 编译器简介
8+
9+
**定义:**A compiler is a program to translates one language to another.
10+
11+
![image.png](image%201.png)
12+
13+
## 1.3 编译器的工作流程
14+
15+
![image.png](image%202.png)
16+
17+
<aside>
18+
💡
19+
20+
**两个重要概念**
21+
22+
- 阶段(Phase):指由一个或多个模块组成,处理不同的抽象“语言”(例如上图的前端、中端、后端)。
23+
- 接口(Interface):编译器模块之间交换的信息(例如 AST、IR、Assem)。
24+
</aside>
25+
26+
1. **前端-词法分析(Lexical Analysis/Lexing/Scanning)**
27+
- 将程序字符流分解为 Token(记号)序列
28+
- 删除字符串中不必要的部分(如空格)
29+
- 通常使用正则表达式匹配
30+
- 对应工具 Lex
31+
32+
![image 8.png](%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE_2026-03-12_165823.png)
33+
34+
2. **前端-语法分析(Parsing/Syntax Analysis)**
35+
- 将 Token 序列解析为语法结构
36+
- 在上述过程中,去除不必要的 Token(例如括号)
37+
- 解析的语法结构一般使用抽象语法树(Abstract Syntax Tree, AST)表示
38+
- 对应工具 Yacc
39+
1. **前端-语义分析(Semantic Analysis)**
40+
- 决定语法结构的含义:检查变量类型,合法性检查等
41+
42+
![image.png](image%203.png)
43+
44+
2. **中端-中间代码生成**
45+
- 中间代码/表示(IR):源语言与目标语言之间的桥梁,通常以树的形式表示
46+
47+
![image.png](image%204.png)
48+
49+
3. **中端-机器无关代码优化**
50+
- 基于中间表示进行分析与变换,降低执行时间,减少资源消耗
51+
52+
![image.png](image%205.png)
53+
54+
4. **后端-目标代码生成**
55+
- 把中间表示形式翻译到目标语言
56+
- 包含指令选择、寄存器分配、指令调度等
57+
58+
![image.png](image%206.png)
59+
60+
61+
## 1.4 Tiger 编译器的工作流程
62+
63+
![image.png](image%207.png)
64+
65+
1. **前端阶段:从源码到语法树**
66+
- **Lex (词法分析)**:将源代码分割成一个最小的单元,称为 **Tokens**(如关键字、变量名)。
67+
- **Parse (语法分析)**:根据语法规则进行“归约”(Reductions),检查代码结构是否合法。
68+
- **AST (抽象语法树)**:语法分析生成的产物,它以树状结构表示代码的逻辑结构。
69+
- **Semantic Analysis (语义分析)**:检查逻辑错误(如变量未定义、类型不匹配)。它会维护**环境 (Environments)** 和**符号表 (Tables)**。
70+
71+
**2. 中间表示阶段:硬件无关的转换**
72+
73+
- **Translate (翻译)**:将 AST 转换为一种更接近底层但仍与具体硬件无关的形式——**IR Tree (中间代码树)**。
74+
- **Frame Layout (栈帧布局)**:确定变量在内存栈中的位置。
75+
- **Canonicalize (规范化)**:将复杂的 IR 树简化、扁平化,生成 **Canonicalized IR Tree**。这一步是为了方便后续生成具体的机器指令。
76+
77+
**3. 后端阶段 A:指令选择与流分析 (Back-end Analysis)**
78+
79+
- **Instruction Selection (指令选择)**:将规范化的 IR 转换成目标架构的汇编指令(**Assem**),但此时寄存器还是虚拟的。
80+
- **Control Flow Analysis (控制流分析)**:分析程序的执行路径(分支、循环),生成 **CFG (控制流图)**。
81+
- **Data Flow Analysis (数据流分析)**:分析变量在何时被定义和使用,生成 **Interference Graph (冲突图/干涉图)**。
82+
83+
**4. 后端阶段 B:代码生成与链接 (Back-end Generation)**
84+
85+
- **Register Allocation (寄存器分配)**:通过冲突图,将无限的虚拟寄存器映射到有限的硬件寄存器上。
86+
- **Code Emission (代码发射)**:产生真正的汇编语言 (**Assembly Language**)。
87+
- **Assembler (汇编器)**:将汇编转换成二进制的可重定位对象代码 (**Relocatable Object Code**)。
88+
- **Linker (链接器)**:将不同的代码文件和库文件合并,最终生成可在计算机上运行的 **Machine Language (机器语言)**。

‎docs/note/cp/chap1/image 1.png‎

5.82 KB
Loading

‎docs/note/cp/chap1/image 2.png‎

96.9 KB
Loading

‎docs/note/cp/chap1/image 3.png‎

80 KB
Loading

‎docs/note/cp/chap1/image 4.png‎

62.6 KB
Loading

‎docs/note/cp/chap1/image 5.png‎

12 KB
Loading

‎docs/note/cp/chap1/image 6.png‎

12.5 KB
Loading

‎docs/note/cp/chap1/image 7.png‎

203 KB
Loading

‎docs/note/cp/chap1/image 8.png‎

18.7 KB
Loading

0 commit comments

Comments
 (0)