编译:一个类似翻译的过程,将 源语言 翻译成 目标语言( 高级语言 --> 汇编语言 / 机器语言 )
汇编语言的缺点:编写效率低,与机器有关,非程序员难以使用,语法与人一般使用的区别较大
编译过程:( 此处表示编译器的地位 )
1 源程序 ( 经过预处理器 )--> 经过预处理的源程序
2 ( 编译器 )--> 汇编语言程序
3 ( 汇编器 )--> 可重定位的机器代码 重定位:在内存中存放位置不固定
4 ( 链接器 / 加载块 )--> 目标机器代码 加载块:修改可重定位地址;将修改后的指令和数 据放在内存中合适位置
链接器:将多个可重定位的机器代码文件(包括库 文件)连接在一起;解决外部内存地址问题
编译器的结构
词法分析器:将 字符流 翻译成 词法单元流
语法分析器:将 词法单元流 翻译成 语法树
语义分析器:将 语法树 翻译成 语法树
中间代码生成器:将 语法树 生成为 中间表示形式
机器无关代码优化器:中间表示形式
目标代码生成器:生成目标代码语言
机器相关代码优化器:目标机器语言
由于物理实现不同,中间的部分可能整合为一个,实现多个操作。
词法分析:
任务:从左到右逐行扫描源程序字符,识别并确定单词类型,进而转换成对应的机内表示-----语法单元 token 形式 token:< 种别码,属性值 >
单词类型:关键字、标识符、常量、运算符、界限符
关键字:一词一码 标识符:多词一码 常量:一型一码
运算符:一词一码或一型一码 界限符:一词一码
while( t < 0 ){ ; }
while --> < WHILE , >
( --> <SLP, >
t --> <IDN, t>