第一章编译过程、高级语言简介

编译过程

一、程序编译过程

  • 词法分析
  • 语法分析
  • 中间代码产生
  • 优化
  • 目标代码生成

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:生成可重定位代码,运行时要连接成绝对指令代码。


这里像不像方法出口?

遍的意思是:例如把词法分析、语法分析执行完后,返回值存储下来,是一遍,然后再继续下面的内容。

想一下方法出口,就是执行完一个方法后,又回到主方法中的原来的位置,然后再往下执行其他方法。


六、编译前端与后端

源语言–(前端)–>中间语言–(后端)–>目标语言

编译前端:与源语言有关,与机器无关:词性分析、语法分析、语义分析、中间代码产生

编译后端:与目标机有关:优化、目标代码产生。

高级程序语言简介

一、参数传递

模块之间参数传递三种方式:

  • 传地址
  • 传值
  • 传名

二、存储管理

  1. 静态存储分配:编译时就安排好目标程序运行时全部数据空间,并能确定每个数据项目的单元地址

  2. 动态存储分配:如果允许递归和可变数据结构,必须动态分配:

    栈:整个程序数据空间安排在一个栈中
    堆:允许自由的申请和退还空间


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏