大家好,我是南瓜~ 在这篇文章中,我们将介绍软件评测师考试重点难点知识中的《第三章 程序语言基础》的第二节 程序编译。这是软考综合知识,也适合软件设计师等其他专业参考。 一、编译程序和解释程序 计算机只能理解由0、1序列构成的机器语言,因此高级程序设计语言需要翻译,担负这一任务的程序称为“语言处理程序”。语言之间的翻译形式有多种,基本方式为汇编、解释和编译。 用某种高级语言或汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行。如果源程序是用汇编语言编写的,则需要一个汇编程序将其翻译成目标程序后才能执行。如果源程序是用某种高级语言编写的,则需要对应的解释程序或编译程序对其进行翻译,然后在机器上运行。 1、编译程序 编译程序也称编译器,是将程序翻译成目标语言程序,然后在计算机上运行目标程序。 编译执行:经过编译程序编译后才能执行的方式,称为编译执行。 编译执行是一种预先编译的方式,即将高级语言转换成机器语言,然后在目标平台上运行。这个过程是在程序第一次运行前完成的,因此,一旦编译成功,后续运行时就无需再次编译,提高了运行效率。 编译执行的优缺点: (1)优点 编译执行的运行效率高是其最大的优点,因为它避免了每次运行都需要重新翻译的过程。这对于需要快速响应的应用程序尤其重要。 (2)缺点 由于编译器需要在运行前一次性完成所有的翻译工作,这可能会增加编译时间。此外,如果源代码中有错误,编译器可能无法检测到,导致无法预期的行为。 编译执行的程序设计语言的代表:C、C++、Pascal、Fortran等。 总之,编译执行适合于那些需要高性能和高可靠性的应用程序,尤其是那些不经常更改且预期性能要求较高的场景。 2、解释程序 解释程序也称解释器,是指直接解释执行源程序,或者将源程序翻译成某种中间代码后再加以执行。一般来说,中间代码和源程序有很强的相似性,可以反编译成源程序。 解释执行:不需要经过编译程序编译,而是通过解释程序解释后能直接执行的方式,称为解释执行。 解释执行是一种动态的解释方式,即在执行代码时,逐行翻译并执行。这种方式可以在程序运行时根据需要调整和改变代码的执行路径,从而提供了更大的灵活性和适应性。 解释执行的优缺点: (1)优点 解释执行的启动速度快,因为它不需要像编译执行那样进行完整的编译过程。此外,解释执行对内存的使用较少,因为它不需要保存编译后的机器码文件。 (2)缺点 解释执行的运行效率相对较低,因为它每次执行都需要重新翻译代码。这意味着对于大型复杂应用,解释执行可能需要更长的时间来完成任务。 解释执行的程序设计语言的代表: (1)脚本语言:JavaScript、Python、PHP、Perl、Ruby、Bash Shell等。 注:所有的脚本语言都是解释执行的。 (2)先翻译成某种等价的中间代码,再由虚拟机执行的语言:Java、C#等。 注:Java和C#的中间代码和源程序有很强的相似性,可以反编译成源程序,所以依然属于解释执行的。 总之,解释执行更适合于那些需要快速开发和迭代的环境,以及那些频繁更改代码的小型应用程序。 3、编译程序和解释程序的区别 在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程。 在解释方式下,解释程序和源程序(或某种等价表示的中间代码)要参与到程序的运行过程中,运行程序的控制权在解释程序。 也就是,编译方式有生成独立的目标程序,而解释方式是直接翻译程序并不生成独立的目标程序。 二、程序设计语言的基本要素(语句、语法、语义、语用等) 1、语句 语句是由各种表达式构成的短句,用于描述程序中的运算步骤、控制结构及数据传输。 2、语法 语法是指由程序语言的基本符号组成程序中的各个语法成分(包括程序)的一组规则,这些规则定义了如何按照特定的结构组织和表达代码。语法规则规定了基本符号的书写顺序和方式。程序设计语言的语法可通过形式语言进行描述。 3、语义 语义是程序语言中按语法规则构成的各个语法成分的含义,可分为静态语义和动态语义。静态语义指编译时可以确定的语法成分的含义;而动态语义是指运行时才能确定的语法成分的含义。一个程序的执行效果说明了该程序的语义,它取决于构成程序的各个组成部分的语义。 4、语用 语用表示了构成语言的各个记号和使用者的关系,涉及符号的来源、使用和影响。语用的实现有个语境问题。语境是指理解和实现程序设计语言的环境,包括编译环境和运行环境。 三、编译器的工作过程 编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言)。编译程序的工作过程可以分为6个阶段,如下图所示,在实际的编译器中可能会将其中的某些阶段结合在一起进行处理。 1、词法分析 源程序可以简单地被看成是一个多行的字符串。 词法分析阶段是编译过程的第一个阶段,该阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。“单词”符号是程序设计语言的基本语法单位,如关键字(或称保留字)、标识符、常数、运算符和分隔符(如标点符号、左右括号)等。 词法分析程序输出的”单词“常以二元组的方式输出,即单词种别和单词自身的值。 2、语法分析 语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,例如 “表达式、语句、程序”等。 语法规则就是各类语法单位的构成规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树;否则指出语法错误,并给出相应的诊断信息。 词法分析和语法分析在本质上都是对源程序的结构进行分析。 3、语义分析 语义分析阶段分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。 只有语法和语义都正确的程序才能翻译成正确的目标代码。 语义分析的一个主要工作是进行类型分析和检查。程序设计语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上面的运算。例如,整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是类型不匹配的错误。 需要注意的是,语义分析阶段只能检查静态语义错误(例如类型不匹配),不能检查动态语义错误(例如除数为零的错误)。动态语义错误只能在运行时检测。 在确认源程序的语法和语义之后,即可对其进行翻译并给出源程序的内部表示。 4、中间代码生成 中间代码生成阶段的工作是根据语义分析的输出生成中间代码。“中间代码”是一种简单且含义明确的记号系统,可以有若干种形式,它们的共同特征是与具体的机器无关。最常用的一种中间代码是与汇编语言的指令非常相似的三地址码,其实现方式常采用四元式。 四元式的形式为: (运算符,运算对象1,运算对象2,运算结果) 语义分析和中间代码生成所依据的是语言的语义规则。 5、代码优化 由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间上和空间上有较大的浪费。当需要生成高效的目标代码时,必须进行优化。优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。由于中间代码不依赖于具体机器,此时所做的优化一般建立在对程序的控制流和数据流分析的基础之上,与具体的机器无关。优化所依据的原则是程序的等价交换规则。 6、目标代码生成 目标代码生成是编译器工作的最后一个阶段。这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。 7、符号表管理 符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。 8、出错管理 用户编写的源程序不可避免地会有一些错误,这些错误大致可分为静态错误和动态错误。 动态错误也称为动态语义错误,它们发生在程序运行时,例如变量取零时做除数、引用数组元素下标错误等。 静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误。 语法错误指的是语言结构上的错误,例如单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等错误。 而静态语义错误指的是语义分析时发现的运算符与运算对象类型不合法等错误(比如对浮点数进行取模运算等)。 在编译时发现程序中的错误后,编译程序应该采用适当的策略修复它们,使得分析过程能够继续下去,以便在一次编译过程中尽可能多地找出程序中的错误。 9、编译过程可以省略的阶段 编译过程的6个阶段中,以中间代码为分水岭,分成了与机器无关的阶段和与机器有关的阶段。与机器无关的阶段包括四个阶段:词法分析、语法分析、语义分析、中间代码生成。与机器有关的阶段包括两个阶段:代码优化、目标代码生成。 其中,中间代码生成阶段和代码优化阶段不是必须经过的阶段,可以省略。 (来自百度百科) 五、历年试题分析 【2020年试题】 答案:A 【2017年试题】 答案:D 【2015年试题】 答案:C 编后语:由于微信修改了推送规则,没有经常留言或点“在看”的,会慢慢地收不到推送!如果你还想每天看到我们的推送,请将 “南瓜教学“加为星标或每次看完后点击一下页面下端的 “赞” “在看”,谢谢! 上一篇:知道创宇赵伟:怼死“空气币” 下一篇:(六年级、新初一随笔四篇)《曹操在我心中》《观沧海说曹操》《阿瞒是个大英雄》《我心中的曹操》 |