编译所解释
‘壹’ 编译原理全部的名词解释
书上有别那么懒!。。。。
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的。):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)
第1个L:从左到右扫描输入串 第2个L:生成的是最左推导
1 :向右看1个输入符号便可决定选择哪个产生式
某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归
文法符号的属性:单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)
G:上下文无关文法。
V:属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属
继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。
(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供。
在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。
语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。
语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
中间代码(中间语言)
1、是复杂性介于源程序语言和机器语言的一种表示形式。
2、一般,快速编译程序直接生成目标代码。
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。
何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。
为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言。
(2)便于移植,便于修改,便于进行与机器无关的优化。
中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式
符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏。
信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏。主栏的内容称为关键字(key word)。
符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性。(3)作为目标代码生成阶段地址分配的依据
符号的主要属性及作用:
1. 符号名 2. 符号的类型 (整型、实型、字符串型等))3. 符号的存储类别(公共、私有)
4. 符号的作用域及可视性 (全局、局部) 5. 符号变量的存储分配信息 (静态存储区、动态存储区)
存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式。
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。
2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:不允许递归调用,不含有可变数组。
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定。 是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。
2、两种动态存储分配方式:栈式,堆式
栈式动态存储分配
分配策略:将整个程序的数据空间设计为一个栈。
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据)。
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录。
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。
优化原则:等价原则:经过优化后不应改变程序运行的结果。
有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。
合算原则:以尽可能低的代价取得较好的优化效果。
常见的优化技术
(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。
给我分数啊。。。
‘贰’ 编译程序和解释程序都是什么意思
1、编译程序是把用高级程序设计语言或计算机汇编语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序,属于采用生成性实现途径实现的翻译程序。编译程序以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出;编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。
2、解释程序是高级语言翻译程序的一种,它将源语言书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。就像外语翻译中的“口译”一样,说一句翻一句,不产生全文的翻译文本。
(2)编译所解释扩展阅读:
编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。但是,由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,编译程序广泛地用于翻译规模较大、复杂性较高、且需要高效运行的高级语言书写的源程序。
‘叁’ 程序的编译与解释有什么区别
一 解释和编译的区别 解释是读一段代码,解释执行一段代码。如果已经完成一段代码的语法分析和语义分析并且生成了执行过程,但是不立即执行这个过程,而是把它们全部收集起来,连成一个大的执行过程,这就是编译这也意味着01 相同一段代码,每次解释执行都要重复进行语法分析和语义分析,编译执行省略了这个过程 02 解释是交错执行,完全按照程序“原始”的控制流走,编译则有机会对整个程序进行流分析和优化 03 编译后的代码是“固定”的,解释执行则可以在代码运行时直接修改代码和数据 二 解释型语言和编译型语言的区别 动态特性越多的语言,需要解释的地方就越多,反之则越少。 特别要说一下,C语言和汇编是完全没有动态特性的语言,所以几乎所有语言的运行时系统,都是用C来写的不过这一点上,解释和编译并没有非常清晰的区别,动态特性也可以交给即时编译器来处理
‘肆’ 解释 编译和编译 汇编的区别是什么
解释和编译针对的是高级语言的。是高级语言转换成机器代码的方式。编译指的是一次性将程序代码给转换成机器代码,这样做好处是编译之后的可执行程序方便移植,可以优化程序代码,并且执行效率要比解释语言的高!解释是指边解释边运行,解释一条语句便执行一条。显然这样的程序执行效率是比较低的。比如C/C++用的是编译,而basic用的是解释。JAVA既用到解释,又用到编译。而汇编是一种低级程序设计语言,直接操纵底层硬件。是在机器语言(0,1代码串)的基础上采用助记符的方式发展而来的。很多病毒都是通过汇编语言写的。用汇编编写的程序执行效率非常高!只是不方便写程序。汇编语言是低级语言,没有语法,就是一条条机器指令的助记符而已,所以汇编的时候不需要语法分析。编译时把高级语言处理成机器指令的过程,编译的时候需要做词法分析和语法分析,然后是代码生成。
‘伍’ 计算机中翻译和编译的含义。
A、解释程序
所谓解释程序是高级语言翻译程序的一种,它将源语言(如BASIC)书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。就像外语翻译中的“口译”一样,说一句翻一句,不产生全文的翻译文本。这种工作方式非常适合于人通过终端设备与计算机会话,如在终端上打一条命令或语句,解释程序就立即将此语句解释成一条或几条指令并提交硬件立即执行且将执行结果反映到终端,从终端把命令打入后,就能立即得到计算结果。这的确是很方便的,很适合于一些小型机的计算问题。但解释程序执行速度很慢,例如源程序中出现循环,则解释程序也重复地解释并提交执行这一组语句,这就造成很大浪费。
B、编译程序
这是一类很重要的语言处理程序,它把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机去执行这个目标程序,得到计算结果。
编译程序工作时,先分析,后综合,从而得到目标程序。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。为了完成这些分析综合任务,编译程序采用对源程序进行多次扫描的办法,每次扫描集中完成一项或几项任务,也有一项任务分散到几次扫描去完成的。下面举一个四遍扫描的例子:第一遍扫描做词法分析;第二遍扫描做语法分析;第三遍扫描做代码优化和存储分配;第四遍扫描做代码生成。
值得一提的是,大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,但也有的编译程序则先产生汇编语言一级的符号代码文件,然后再调用汇编程序进行翻译加工处理,最后产生可执行的机器语言目标文件。
在实际应用中,对于需要经常使用的有大量计算的大型题目,采用招待速度较快的编译型的高级语言较好,虽然编译过程本身较为复杂,但一旦形成目标文件,以后可多次使用。相反,对于小型题目或计算简单不太费机时的题目,则多选用解释型的会话式高级语言,如BASIC,这样可以大大缩短编程及调试的时长。
望采纳!!!
‘陆’ 解释和编译有什么区别
一、与计算机的交流方式不同
1、解释程序不产生目标代码,它逐条地取出源程序中的语句,边解释,边执行;解释器把源代码文件边解释成机器语言边交给CPU执行。
三、开发便捷性
1、解释程序可以随时修改,立刻生效,改完源代码后,直接运行看效果
2、编译程序每次修改源代码,都要重新编译,生成机器码文件
四、运行速度
1、解释程序运行效率低,所有的代码均需经过解释器边解释变执行,速度比编译型慢很多
2、编译程序执行速度快,因为你的程序代码已经翻译成了是计算机可以理解的机器语言。
‘柒’ 源程序的编译与解释的基本概念
源程序的编译是指对于程序源代码的编译过程,由编译器完成,适用于编译语言,编译的过程会生成相应的程序的机器码。源程序的解释是指对于程序源代码的解释的过程,由解释器完成,适用于解释语言。解释语言和编译语言的区别在于解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行;解释语言编写的程序有时被称为脚本,一般是读者可以直接阅读的代码。解释器通过读取脚本,对它解释,然后执行脚本中的命令。 例如:我们通常使用的DOS命令行命令执行环境本身就是一个解释器。读入键入:“dir”命令并回车,解释器接收并翻译这条命令,然后进行系统调用来完成命令的运行,并把结果显示出来。相应的.bat批处理文件可以说就是一种脚本。编译语言需要通过编译器,将所编写的程序翻译成计算机的机器语言。完成编译后的程序无需其他程序,自己可独立运行。因为编译后的程序是由机器语言指令构成的,所以通常它的运行速度很快。但是使用不同硬件平台的计算机,它们的机器语言也是截然不同的,这同样使得编译过的程序不能顺利地从一个计算机平台往另外一个平台上移植。所以,在不同的平台之间,往往需要重新编译甚至重写程序。解释性程序没有这个限制。一般情况下,只要有相应版本的语言解释器,脚本程序就可以几乎不做任何修改地移植到其他平台上去。
‘捌’ 名词解释编译程序
编译程序(Compiler,compiling program)也称为编译器,是指把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。
‘玖’ 编译和解释的区别是什么
程序编译(compilation , compile)是指利用编译程序从源语言编写的源程序产生目标程序的过程。
程序解释是高级语言翻译程序的一种,它将源语言书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。
‘拾’ 简述“编译”和“解释”的区别
编译:把程序转化成为可被计算机内部识别并执行的代码。或者说是生成可执行文件。
解释:在程序中加上自己的注释,以让人易于理解。