1、编译器
是一个程序、具有非常模块化的高层结构
离线方式offline
2、解释器
是一类处理程序的程序
在线方式online
3、静态计算
所生成的目标程序要和源代码语义相同(不能有任何改变)
4、动态计算
5、编译的各个阶段
(1)词法分析器:检查单词是否合法。
(2)语法分析器:生成语法树,检查是否符合语法规则,比如是否符合主谓宾。
(3)语义分析器:对语法树的合法性做处理,比如变量使用前是否声明,调用的函数是否定义。
(4)符号表:存取了程序编译过程相关的重要信息,可以给每个阶段提供支持。
例题:编译程序1+2+3到栈式计算机
第一步,词法分析:哪些部分组成(拆分成5个部分)
第二步,语法分析:是否满足语法要求
第三步,语法树构建:抽象的内部表示
后序遍历:左右中
第四步,代码生成:规则——n:push n,+:add
注:add伪指令:x=pop();y=pop();z=x+y;push z;
push 1
push 2
add
push 3
add
6、词法分析
任务是由字符流到单词流的切分/转换。
字符流:和被编译的语言密切相关(ASCII,Unicode,or......)。
记号流:编译器内部定义的数据结构,编码所识别出的词法单元。
词法单元token:<种别码,属性值>
单词类型 | 种别 | 种别码 | ||||
关键字 | Program、if、else、then、... | 一词一码 | ||||
标识符 | 变量名、数组名、记录名、过程名、... | 多词一码 | ||||
常量 | 整型、浮点型、字符型、布尔型、... | 一型一码 | ||||
运算符 | 算术(+、-、*、/、++、--) | 一词一码 | ||||
关系(>、<、==、!=、>=、<=) | 或 | |||||
逻辑(&、|、~) | 一型一码 | |||||
界限符 | ;、()、=、{}、... | 一词一码 |