整理得较好的一篇:编译原理-绪论笔记(入门)
1绪论
1-1什么是编译
汇编语言依赖于特定机器
汇编语言翻译成机器语言称为汇编
高级语言翻译成汇编语言或直接翻译成机器语言称为编译
1-2 编译系统结构
逻辑阶段结构,具体阶段其实可以合并一起完成
1-3 词法分析概述
种别码本身应该是一个整数,为了上例中为了直观,使用了宏定义的形式
- WHILE:表示 while ,关键字,一词一码
- IDN(identify):表示标识符,第一个分量全为IDN,第二个分量为其字面值以互相区分
- NE(not equal):表示不等,运算符,一词一码或一型一码 CONST:表示常量,一型一码
- SLP、SRP、LP、RP:分别表示左右小括号以及左右花括号,界限符, 一词一码
- INC:表示 自增 ++ 运算符,一词一码或一型一码
- SEMI:表示 分号 ;界限符,一词一码
1-4 语法分析概述
D:declaration(声明)
T:type(类型 )
IDS:identifiers sequence(标识符序列)
文法在图片中有提到,即 ① 声明 = 类型 + 标识符序列 + ; ② 类型 = int 或 real 或 char 或bool ③ 一个标识符 id 本身 可以构成一个标识符序列,一个标识符序列 + , + 标识符 id 可以构成一个更大的标识符序列
这样一看这个图就很直观了
1-5 语义分析概述
(1) 收集标识符的属性信息
A:种属(Kind)
简单变量、符合变量(数组、记录 …)、过程、…
B:类型(Type)
整型、实型、字符型、布尔型、指针型、…
C:存储位置、长度
一个例子就明白了:
D:值
E:作用域
F:参数和返回值信息
参数个数、参数类型、参数传递方式、返回值类型
总结:符号表
这些收集到的标记符属性信息,都会被存放到一个叫做符号表的数据结构中,其中有着例如 TYPE、KIND 等多种属性,同时符号表通常带有一个字符串表如下图
NAME = 标识符在字符串表中的起始位置 + 长度
(2) 语义检查
1-6 中间代码生成 编译器后端
-
x = y op z :op 是一个二元运算符,y 和 z 是两个运算分量的地址,x 是运算结果的存放地址
-
x = op y:op 在这里是一个一元运算符,因此只有两个操作数 x y
-
x = y :也只有两个操作数
-
if x relop y goto n :如果 x 和 y 满足 relop 关系,就跳转到 n 对应的指令
-
goto n:直接跳转到 n 对应的指令
-
param x:将 x 设置为参数
-
call p,n:p 是过程的名字,n 是过程的个数
-
return:跳转到地址 x 对应的指令
-
x = y[i]:y 表示数组的名字,即基地址,i 是数组元素的偏移地址,不是下标
-
x[i] = y:将一个变量的值赋值给数组元素
-
最后三个:与指针相关的指令
(七) 目标代码生成
目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器
(八) 机器无关/有关优化器
代码优化
为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼顾
学完一章看会儿书