免费智能真题库 > 历年试卷 > 数据库系统工程师 > 2017年上半年 数据库系统工程师 上午试卷 综合知识
  第22题      
  知识点:   编译过程概述
  关键词:   编译        章/节:   计算机软件基础知识       

 
在以阶段划分的编译中,判断程序语句的形式是否正确属于( ) 阶段的工作。
 
 
  A.  词法分析
 
  B.  语法分析
 
  C.  语义分析
 
  D.  代码生成
 
 
 

 
  第20题    2011年上半年  
   35%
算术表达式采用逆波兰式表示时不用括号,可以利用(20)进行求值。与逆波兰式ab-cd+*对应的中缀表达式是(21)。
  第7题    2018年上半年  
   32%
算术表达式采用后缀式表示时不需要使用括号,使用(5)就可以方便地进行求值。a-b(c+d)(其中,-、+、*表示二元算术运算减、..
  第22题    2016年上半年  
   58%
将高级语言源程序先转化为一种中间代码是现代编译器的常见处理方式。常用的中间代码有后缀式、(22)、树等。
   知识点讲解    
   · 编译过程概述
 
       编译过程概述
        编译程序的作用是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言形式)。编译程序的工作过程一般可以分为6个阶段,如下图所示,实际的编译器中可能会将其中的某些阶段结合在一起进行处理。下面简要介绍各阶段实现的主要功能。
        
        编译器的工作阶段示意图
               词法分析
               源程序可以简单地被看成是一个多行的字符串。词法分析阶段是编译过程的第一阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。“单词”符号是程序设计语言的基本语法单位,如关键字(或称保留字)、标识符、常数、运算符和分隔符(如标点符号、左右括号)等。词法分析程序输出的“单词”常以二元组的方式输出,即单词类别和单词自身的值。
               词法分析过程依据的是语言的词法规则,即描述“单词”结构的规则。例如,对于某Pascal源程序中的一条声明语句和赋值语句:
               
               词法分析阶段将构成这条语句的字符串分割成如下17个单词序列:
               
               对于标识符X、Y、Z,其单词类别都是id(用户标识符),字符串"X""Y""Z"都是单词的值;而对于单词60,整常数是该单词的类别,60是该单词的值。这里用id1、id2和id3分别代表X、Y和Z,强调标识符的内部标识由于组成该标识符的字符串不同而有所区别。经过词法分析后,声明语句VAR X,Y,Z:real;表示为VAR id1,id2,id3:real,赋值语句X:=Y+Z*60;表示为id1:=id2+id3*60;。
               语法分析
               语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”“程序”等。语法规则就是各类语法单位的构成规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树;否则就指出语法错误,并给出相应的诊断信息。对id1:=id2+id3*60进行语法分析后形成的语法树如下图所示。
               
               语法树示意图
               词法分析和语法分析本质上都是对源程序的结构进行分析。
               语义分析
               语义分析阶段分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。只有语法和语义都正确的源程序才能翻译成正确的目标代码。
               语义分析的一个主要工作是进行类型分析和检查。程序语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如,整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是一种类型不匹配的错误。
               在确认源程序的语法和语义之后,就可对其进行翻译并给出源程序的内部表示。对于声明语句,需要记录所遇到的符号的信息,所以应进行符号表的填查工作。在下图所示的符号表中,每一行存放一个符号的信息。第一行存放标识符X的信息,其类型为real,为它分配的地址是0;第二行存放Y的信息,其类型是real,为它分配的地址是4。因此,在该语言中,为一个real型数据分配的存储空间是4个存储单元。对于可执行语句,则检查结构合理的表达式是否有意义。对id1:=id2+id3*60进行语义分析后的语法树如下图所示,其中增加了一个语义处理节点inttoreal,该运算用于将一个整型数转换为浮点数。
               
               语义分析后的符号表和语法树示意图
               中间代码生成
               中间代码生成阶段的工作是根据语义分析的输出生成中间代码。“中间代码”是一种简单且含义明确的记号系统,可以有若干种形式,它们的共同特征是与具体的机器无关。最常用的一种中间代码是与汇编语言的指令非常相似的三地址码,其实现方式常采用四元式。四元式的形式为:
               
               例如,对语句X:=Y+Z*60,可生成以下四元式序列:
               
               其中,t1、t2、t3是编译程序生成的临时变量,用于存放临时的运算结果。
               语义分析和中间代码生成所依据的是语言的语义规则。
               代码优化
               优化是一个编译器的重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间方面的效率较差。当需要生成高效的目标代码时,就必须进行优化。优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。由于中间代码不依赖于具体机器,此时所作的优化一般建立在对程序的控制流和数据流分析的基础之上,与具体的机器无关。优化所依据的原则是程序的等价变换规则。例如,在生成X:=Y+Z*60的四元式后,60是编译时已知的常数,把它转换为60.0的工作可以在编译时完成,没有必要生成一个四元式,同时t3仅仅用来将其值传递给idl,也可以化简掉,因此上述的中间代码可转优化成下面的等价代码:
               
               这只是优化工作中的一个简单示例,真正的优化工作要复杂得多。
               目标代码生成
               目标代码生成是编译器工作的最后一个阶段。这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。例如,使用两个寄存器R1和R2,可对上述的四元式生成下面的目标代码:
               
               这里用#表明60.0为常数。
               符号表管理
               符号表的作用是记录源程序中各符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。
               出错处理
               源程序中不可避免地会有一些错误,这些错误大致可分为静态错误和动态错误。动态错误也称动态语义错误,它们发生在程序运行时,例如变量取零时作除数、引用数组元素下标错误等。静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误,如单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误称为语法错误,而语义分析时发现的运算符与运算对象类型不合法等错误属于静态语义错误。
               在编译时发现程序中的错误后,编译程序应采用适当的策略修复它们,使得分析过程能够继续下去,以便在一次编译过程中尽可能多地找出程序中的错误。
               对于编译器的各个阶段,在逻辑上可以把它们划分为前端和后端两部分。前端包括从词法分析到中间代码生成各阶段的工作,后端包括中间代码优化和目标代码的生成及优化等阶段。这样,以中间代码为分水岭,把编译器分成了与机器有关的部分和与机器无关的部分。如此一来,对于各种程序语言可以开发各自的编译器前端,针对指令系统和体系结构都不同的各种处理器开发相应的后端,最后将每种程序语言的前端与各种处理器的后端有机结合,就形成了每种语言在各种处理器上的编译器。这样,当语言有改动时,只需要修改其编译器的前端部分,如果处理器有改变,仅替换该语言的编译器后端即可。
   题号导航      2017年上半年 数据库系统工程师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第22题    在手机中做本题