编译原理总概述笔记

编译原理

    • 编译原理
    • 程序设计语言分类
    • 翻译
    • 编译
    • 解释
    • 编译的转换过程
      • 两阶段的转换
      • 三阶段的转换
    • 编译程序的工作
      • 词法分析
      • 语法分析
      • 中间代码生成
      • 优化
      • 目标代码生成
    • 表格与表格管理
    • 出错处理
    • 语句翻译实例过程
    • 编写编译程序方式

编译原理

是介绍高级程序设计语言变换成计算机硬件所能识别的机器语言,以便计算机进行处理。

程序设计语言分类

  • 高级语言
  • 汇编语言
  • 机器语言

在计算机上如何执行一个高级语言程序?

  1. 把高级语言程序翻译成机器语言程序
  2. 运行所得的机器语言程序求得计算结果

翻译

是指能把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序—目标语言程序。

编译

专指由高级语言转换为低级语言(汇编语言或机器语言),相当于现实中的笔译。

解释

接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
以源程序作为输入,不产生目标程序,一边解释一边执行。
优点:直观易懂,结构简单,易于实现人机对话。
缺点:效率低,因为不产生目标程序,所以下次要用的话还是要再解释一遍。

编译的转换过程

两阶段的转换

编译(compile) — 运行(run)
比如一个Pascal语言源程序a.pas,经过编译程序进行编译,转换成包括机器语言(0和1)的目标代码的可执行程序a.exe。
在这里插入图片描述

三阶段的转换

编译 — 汇编 — 运行
比如一个C语言源程序a.c,经过编译程序转换成汇编语言,再经过汇编程序转换成目标代码a.obj或a.exe,此处因为是C语言,所以转换成的目标代码为a.obj文件(也是由机器码构成的)。
接下来就是连接(link)过程,该过程不属于编译过程,就是将有关的目标文件彼此相连接,经过连接(link)才将a.obj转换成a.exe可执行文件。
在这里插入图片描述

编译程序的工作

先看自然语言的翻译

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

编译程序的工作与自然语言的翻译极为类似。

编译程序的工作一般分为五或六个步骤(语义分析阶段可以再中间代码生成阶段完成):

词法分析:分析源程序当中的词写得对不对。
语法分析:分析句子是什么样的功能。
语义分析和中间代码生成:语义分析根据要完成的功能看看这句话的意思对不对,中间代码生成方便句子转换成0,1的中间过程,句子到中间代码很容易,中间代码到二进制也很容易。
优化:代码运行的时间空间效率是不是很高,进行优化。
目标代码生成:最终得到目标代码。

在这里插入图片描述

词法分析

主要任务是对输入的源程序字符串进行扫描和分解,识别出一个个的单词,并转化成机器比较容易使用的内码形式。一般内码可以用二元式(类号,内码)表示。

通过词法分析一般可以识别出以下5类单词:

  • 基本字(关键字):void,int,float等
  • 标识符:a,b,c,d,x,y等
  • 整常数:50等
  • 运算符:+,*,=等
  • 界限符:{},;,()等

描述词法规则的有效工具是正规式有限自动机
正规式是用来确定单词是不是符合程序语言所要求的规范,用有限自动机来确定。
总之,词法分析就是扫描源程序字符串,按词法规则识别出正确的单词,并转换成统一规格(类号,内码)交语法分析使用。

语法分析

该阶段的任务就是组词成句。每一种语言都有一组规则,称之为语法规则或文法。按照这些文法,可以由单词组成语法单位,如短语、语句、过程和程序。语法分析就是通过语法分解,确定整个输入串是否能构成语法上正确的句子和程序等。

赋值语句的语法规则写成Backus-Naur-Form式,简称BNF。其形式是A::=B|C,也就是将A定义为B或C。比如:<句子>::=<主><谓><宾>,也就是句子由主语谓语宾语组成。还有其他语句的语法规则,如条件语句、循环语句、过程调用语句等规则。

语法分析有两种方法:推导(derive)和归约(reduce)。分别有最左推导、最右推导、最右归约、最左归约。
推导是从文法的开始符号开始,按照语法规则,每次选择某规则右部的一个候选式取代左部直至识别了句子或者找出错误为止。比如:采用最右推导语句x:=a+b*50的分析如下:
在这里插入图片描述
其中A就是Assignment的缩写,意思是赋值语句,称A为规则的开始符号。如果语句的语法错误的话,推不到原语句。

语法分析过程也可以用一棵倒着的树来表示,也就是语法树。叶子节点从左至右组合起来就是原语句x=a+b*50。
在这里插入图片描述

中间代码生成

主要任务是对语法分析识别出的各类语法范畴,分析其含义,进行和初步翻译,产生介于源代码和目标代码之间的一种代码。源代码生成这种代码很容易,并且这种代码不依赖于机器但又便于产生依赖于机器的目标代码。

分为两阶段工作

  • 对每种语法范畴进行静态语义检查。
  • 若语义正确,就进行中间代码的翻译。

中间代码有多种形式:四元式、三元式、逆波兰式。四元式使用得最广。

例如将x=a+b*50变成中间代码,下图可以看作将数存入寄存器。

在这里插入图片描述
由上表该源语句x:=a+b*50转换成中间代码形式是:

在这里插入图片描述
中间代码是为后续的优化和目标代码生成提供方便,因此中间代码的选择往往与所采用的优化技术和计算机硬件结构有关。

优化

优化的任务在于对前一阶段产生的中间代码进行加工变换,使得在最后阶段能产生出更为高效(省时间、空间)的目标代码。
比如上面的中间代码可变换为如下两句四元式代码:

T1:=B∗50.0T1:=B*50.0T1:=B50.0 x:=a+T1x:=a+T1x:=a+T1

优化主要包括:删除公共子表达式、合并已知量、删除无用赋值、循环优化等。优化所依据的原则是程序的等价变换规则。
例如,把程序段

转换成四元式和经优化后产生的四元式用下表表示:

显然,经优化后循环体缩小了,原来要做701条指令现在只做503条指令;原来要做300次加法,200次乘法,现在只做300次加法,2次乘法。编译程序所产生的目标代码质量的高低,主要取决于代码优化程序功能的强弱。

目标代码生成

这一阶段的主要任务是把经过优化的中间代码转化成特定机器上的低级语言代码。转换过程需涉及具体机器的指令系统以及寄存器分配等硬件功能。
例如,上述经优化后的中间代码可生成如下用汇编语言表示的目标代码:

LOAD           R2,b
MUL             R2,50.0
LOAD           R1,a
ADD             R1,R2
STORE        R1,x

目标代码的形式

  • 绝对指令代码:可立即执行的目标代码。也就是.exe文件。
  • 汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才能运行。
  • 可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码。也就是.obj文件。

表格与表格管理

表格作用:
用以记录源程序的各种信息以及编译过程中的各种状况。
编译的五个阶段都需要与表格打交道,以便后继阶段使用,也即在编译过程的各个阶段都有查造表、填表等功能。

与编译前三阶段有关的表格有:
符号表、常数表、标号表、分程序入口表、中间代码表等。

  • 符号表:登记源程序中的常量名、变量名、数组名、过程名等的性质、定义和引用状况。

  • 常数表:登记源程序中出现的各种类型字面常数(直接量)的值。

  • 标号表:登记源程序中出现的标号的定义和引用情况(此表可与符号表合并)。

  • 分程序入口表:登记过程的层号、分程序符号表的入口(指分程序结构的语言)等,有时也可以并入符号表。

  • 中间代码表:记录四元式序列的表。

例如,对下列FORTRAN程序段:
在这里插入图片描述
有下列各表:
符号表:记录了源程序中出现的三个变量名M、N和K的有关性质。

NAMEINFORMATION
M整型、变量地址
N整型、变量地址
K整型、变量地址

常数表(CT):记录了常数1和4的值(已经是内部二进制代码)

1
4

入口名表:记录了子程序名INCWAP的入口地址,即为四元式表的序号1。

NAMEINFORMATION
INCWAP二目子程序、四元式序号1

标号表:记录了标号10对应的四元式序号4。

NAMEINFORMATION
10四元式序号4

四元式序列表:记录了源程序翻译成的四元式序列。

序号OPARG1ARG_1ARG1ARG2ARG_2ARG2RESULT
1link
2actparINCWAP1M
3actparINCWAP2N
4+M1K
5+N4M
6:=KN
7paractINCWAP1M
8paractINCWAP2N
9return

下面解释各行序号的意义:

  1. (link, _ , _ ,_)表示保护返回地址和有关寄存器内容,它相当于宏
  2. (actpar,INCWAP,1,M)表示传递第一个实变元到M单元
  3. (actpar,INCWAP,2,N)表示传递第二个实变元到N单元
  4. (+,M,1,K)表示K:=M+1
  5. (+,N,4,M)表示M:=N+4
  6. (:=,K,_,N)表示N:=K
  7. (paract,INCWAP,1,M)表示把M送回到第一实变元所指地址单元
  8. (paract,INCWAP,2,N)表示把N送回到第二实变元所指地址单元
  9. (return, _ ,_ ,_)表示恢复寄存器内容,并把控制返回到调用程序

表格管理程序用来对表格的构造、查找和更新。对编译程序而言这只是工具,是事先编制好、供需要时调用的。选择一种好的表格结构和查找算法对于构造编译程序来说是至关重要的。这部分在数据结构中学过。

出错处理

任务是如果源程序有错误,编译程序应设法发现错误,并把有关的出错信息报告给用户。由出错处理程序完成。

错误类型:

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

语句翻译实例过程

要翻译的语句为:
position:=initial+rate∗60position:=initial+rate*60position:=initial+rate60

1.经过词法分析器,得:
id1:=id2+id3∗60id1:=id2+id3*60id1=id2+id360
2.经过语法分析器,得:

在这里插入图片描述
3.经过语义分析器,得:
在这里插入图片描述
4.经过中间代码生成,得:
temp1:=inttoreal(60)temp1:=inttoreal(60)temp1:=inttoreal(60)temp2:=id3∗temp1temp2:=id3*temp1temp2:=id3temp1temp3:=id2+temp2temp3:=id2+temp2temp3:=id2+temp2id1:=temp3id1:=temp3id1:=temp3
5.经过优化,得:
temp1:=id3∗60.0temp1:=id3*60.0temp1:=id360.0id1:=id2+temp1id1:=id2+temp1id1:=id2+temp1
6.经过目标代码生成器,得:
moveid3,R2move \ \ id3,R2move  id3,R2move#60.0,R2move \ \ \#60.0,R2move  #60.0,R2moveid2,R1move\ \ id2,R1move  id2,R1moveR2,R1move \ \ R2,R1move  R2,R1moveR1,id1move \ \ R1,id1move  R1,id1

编写编译程序方式

  1. 直接用机器语言编写编译程序
  2. 用汇编语言编写编译程序
  3. 用高级语言编写编译程序(普遍采用的方法)
  4. 自编译
  5. 编译工具:LEX(词法分析)与YACC(用于自动产生LALR分析表)
  6. 移植(同种语言得编译程序在不同类型得机器之间移植)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFC(一系列以编号排定的文件)

Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society&#xff08;ISOC&#xff09;赞助发行。基本的互联网通信协议都有在RFC文件内…

deprecated_使用Java的@Deprecated前瞻

deprecated我偶尔会遇到一种情况&#xff0c;我需要引入新的API或构造以供其他人试用&#xff0c;但是我知道在使用某些API后&#xff0c;它可能会根据其他人的反馈而改变。 在这种情况下&#xff0c;我想以某种方式注释该构造&#xff0c;以警告其他开发人员此新添加的构造的暂…

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字&#xff1a;云计算XEN Hypervisor FusionSphere摘要&#xff1a;本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析&#xff0c;总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点&#xff0c;为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd&#xff0c;用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…

文件的 MD5 签名介绍

在 RFC1321 中有 MD5 的详细描述。简单的说&#xff0c;MD5 根据文件的内容用算法产生一个唯一的128位签名&#xff0c;用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的理论可能性&#xff0c;但截止到目前还没有人能够做到。所以在文件使用…

apache.camel_Apache Camel 2.21发布–新增功能

apache.camel我们刚刚发布了Apache Camel 2.21&#xff0c;我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供&#xff0c; 我们计划在2018年夏季之前发布。 1&#xff09;处理大型JMS消息 我们在JMS组件中添加了…

人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。

每一日你所付出的代价都比前一日高&#xff0c;因为你的生命又消短了一天&#xff0c;所以每一日你都要更积极。今天太宝贵&#xff0c;不应该为酸苦的忧虑和辛涩的悔恨所销蚀&#xff0c;抬起下巴&#xff0c;抓住今天&#xff0c;它不再回来。一个人失败的最大原因&#xff0…

精通 RPM 之校验篇_检验篇_检测篇

文章目录一、校验介绍二、参考示例&#xff08;一&#xff09;校验某个已安装的软件包的所有文件&#xff08;一&#xff09;校验系统中所有已安装的软件包&#xff08;二&#xff09;校验含有指定文件的软件包&#xff08;三&#xff09;校验指定类别的软件包&#xff08;四&a…

python关于路径需使用的方法笔记

关于python中有关路径实现代码的方法常用的python方法join()方法split()方法关于文件路径\ / // \\的用法解释斜杠/反斜杠\读取某个路径的文件双斜杠//双反斜杠\\\os.path库的方法连接路径与路径或文件名获取绝对路径获取当前文件的绝对路径返回文件名字返回文件所在文件夹的路…

不同的Hibernate命名策略

本文讨论了hibernate提供的不同命名策略&#xff0c;以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后&#xff0c;我们将研究一下在Hibernate和配置中实施自…

设置按峰值带宽计费_西部数码使用指南:云服务器计费模式说明

版权归西部数码所有&#xff0c;原文链接&#xff1a;https://www.west.cn/faq/list.asp?unid2370一、付费模式1、包年包月先付费后使用模式&#xff0c;资源固定&#xff0c;按年或者按月付费购买可享受较大的价格优惠&#xff0c;帮您更大程度节省支出&#xff0c;并且时间固…

信号处理基本概念

信号处理 信号是传递信息的函数&#xff0c;也是独立变量的函数&#xff0c;这个变量可以是时间空间位置等。如图像的灰度值等就是空间位置的函数&#xff0c;声压随着时间在变化&#xff0c;就是时间的函数。 连续信号就是在某个时间区间&#xff0c;除有限间断点外所有瞬时…

如何理解计算机程序中的宏?

计算机科学里的宏是一种抽象&#xff08;Abstraction&#xff09;&#xff0c;它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言&#xff0c;宏展开在编译时发生&#xff0c;进行宏展开的工具常被称为宏展开器。 宏…

过滤器过滤特定的url_如何从过滤器中排除URL

过滤器过滤特定的url默认情况下&#xff0c;过滤器不支持排除特定的URL模式&#xff0c;每当您为过滤器定义URL模式时&#xff0c;任何与该模式匹配的请求都将由过滤器无例外处理。 从过滤器中排除URL的最简单方法是将过滤器映射到非常特定的模式。 在早期开发阶段完成此操作是…

计算机网络视频笔记

计算机网络计算机网络和互联网计算机网络(简称网络)internet(互连网)网络的组成网路边缘网络核心应用层传输层(运输层)网络层&#xff1a;数据链路层和局域网物理层网络安全无线和移动网络多媒体网络网络管理计算机网络和互联网 计算机网络(简称网络) 由若干结点和连接这些结…

一个dsp最小系统至少要有_DSP最小系统电路设计

DSP最小系统电路设计第1章绪论DSP有两种涵义&#xff0c;一种是Digital Signal Processing&#xff0c;指的是数字信号处理技术&#xff1b;一种是DigitalSignalProcessor&#xff0c;指的是数字信号处理器。两者是不可分割的&#xff0c;前者是理论上的技术&#xff0c;要通过…

g++默认字符集utf-8_Java可能使用UTF-8作为其默认字符集

g默认字符集utf-8由于基于Java的应用程序通常用于各种各样的操作系统和环境中&#xff0c;因此Java开发人员会遇到与基于字符的输入和输出有关的问题并不少见。 涉及这些问题的博客文章包括《警察的恐怖&#xff1a;默认语言环境&#xff0c;默认字符集和默认时区》 &#xff1…

Linux 的权限表达式

文章目录一、采用权限字母和操作符表达式&#xff08;一&#xff09;授权对象&#xff08;二&#xff09;权限字母符号二、采用权限数字表达式&#xff08;一&#xff09;权限数字&#xff08;二&#xff09;权限组合&#xff08;三&#xff09;命令 chmod 后面的数字含义一、采…

nat 网卡间数据包转发_nat端口转发示例

nat端口转发示例环境&#xff1a;A服务器&#xff1a; 网卡1:192.168.1.151 网卡2:10.10.69.10B服务器&#xff1a; 网卡1:10.10.69.41要求&#xff1a;访问192.168.1.151:1521 即访问 10.10.69.41:1521启用端口转发&#xff1a;echo 1 > /proc/sys/net/ipv4/ip_forward清空…

精通 RPM 之查询篇

文章目录一、命令格式二、选项详解&#xff08;一&#xff09;查询所有已安装的软件包&#xff08;二&#xff09;查询有哪些软件包属于指定的类别&#xff08;三&#xff09;查询有哪些软件包拥有指定文件&#xff08;四&#xff09;查询有哪些包需要指定功能&#xff08;五&a…