CH1 引论
程序设计语言编译程序构造的基本 原理和 基本实现技术
编译程序基本概念
翻译程序
源语言—翻译程序---->目标语言程序
编译程序(compiler)
高级语言—编译程序–>低级语言
编译程序运行在宿主机
低级语言运行在目标机
低级语言
可直接运行
eg.汇编语言,机器语言(cpu指令级)
分类
可通过开关选择
诊断编译程序(diagnostic compiler)
用于开发和调试,发现错误排错
//不关注效率
优化编译程序(optimizing compiler)
生成高效代码
交叉编译程序(cross compiler)
在一个平台上生成另一个平台上的可执行代码
可变目标编译程序(retargetable complier)
根据不同的目标机运行平台,产生不同的目标程序,这些程序可运行在不同的目标机上
解释程序(interpreter)
把源语言写的源程序作为输入,但不产生目标程****序,边解释边执行
编译过程
词法分析
任务
输入源程序,对构成程序的字符进行扫描和分解,识别处一个个单词符号
依循的原则
构词规则
描述工具
有限自动机/有限状态机
语法分析
任务
在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)
依循的原则
语法规则
描述工具
上下文无关文法
= 赋值表达式
算术表达式+算术表达式
算术表达式*算术表达式
中间代码产生
任务
对各类语法单位按语言的语义的予以进行初步翻译
依循的规则
语义规则
描述工具
属性文法
分类
三元式
四元式
树形结构
。。。
优化
任务
对前阶段产生的中间代码进行加工变换,为了在最后阶段产生更高效的目标代码//可读+效率winwin
依循规则
程序的等价变换规则
before:
after:
将部分循环体内部分移除循环,等价变量转换
目标代码产生
依赖于硬件系统结构和机器指令含义
任务
把中间代码变换成特定机器上的目标代码
形式
汇编指令代码
需要进行汇编
绝对指令代码
可直接运行
可重新定位指令代码
需要连接//从任何地址开始运行
//模块化软件独立开发
编译程序结构
编译程序总框
符号表管理/表格管理:编译过程中各种对象的存储、组织、修改,为各个阶段的分析提供依据
出错处理:纠错+定位错+修改建议
表格和表格管理
常见表格
符号表格
用于定义
常数表
符号表
goto(label)
名字 | 信息 |
---|
出错处理
出错处理程序
发现源程序的错误,把有关错误信息报告给用户(语法错误/语义错误)
语法错误
1.不符合语法/词法规则的错误
2.非法字符、括号不匹配、缺少;、。。。。
语义错误
1.不符合语义规则
2.说明错误、作用域错误、类型不一致
遍
对源程序/源程序的中间代码从头到尾扫描一次
遍&&阶段
编译前端和后端
编译前端
与源语言有关,eg词法分析、语法分析,语义分析和中间代码产生,与机器无关的优化
编译后端
与目标机有关,与目标机有关的优化,目标代码产生
好处
1.程序逻辑结构清晰
2.优化更充分,有利于移植//前端不变改后端->目标语言不同,反之源语言不同
汇编程序的生成
以机器语言和汇编语言为工具
优点
可以针对具体机器//发挥计算机效率
生成程序效率高
缺点
程序难读、难写、易出错、难维护、生产效率低
高级语言书写
程序易读、易理解、容易维护、生产效率高
//在同一机器实现不同语言
利用已有语言实现另一语言的编译程序
1.P1:A的机器语言版本的编译程序,可以在A机器上直接运行,L1->A,A机器上的L1语言编译程序
2.
P2:用L1语言执行不可以直接在A机器上运行
3.
P2:可以在A机器上直接运行了
=====》推广
移植方法
把一种机器上的编译程序移植到另一种机器上
1.
想要L-》B且以B机器代码,可直接运行在B机器上
2.
3.P2&&P2功能等价
4.
5.
自编译
L语言的核心部分L1:构造小的编译程序(高级/低级语言)
以L1为开发工具->更多语言成分
自展
编译程序自动产生
编译程序-编译程序/编译程序产生器/编译程序书写系统
(一个意思)
LEX:词法分析程序产生器
YACC:语法分析程序产生器
接受形式化描述产生编译程序
小结
编译程序
翻译
编译
解释
编译基本过程
词法分析
语义分析
中间代码生成
优化
目标代码产生
编译程序结果
阶段
遍
前端/后端
编译程序生成方法
机器/汇编语言书写
高级语言书写
移植
自编译
词法分析程序产生器
YACC:语法分析程序产生器
接受形式化描述产生编译程序
[外链图片转存中…(img-UiHM7EqK-1678109890068)]