现在的位置: 首页 > 综合 > 正文

汇编、编译、解释系统

2013年11月02日 ⁄ 综合 ⁄ 共 4970字 ⁄ 字号 评论关闭

http://book.51cto.com/art/201204/331574.htm

一、汇编语言基本原理

汇编语言源程序由若干条语句组成,一个程序中可以由 3类语句:指令语句、伪指令语句和宏指令语句。

汇编程序的功能是将用汇编语言编写的源程序翻译成机器指令程序。汇编程序的基本工作包括:将每一条可执行汇编语句转换成对应的机器指令;处理源程序中出现的伪指令。

二、编译程序处理的过程

编译程序的功能是把用高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言)。编译程序的工作过程可以分为 6个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成,实际的编译器中可能会将其中的某些阶段结合在一起进行处理。各个阶段逻辑上可以划分为前端和后端两部分。前端包括从词法分析到中间代码生成各个阶段的工作,后端包括中间代码优化、目标代码生成与优化等阶段。这样,以中间代码为分水岭,把编译器分成了与机器有关的部分和与机器无关的部分。编译程序处理过程如图2-4所示。

 
图 2-4 编译程序的处理过程

1.词法分析

源程序可以简单地被看作是一个多行的字符串。词法分析阶段是编译过程的第一阶段,主要任务是对源程序从前到后(从左到右)逐个字符进行扫描,从中识别出一个个“单词”符号。词法分析程序输出的“单词”常采用二元组的方式,即单词类别和单词自身的值。词法分析过程依据的是语言的词法规则,即描述“单词”结构的规则。

2.语法分析

语法分析的任务是在词法分析的基础上,根据语言的语法规则将单个单词符号序列分解成各类语法单位,如“表达式”、“语句”和“程序”等。语法规则就是各类语法单位的构成规则。通过语法分析,确定整个输入串是否构成一个语法上正确的程序。如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树;否则就指出语法错误,并给出相应的诊断信息。词法分析和语法分析本质上都是对源程序的结构进行分析。

3.语义分析

语义分析阶段主要是检查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码。语义分析的一个主要工作是进行类型分析和检查。

4.中间代码生成

中间代码生成阶段的工作是根据语义分析的输出生成中间代码。中间代码是一种简单且含义明确的记号系统,可以有若干种形式,它们的共同特征是代码的方式与具体的机器无关。

中间代码的设计原则主要有两点:一是容易生成,二是容易被翻译成目标代码。语义分析和中间代码生成所依据的是语言的语义规则。

5.代码优化

优化是一个编译器的重要组成部分,优化一般是建立在对程序的控制流和数据流分析的基础之上,与具体的机器无关。优化所依据的原则是程序的等价变换规则。

6.目标代码生成

目标代码生成是编译器工作的最后一个阶段,其任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这阶段的工作与具体的机器密切相关。

7.符号表管理

符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。

8.出错处理

用户编写的源程序不可避免地会有一些错误,这些错误大致可分为静态错误和动态错误。动态错误也称动态语义错误,它们发生在程序运行时,例如变量取零时作除数、引用数组元素下标错误等。静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误,如单词拼写错误、标点符号错、表达式中缺少操作数、括号不匹配等有关语言结构上的错误称为语法错误,而语义分析时发现的运算符与运算对象类型不合法等错误属于静态语义错误。

三、解释程序

解释程序是另一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行时直接执行源程序或源程序的内部形式,即解释程序不产生源程序的目标程序,这点是它与编译程序的主要区别。

解释程序通常可以分成两部分:

第一部分是分析部分,包括通常的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常采用逆波兰表示形式。

第二部分是解释部分,用来对第一部分产生的中间代码进行解释执行。

图2-5显示了解释程序实现高级语言的三种方式。

 

【试题 2-14】2010年 11月真题 21

编译程序分析源程序的阶段依次是(21)。

(21)A.词法分析、语法分析、语义分析 B.语法分析、词法分析、语义分析

C.语义分析、语法分析、词法分析 D.语义分析、词法分析、语法分析

分析:词法分析是编译过程的第一个阶段,其任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位。如果源程序中没有语法错误,语法分析后就能正确地构造其语法树。语义分析阶段的主要任务是检查源程序是否含有静态语义错误,并收集类型信息供后面的代码生成阶段使用。

【答案:A】

【试题 2-15】2010年 5月真题 22

编译程序对C语言源程序进行语法分析时,可以确定(22)。

(22)A.变量是否定义(或声明) B.变量的值是否正确

C.循环语句的执行次数 D.循环条件是否正确

分析:语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”、“语句”、“表达式”等等。语法分析程序判断源程序在结构上是否正确。题目中,只选项A可以在语法分析时可以确定。【答案:A】

【试题 2-16】2010年 5月真题 48

以下关于高级语言程序的编译和解释的叙述中,正确的是(48)。

(48)A.编译方式下,可以省略对源程序的词法分析、语法分析

B.解释方式下,可以省略对源程序的词法分析、语法分析

C.编译方式下,在机器上运行的目标程序完全独立于源程序

D.解释方式下,在机器上运行的目标程序完全独立于源程序

分析:编译和解释是语言处理的两种基本方式。编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段,以及符号表管理和出错处理模块。解释过程在词法、语法和语义分析方面与编译程序的工作原理基本相同,但是在运行用户程序时,它直接执行源程序或源程序的内部形式。

这两种语言处理程序的根本区别是:在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程;而在解释方式下,解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。解释器翻译源程序时不产生独立的目标程序,而编译器则需将源程序翻译成独立的目标程序。【答案:C】

【试题 2-17】2009年 11月真题 22

将高级语言源程序翻译为机器语言程序的过程中常引入中间代码。以下关于中间代码的叙述中,错误的是( 22)。

(22)A.不同的高级程序语言可以产生同一种中间代码

B.使用中间代码有利于进行与机器无关的优化处理

C.使用中间代码有利于提高编译程序的可移植性

D.中间代码与机器语言代码在指令结构上必须一致

分 析:中间代码生成阶段的工作是根据语义分析的输出生成中间代码。中间代码实际上起一个编译器前端与后端分水岭的作用,目的是便于编译器的开发移植和代码的优化。它既与机器指令的结构相近,又与具体的机器无关。【答案:D】

【试题 2-18】2009年 11月真题 48

以下关于编译系统对某高级语言进行翻译的叙述中,错误的是( 48)。

(48)A.词法分析将把源程序看作一个线性字符序列进行分析

B.语法分析阶段可以发现程序中所有的语法错误

C.语义分析阶段可以发现程序中所有的语义错误

D.目标代码生成阶段的工作与目标机器的体系结构相关

分 析:在词法分析阶段,源程序可以简单的被看做是一个多行的字符串。这一阶段的任务是对源程序从前到后(从左到右)逐个字符进行扫描,从中识别出一个个“单词”符号,语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解为各类语法单位,检查其中的语法错误;语义分析阶段主要检查源程序是否包含语义错误,但是一般编译器难以检查出动态语义错误,显然C选项描述的是错误的;目标代码生成是编译器工作的最后一个阶段。这一阶段的任务是把中间代码变化为特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。【答案:C】

【试题 2-19】2009年 5月真题 21

已知某高级语言源程序A 经编译后得到机器C 上的目标程序B,则( 21)。

(21)A.对B 进行反编译,不能还原出源程序A

B.对B 进行反汇编,不能得到与源程序A等价的汇编程序代码

C.对B 进行反编译,得到的是源程序A的变量声明和算法流程

D.对A 和B 进行交叉编译,可以产生在机器C上运行的动态链接库分 析:高级语言源程序经过编译变成可执行文件,反编译就是其逆过程。但通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。【答案:A】将C,Pascal等高级语言编出来的程序进行编译,生成可以被计算机系统直接执行的文件。反汇编即是指

将这些执行文件反编译还原成汇编语言或其他高级语言。在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。

【试题 2-20】2008年 12月真题 20

编译程序对高级语言源程序进行翻译时,需要在该程序的地址空间中为变量指定地址,这种地址称为

(20)。

(20)A.逻辑地址 B.物理地址 C.接口地址 D.线性地址

分 析:本题主要考查“逻辑地址”和“物理地址”的区别。【答案:A】

逻辑地址(Logical Address)是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于当前进程数据段的地址,和绝对物理地址不相干。

线性地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。物理地址(Physical Address)是指出现在 CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。本题中将高级语言程序编译以后产生的仍然是一种程序,只有当程序调入到内存执行时,逻辑地址才会转换成物理地址。

【试题 2-21】2008年 12月真题 42

(42)是指在运行时把过程调用和响应调用所需要执行的代码加以结合。

(42)A.绑定 B.静态绑定 C.动态绑定 D.继承分 析:函数调用与函数本身的关联,以及成员访问与变量内存地址间的联系,称为绑定。在计算机语言中有两种主要的绑定方式:静态绑定和动态绑定。【答案:C】

静态绑定发生于数据结构和数据结构间,程序执行之前。静态绑定发生于编译期,编译时绑定,通过对象调用,因此不能运用任何运行期的信息。它针对函数调用与函数的主体,或变量与内存中的区块;动态绑定则是运行时绑定,通过地址实现,只用到运行期的可用信息。题目中把过程调用和响应调用所需要执行的代码加以结合发生在编译后,所以属于动态绑定。

【试题 2-22】2008年 12月真题 49

高级语言源程序的编译过程分若干个阶段,分配寄存器属于( 49)阶段的工作。

(49)A.词法分析 B.语法分析 C.语义分析 D.代码生成

分 析:目标代码生成是指把(优化后的)中间代码变换成特定机器上的低级语言代码,有赖于硬件系统结构和机器指令含义。分配寄存器涉及物理层面,编译过程中只有目标代码生成涉及到物理层面。

【答案:D】

【试题 2-23】2008年 5月真题 20

编译器对高级语言源程序的处理过程可以划分为词分法析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等几个阶段,其中,( 20)并不是每种编译器都必需的。

(20)A.词法分析和语法分析 B.语义分析和中间代码生成

C.中间代码生成和代码优化 D.代码优化和目标代码生成

分 析:本题考查程序设计语言的编译器原理。编译程序的工程过程见图2-4,其中“中间代码生成”和“代码优化”的虚线框表示不是所有编译器都会有目标代码生成。【答案:C】

【上篇】
【下篇】

抱歉!评论已关闭.