免费智能真题库 > 历年试卷 > 程序员 > 2014年上半年 程序员 上午试卷 综合知识
  第31题      
  知识点:   编译程序基本原理   语句结构
  关键词:   编译   源程序        章/节:   软件基础知识       

 
以编译方式翻译C/C++源程序的过程中,语句结构的合法性分析是(31)的任务。
 
 
  A.  词法分析
 
  B.  语义分析
 
  C.  语法分析
 
  D.  目标代码生成
 
 
 

 
  第30题    2012年下半年  
   38%
在以阶段划分的编译器中,符号表管理和(30)贯穿于编译器工作始终。
  第34题    2012年上半年  
   41%
对于高级语言源程序,若(34),则可断定程序中出现语法错误。
  第29题    2012年下半年  
   62%
在编译过程中,进行类型分析和检查是(29)阶段的一个主要工作。
   知识点讲解    
   · 编译程序基本原理    · 语句结构
 
       编译程序基本原理
        编译程序的功能就是把用某种高级语言书写的源程序翻译成与之等价的低级语言的目标程序,如下图所示。
        
        编译程序的功能
        编译程序一般可划分为前后衔接的6个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成,如下图所示。
        
        编译程序的结构
               词法分析阶段的主要任务
               词法分析阶段是编译过程的第一个阶段。词法分析的任务是:从左到右一个个字符地输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词符号(简称单词或符号)。单词是程序设计语言的基本语法符号,如保留字(begin、end、if、for和while等)、标识符、常数、算符及界符(标点符号和左右括号等)。
               在词法分析这一阶段的工作中,所依循的是语言的构词规则。
               语法分析阶段的主要任务
               语法分析的任务是:在词法分析的基础上,根据语言的语法规则(文法规则),把单词符号串分解成各类语法单位,如"短语""子句""句子"("语句")、"程序段"和"程序"。通过语法分解,确定整个输入串是否构成一个语法上正确的"程序"。在语法分析这一阶段的工作中,所依循的是语言的语法规则。
               语义分析阶段的主要任务
               语义分析阶段主要检查源程序是否包含语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能被翻译成正确的目标代码。语义分析的一个主要工作是进行类型分析和检查。程序语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。
               中间代码生成阶段的主要任务
               中间代码产生的任务是根据语义分析的输出生成中间代码。中间代码是一种简单且含义明确的记号系统。中间代码设计原则有两点:一是容易生成;二是容易将它翻译成目标代码。
               代码优化阶段的主要任务
               代码优化的任务是:对前阶段产生的中间代码进行加工变换,以期在最后阶段能产生更为高效(省时间和省空间)的目标代码。优化的主要方面有:公共子表达式的提取、循环优化和算符归约等。在代码优化这一阶段的工作中,所依循的原则是程序的等价变换规则。
               目标代码生成阶段的主要任务
               目标代码生成的任务是:把中间代码(或者经优化处理之后)变换成特定机器上的绝对指令代码、可重新定位的指令代码或者汇编指令代码。这一阶段实现了最后的翻译,它的工作有赖于硬件系统结构和机器指令含义。这一阶段的工作也是最复杂的,涉及计算机硬件系统功能部件的运用,机器指令的选择,各种数据类型变量的存储空间分配,以及寄存器和后缓寄存器的调度等。
               在编译过程中,汇编源程序的各种信息被保留在各种不同的表格里,编译各阶段的工作都涉及构造、查找,或者更新有关的表格。因此,编译程序中必须含有一组管理各种表格的程序。
               如果汇编源程序有错误,编译程序应该设法发现错误,把有关信息报告给用户。这部分工作是由专门的一组出错处理程序完成的,它与编译各阶段都有联系。因此,编译程序中必须含有一组出错处理程序。
 
       语句结构
        在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而使语句复杂化。
        (1)在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确。
        (2)程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写得过于紧凑。
        (3)程序编写得要简单,写清楚,直截了当地说明程序员的用意。
        (4)除非对效率有特殊的要求,否则程序编写要做到清晰第一,效率第二。不要为了追求效率而丧失了清晰性。事实上,程序效率的提高主要应通过选择高效的算法来实现。
        (5)首先要保证程序正确,然后才要求提高速度。反过来说,在使程序高速运行时,首先要保证它是正确的。
        (6)对编译程序做简单的优化。
        (7)尽可能使用库函数。
        (8)避免使用临时变量而使可读性下降。
        (9)尽量用公共过程或子程序去代替重复的功能代码段。
        (10)用调用公共函数去代替重复使用的表达式。
        (11)使用括号来清晰地表达算术表达式和逻辑表达式的运算顺序。
        (12)避免不必要的转移。同时如果能保持程序的可读性,则不必用GOTO语句。
        (13)尽量只采用三种基本的控制结构来编写程序。
        (14)用逻辑表达式代替分支嵌套。
        (15)避免使用空的ELSE语句和IF…THEN IF…的语句。
        (16)避免使用ELSE GOTO和ELSE RETURN结构。
        (17)使与判定相联系的动作尽可能地紧跟着判定。
        (18)避免采用过于复杂的条件测试。
        (19)尽量减少使用“否定”条件的条件语句,不要让读者绕弯子想。
        (20)避免过多的循环嵌套和条件嵌套。
        (21)不要使GOTO语句相互交叉。
        (22)避免循环的多个出口。
        (23)使用数组,以避免重复的控制序列。
        (24)尽可能用通俗易懂的伪码来描述程序的流程,然后再翻译成必须使用的语言。
        (25)数据结构要有利于程序的简化。
        (26)要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见。
        (27)利用信息隐蔽,确保每一个模块的独立性。
        (28)从数据出发去构造程序。
        (29)不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织。
        (30)对太大的程序,要分块编写、测试,然后再集成。
        (31)对递归定义的数据结构尽量使用递归过程。
        (32)注意计算机浮点数运算的特点,例如浮点数运算10.0×0.1通常不等于1.0。
        (33)不要单独进行浮点数的比较。用它们做比较,其结果常常发生异常情况。
        (34)避免不恰当地追求程序效率,在改进效率前,要做出有关效率的定量估计。
        (35)在程序中应有出错处理功能,一旦出现故障时不要让机器进行干预,导致停工。
   题号导航      2014年上半年 程序员 上午试卷 综合知识   本试卷我的完整做题情况  
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 /
 
第31题    在手机中做本题