本章阿猪将带领大家进入编译原理的初步认识,跟着小编一起学习吧
作用:介绍如何将高级程序设计语言变换成计算机硬件所能识别的及其语言,一遍计算机进行处理
第一章引论
1.1程序设计语言与编译
(1)程序设计语言
高级语言(C语言,C++,java等 )
汇编语言(对机器语言的抽象 一种机器一种语言)
机器语言(0 1)
计算机执行一个高级语言程序过程:要进行翻译
(2)转换
翻译:源程序,不改变语义
编译:整体翻译(全部)编译过程:
两个阶段:编译——运行(run)
三个阶段:编译——汇编——运行
解释:语句到语句(一句一句的)效率低
1.2编译程序概述
编译程序工作
词法分析:任务:输入源程序,对过程
语法分析
语义分析和中间代码生成
优化
目标代码生成
词法分析
(1)先进行单词分类
1、保留字:if、int、for、while、do、return、break、continue;
2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列;
3、常数为无符号整形数;
4、运算符包括:+、-、 * 、/、=;
5、分隔符包括:* ,、;、(、)、{、};
(2)把单词转换成统一格式
对基本字\运算符\界限符的转换
标识符的转换
常数的转换
(3)转换完成后的格式
语法分析
根据语法规则又叫文法来分析,规定单词如何构成短语语句过程和程序
(1)语法规则表示
-BNF: A::=B|C
例如:<句子>::=<主><谓><宾>
<主>::=<名词>
赋值语句::=定义为
(2)语法分析的方法
推导(derive)和归约(reduce)
推导:最右推导,最左归约
例题:A => V=E => V=E+TF => V=E+TC(具体例题见书上)
归约:最左推导,最有归约
中间代码生成
1)任务:对语法分析识别出的各类语法范畴(短语、表达式等等),分析其含义,进行和初步翻译,产生介于源代码和目标代码之间的一种代码
2) 阶段
(1)对每种语法范畴进行静态语义检查
(2)若语句正确,就进行中间代码生成
3) 中间代码形式
四元式、三元式、逆波兰式
例题:如何将X=a+b*50
序号 | 算符 | 左操作数 | 右操作数 | 结果 |
---|---|---|---|---|
(1) | 将常数50转换为实常数 | T1 | ||
(2) | * | b | T1 | T2 |
(3) | + | a | T2 | T3 |
(4) | = | T3 | x |
优化
任务:对前面产生的中间代码进行加工变换,以期在最后间断能产生更为高效的
原则:等价变换
主要方面:公共子表达式的提取、合并已知量、删除无用语句、循环优化
目标代码生成
任务:把进过优化的中间代码转化成特定及其上的地基语言代码
目标代码的形式:
绝对指令代码:可以立即执行的目标代码
汇编指令代码:hu8ibianyuyan程序,需要通过汇编程序后才能进行
可重定位指令代码:现将各目标模块连接起来,确定变量、常数在主存中的位置,装入族村后才能成为可以运行的绝对指令
1.3 表格管理
(一)符号表:用来登记源程序的变量名、常量名、数组名
NAME | INFORMATION |
---|---|
m | 整型、变量地址 |
n | 整型、变量地址 |
(二)常数表与标号表:
常数表:登记各类常数
值 |
---|
1 |
2 |
标号表:
NAME | INFORMATION |
---|---|
10 | 四元式序号表 |
(三)入口名表{程序过程、登记过程的层号,分程序符号表入口等}
NAME | INFORMATION |
---|---|
INCWAP | 二目子程序、四元式序号1 |
(四)中间代码表
1.4出错处理
由专门的出错处理程序来完成
错误类型:
语法错误:词法分析语法分析阶段检测出来
语义错误:一般在语义分析阶段检测
1.5遍
定义:对源程序或源程序的中间代码从偷到尾进行扫描一次,并做有关的加工处理,生成新的中间结果或目标代码的过程
注:遍与阶段的含义毫无相关
多遍扫描
优点:节省空间提高目标代码质量是编译的逻辑结构清晰
缺点:编译时间较长
注:在内存可情况下,还是遍数尽可能少一些
1.6编译程序生成
1.直接用机器语言编写
2.用汇编语言编写程序
3.用高级语言编写程序
4.自编译
5.编译工具:LEX(词法分析)YACC(语法)
6.移植(同种语言的编译程序)
1.7编译程序的构造
注:本章内容阿猪根据《编译原理》王生源,和b站的视频结合总结归纳出来的,如果觉得好,那就小赞鼓励一下