暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【软件评测师】考点58——编译系统和解释系统的基础知识

昊洋与你一起成长 2021-10-13
951

编译系统和解释系统的基础知识是软件评测师考试的重要考点,经常出现在上午场的客观选择题当中计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过"翻译程序"翻译成机器语言形式的目标程序,计算机才能识别和执行。这种"翻译"通常有两种方式,即编译方式和解释方式。下面就该知识点并结合例题进行总结学习。


一、编译系统

编译程序把使用某程序设计语言书写的程序翻译为等价的机器语言程序,所谓等价是指目标程序执行源程序的任何预定功能。

一般来说,编译程序分为:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成、符号表管理和出错处理。如下图所示:


(1)词法分析:源程序可以简单地被看成是一个多行的字符串。词法分析阶段是编译过程的第一阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。“单词”符号是程序设计语言的基本语法单位,如关键字、标识符、常数、运算符和分隔符(标点符号、左右括号)等。词法分析程序输出的“单词”常以二元组的方式输出,即单词种类和单词自身的值。


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



(3)语义分析:是审查源程序有无语义错误,为代码生成阶段收集类型信息。语义分析的一个主要工作是进行类型分析和检查,程序设计语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如,整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是类型不匹配的错误。编译器能分析的语义是静态语义,即编译器可以确定的语义,相反,动态语义则是在运行的时候才确定的语义,例如除数为0的情况只有在运行时才能发现。静态语义包括声明类型和类型的匹配、转换。比如当一个浮点数赋值给整型的时候,隐藏了一个过程,就是浮点型到整型转换的过程。但是将浮点数赋值给指针的时候,在语法层面可以,但是语义阶段会发现,类型不匹配则会报错。只有语法和语义都正确的源程序才能被翻译成为正确的目标代码。


(4)中间代码生成:根据语义分析的输出生成中间代码。“中间代码”是一种简单且含义明确的记号系统,可以有若干种形式,它们的共同特征是与具体的机器无关。中间代码的设计原则主要有两点:一是容易生成,二是容易被翻译成目标代码。


(5)代码优化:为了提高目标代码的运行效率和减小目标代码大小,也可以在语法语义分析程序与代码生成程序之间插入代码优化程序。代码优化程序在不改变代码所完成的工作的前提下对中间代码进行改动,使其变成一种更有效的形式。


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


符号表管理和出错管理是始终贯穿全部过程的。

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


(8)出错处理:用户编写的源程序不可避免地会有一些错误,这些错误大致可分为静态错误和动态错误。动态错误也称动态语义错误,它们发生在程序运行时,例如变量取零时作除数、引用数组元素下标越界等错误。静态错误是指编译时所发现的程序错误,可分为语法错误和静态语义错误,如单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误称为语法错误;而语义分析时发现的运算符与运算对象类型不合法等错误属于静态语义错误。在编译时发现程序中的错误后,编译程序应采用适当的策略修复它们,使得分析过程能够继续下去,以便在一次编译过程中尽可能多地找出程序中的错误。


二、解释系统

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



下面是近几年对该知识点考察过的真题,以后仍是考试出题的重点,大家要重视起来。

【2017年第15题】编译和解释是实现高级程序设计语言的两种方式,其区别主要在于(  )。

A、是否进行语法分析

B、是否生成中间代码文件

C、是否进行语义分析

D、是否生成目标程序文件


解析:本题考查程序设计语言中编译和解释系统的基础知识。

编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。解释程序不产生源程序的目标程序,这是它和编译程序的主要区别。

故正确答案为D


【2019年第18题】编译和解释是实现高级程序设计语言的两种基本方式,( )是这两种方式的主要区别。

A、是否进行代码优化  

B、是否进行语法分析

C、是否生成中间代码  

D、是否生成目标代码


解析:本题考查程序设计语言的基础知识。

编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。解释程序不产生源程序的目标程序,这是它和编译程序的主要区别。

故正确答案为:D



作者唯一官方个人微信公众号(昊洋与你一起成长):HYJY20180101

写于2021年10月13日

作者:昊洋讲师

版权所有,侵权必究

文章转载自昊洋与你一起成长,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论