第一章编译过程、高级语言简介
编译过程
一、程序编译过程
- 词法分析
- 语法分析
- 中间代码产生
- 优化
- 目标代码生成
1、词法分析
任务:输入源程序,对构成源程序的字符串进行扫描分解,识别出一个个单词
原则:构词规则
描述工具:正规式,有限自动机
例如:For 保留字 、 i 标识符 、 = 运算符 、 1 常整数
2、语法分析
任务: 在词法分析基础上,根据语法规则判断组合后能否组成一句话
原则: 语法规则
描述工具: 上下文无关文法
3、中间代码产生:
任务: 对各类不同语法范畴按语义进行初步翻译
原则:语义规则
中间代码: 三元是、四元式、树形结构
例如:
Z := X+0.1*Y 转化为四元式:
(1) * 0.1 Y T1
(2) + X T1 T2
(3) := T2 _ Z
看像不像JVM底层的字节码执行过程?
4、优化
任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的中间代码
原则:程序的等价变换规则(例如:在底层,会把乘法运算变为加法运算,因为加法比乘法更快)
5、目标代码产生
任务:把中间代码变成特定机器上的目标代码
依赖于硬件结构和机器指令的含义
三种形式:
- 绝对指令代码:可直接运行
- 可重定位指令代码:需要连接、装配
- 汇编指令代码:需要汇编
是不是有点像JVM的类加载过程?
回顾一下类加载过程:
- 加载: 读入字节码文件
- 验证: 确保安全
- 准备: 分配内存,设置初始值
- 解析: 1. 静态链接:程序加载期将符号引用改为直接引用
2. 动态链接:程序运行期……
- 初始化:对类的静态变量初始化为指定的值,执行静态代码块。
二、编译程序的逻辑结构
三、表格与表格管理
常见表格:符号名表、常数表、标号表、入口名表、过程引用表
像不像JVM里面的栈帧
栈帧里面有:
- 局部变量表–>符号名表
- 操作数栈–>常数表
- 动态链接–>过程引用表
- 方法出口–>入口名表
(可能不太准确,但这真的很巧很类似)
四、出错处理
发现源程序错误,把有关错误信息报告给用户。
五、遍
对源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
每遍由从外存上获取前一遍工作结果开始,完成工作后,把结果存在外存上,每遍工作完成后所占用的存储空间大部分被释放。
link:生成可重定位代码,运行时要连接成绝对指令代码。
这里像不像方法出口?
遍的意思是:例如把词法分析、语法分析执行完后,返回值存储下来,是一遍,然后再继续下面的内容。
想一下方法出口,就是执行完一个方法后,又回到主方法中的原来的位置,然后再往下执行其他方法。
六、编译前端与后端
源语言–(前端)–>中间语言–(后端)–>目标语言
编译前端:与源语言有关,与机器无关:词性分析、语法分析、语义分析、中间代码产生
编译后端:与目标机有关:优化、目标代码产生。
高级程序语言简介
一、参数传递
模块之间参数传递三种方式:
- 传地址
- 传值
- 传名
二、存储管理
静态存储分配:编译时就安排好目标程序运行时全部数据空间,并能确定每个数据项目的单元地址
动态存储分配:如果允许递归和可变数据结构,必须动态分配:
栈:整个程序数据空间安排在一个栈中
堆:允许自由的申请和退还空间
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2470290795@qq.com
文章标题:第一章编译过程、高级语言简介
文章字数:1k
本文作者:runze
发布时间:2020-02-25, 14:11:23
最后更新:2020-02-25, 16:32:14
原始链接:http://yoursite.com/2020/02/25/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/%E7%AC%AC%E4%B8%80%E7%AB%A0/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。