编译篇1

  1. 程序设计语言的转换
  2. 编译程序概述
    1. 例题:
  3. 中间代码生成
  4. 优化
  5. 目标代码生成
  6. 表格与表格管理
  7. 出错与处理
  8. 编译程序生成

引论学习

程序设计语言的转换

  • 编译:从高级语言到低级语言的过程
  • 解释:接受高级语言的一条语句输入,进行解释并控制计算机执行,马上获得该语句的执行结果,然后接受下一条语句
    • 优点:实现人机交互
    • 缺点:效率差,每次都要解释,而不像编译一样,只需编译一次,以后只需执行即可
  • 编译的转换过程:
    • 两阶段转换:编译一一执行image-20230109130459860
    • 三个阶段的转换:编译一一汇编一一运行image-20230109131018804

编译程序概述

自然语言的翻译:

  1. 识别句子中一个个单词
  2. 分析句子的语法结构
  3. 根据句子的含义进行初步翻译
  4. 对译文进行修饰
  5. 写出最后译文

编译程序的工作:

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

image-20230109173201830

词法分析:

  • 任务:对源程序的字符串进行扫描和分解,识别出一个个单词
  • 基本字:void,int,float
  • 标识符:a,b,c,d
  • 长整数:50
  • 运算符:+,-,*,=
  • 界限符:{},;()
  • 词法分析依照词法规则,识别出正确的单词,转换成统一规格,备用
  • 转换:
    • 对基本字、运算符、界限符的转换
    • 标识符的转换
    • 常数的转换
    • 转换完成的格式(类号、内码)
  • 描述词法规则的有效工具是正规式和有限自动机

语法分析:

  • 任务:词法分析后的单词,根据语言的语法规则,把单词符号组成各类语法单位:子句、语句
  • 语法规则:规定单词如何组成句,称为文法
  • 语法规则的表示:
    • BNF: A::=B|C 表示A定义为B或C
  • 语法分析的方法:推导规约
  • 推导:最左推导和最右推导
  • 规约:最右规约和最左规约

赋值语句的语法规则:

  • A::=V=E
  • E::=T|E+T
  • T::=F|T*F
  • F::=V|(E)|C
  • V::=标识符
  • C::=常数

例题:

​ x = a + b*50 根据上面的文法规则运用最右推导:最右推导就是每次只变换最右的字母

A=>V=E => V=E+T => V=E+T*F =>

T=E+T*C =>

T=E+T*50 =>

T=E+F*50 =>

T=E+V*50 =>

T=E+b*50 =>

T=T+b*50 =>

T=V+b*50 =>

T=a+b*50

如何最左规约,就是从T=a+b*50变换到A,也就是赋值运算成立,每次只变换最左边的字母,是最右推导的逆运算

计算机是用语法树来检验语法:

image-20230109181128958

中间代码生成

  • 任务:根据语法分析其中的含义,进行初步翻译,产生介于源代码和目标代码之间的一种代码
  • 分为两阶段的工作:
    • 对每种语法范畴进行静态语义检查
    • 如果语义正确,就进行中间代码的翻译
  • 中间代码形式:四元式、三元式、逆波兰式

将x=a+b*50变成中间代码:

序号 算符 左操作数 右操作数 结果
(1) 将整常数50转换为实常数 T1
(2) * b T1 T2
(3) + a T2 T3
(4) = T3 x

以上就是四元式

优化

  • 对中间代码进行加工变换,变换出效率更高的代码
  • 原则:等价变换,在不改变原意的情况下
  • 主要方面:
    • 公共子表达式的提取:x=(a+b)*c+(a+b)*d
    • 合并已知量:c=a+b d = a+b 未改变a,b的值
    • 删除无用语句:一些注释或者一些与程序本身无关的表达式
    • 循环优化

例如将以下语句转成中间代码:

for( k = 1; k <= 100; k++){
    m = i + 10*k;
    n = j + 10*k;
}

image-20230110193728210

优化:每次乘实际上都是在上一次的基础是+10,所以能将乘操作优化成加法操作,来达到提升效率的目的

image-20230110193939323

目标代码生成

  • 任务:把优化的中间代码转化成特定机器上的低级语言
  • 目标指令的形式:
    • 绝对指令代码:就是01010的机器代码如exe文件,可立即执行
    • 汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才能运行
    • 可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码

表格与表格管理

  • 表格作用:用来记录源程序的各种信息以及编译过程中的各种状况
  • 与编译前三阶段有关的表格:
    • 符号表:用来登记 源程序中的常量名、 变量名、数组名、 过程名等,记录它 们的性质、定义和引用情况image-20230110195304443
    • 常数表与标号表:登记各类常数值,登记标号的定义与作用image-20230110195424180
    • 入口名表:登记过程的层号,分程序符号表入口image-20230110195523654
    • 中间代码表

出错与处理

错误类型:

  • 语法错误:在词法分析和语法分析阶段检测出来
  • 语义错误:一般在语义分析阶段检测

遍:指对源程序或源程序的中间结果从头到尾扫 描一次,并做有关的加工处理,生成新的中间结 果或目标代码的过程。

(遍与阶段的含义毫无关系。)

一遍扫描

image-20230110195852519

==一遍扫描不是一次性扫描和分析,而是通过一句一句的表格是进行反复扫描和分析==

编译程序生成

生成方式:

  1. 直接用机器语言编写编译程序
  2. 用汇编语言编写编译程序
    • 注:编译程序核心部分常用汇编语言编写
  3. 用高级语言编写编译程序:这是普遍采用的方法
  4. .自编译:内置核心编译程序,如何用自身的核心程序去编译其他程序
  5. 编译工具:LEX(词法分析)与YACC(用于自动产生LALR分析 表)
  6. 移植(同种语言的编译程序在不同类型的机器之 间移植)

写编译程序的基本条件:

  • 源程序语言
  • 目标程序语言
  • 编译方法

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

×

喜欢就点赞,疼爱就打赏