
编译器例程
编译器(compiler),是一种电脑程式,它会将用某种程式语言写成的原始码(原始语言),转换成另一种程式语言(目标语言)。编译器例程是指可由其他函式或程式调用的编译器内部函式或子程式。编译器例程也可以理解为编译器对外提供的功能接口或服务的集合。
基本介绍
- 中文名:编译器例程
- 外文名:compiler routines
- 学科:计算机
- 定义:对外提供的功能接口或服务的集合
- 有关术语:编译器
- 作用:独立实现特定功能
简介
例程是指可由其它程式或子程式调用的子程式。子例程有两个方面:一个是定义方面,称为子例程定义或子例程说明;另一个是调用方面,称为子例程调用。随着实现方式的不同 ,又可区分为开式子例程和闭式子例程。其中子程式是指与子计算任务相应的处理对象和处理规则的描述。编译器例程是指编译器程式的一部分代码,该代码执行特定的任务并且与编译器中的其他代码相对独立。编译器例程可以独立向外提供功能与服务。编译例程可以是词法分析、语法分析、语义分析程式。
词法分析(英语:lexical analysis)是计算机科学中将字元序列转换为单词(Token)序列的过程。进行词法分析的程式或者函式叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函式的形式存在,供语法分析器调用。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字元一个字元地读入源程式,即对构成源程式的字元流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程式实现这个任务。词法分析程式可以使用Lex等工具自动生成。词法分析是编译程式的第一个阶段且是必要阶段;词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程式的常用途径:自动生成,手工生成。
在计算机科学和语言学中,语法分析(英:Syntacticanalysis,也叫Parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。语法分析器(Parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字元流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。
编译器
又称编译程式,是将高级语言源程式翻译成低级语言程式。一个足够複杂的程式,语言功能的完善,硬体结构的发展,环境的友好要求,都对编译程式提出了更高的要求。编译器属于採用生成性实现途径实现的翻译程式。它以高级程式设计语言书写的源程式作为输入,而以彙编语言或机器语言表示的目标程式作为输出。编译出的目标程式通常还要经历运行阶段,以便在运行程式的支持下运行,加工初始数据,算出所需的计算结果。编译过程分为分析和综合两个部分,并进一步划分为词法分析、语法分析、语义分析、代码最佳化、存储分配和代码生成等六个相继的逻辑步骤。这六个步骤只表示编译程式各部分之间的逻辑联繫,而不是时间关係。编译过程既可以按照这六个逻辑步骤顺序地执行,也可以按照平行互锁方式去执行。在确定编译程式的具体结构时,常常分若干遍实现。对于源程式或中间语言程式,从头到尾扫视一次并实现所规定的工作称作一遍。每一遍可以完成一个或相连几个逻辑步骤的工作。例如,可以把词法分析作为第一遍;语法分析和语义分析作为第二遍;代码最佳化和存储分配作为第三遍;代码生成作为第四遍。反之,为了适应较小的存储空间或提高目标程式质量,也可以把一个逻辑步骤的工作分为几遍去执行。例如,代码最佳化可划分为代码最佳化準备工作和实际代码最佳化两遍进行。一个编译程式是否分遍,以及如何分遍,根据具体情况而定。其判别标準可以是存储容量的大小、源语言的繁简、解题範围的宽窄,以及设计、编制人员的多少等。分遍的好处是各遍功能独立单纯、相互联繫简单、逻辑结构清晰、最佳化準备工作充分。缺点是各遍之中不可避免地要有些重複的部分,而且遍和遍之间要有交接工作,因之增加了编译程式的长度和编译时间。一遍编译程式是一种极端情况,整个编译程式同时驻留在记忆体,彼此之间採用调用转接方式连线在一起。当语法分析程式需要新符号时,它就调用词法分析程式;当它识别出某一语法结构时,它就调用语义分析程式。语义分析程式对识别出的结构进行语义检查,并调用“存储分配”和“代码生成”程式生成相应的目标语言指令。随着程式设计语言在形式化、结构化、直观化和智慧型化等方面的发展,作为实现相应语言功能的编译程式,也正向自动程式设计的目标发展,以便提供理想的程式设计工具。
推动编译技术发展的因素
语言范型
程式设计已经基本上从传统的过程式转向对象式,并且正在从对象式转向组件型。这其实是程式设计范型的变迁,是在计算机技术背景下认识世界的观点的变化:过程式将完成事务看成是一系列的步骤,而对象式却将世界看成是由一系列对象组成的,这些对象之间互动合作完成特定的事务。从过程式到对象式,有着质的变化,而非一般的修改和完善,由此带来了语言的变化。 因此,编译技术的讨论对象从过程式语言转到对象式语言。
计算机体系结构
随着学习计算机技术的深入,更加认为计算机系统是複杂度递增的一层层封装结构。早期计算机系统结构单一,只有一次转化,就是把机器语言转化到电器信号,没有涉及到我们一般意义上的程式设计语言之间的编译转化。然而这个单一简单的系统结构,带来的是程式编写的极大困难,计算机套用无疑成了面向少数数学家的高端套用,其学习曲线的陡峭非常人所能及。 此外,这一极大的複杂度,也影响了编写大型程式的能力。 随着彙编、乃至后来高级语言的出现,这一情况就有了改观。