1、对有些高级语言乃至配置了几个不同性能的编译程序。一个编译程序的重要性体此刻它使得多数运算机用户没必要考虑与机械有关的繁琐细节,使程序员和程序设计专家独立于机械,这关于现今机械的数量和种类持续不断地增加的年代尤其重要。语言和翻译:语言是人类交流思想和信息的工具。如自然语言,世界上存在着许多种语言,各国之间要交流信息,就要有各类语言之间的翻译。运算机语言一样是丰硕多彩的。从功能上看,一个编译程序确实是一个语言翻译程序。它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目口号言)的等价的程序。源语言一般是一个高级语言,如FORTRAN,C 或Pascal。目口号言一般是一个低级语言,如汇编或
2、机械语言。编译程序的功能如下图。请注意:所谓的源和目标程序的等价是什麽含义-他们的功能一样。图编译程序作为一个语言翻译程序,也要在翻译进程中检查源程序的语法和语义,报告一些犯错和警告信息,帮忙程序员更正源程序.因此编译程序的功能也能够图示为:说到一个编译程序, 必然要明白它的源语言是什麽,目口号言是什麽,还有它的实现语言是什麽. 常利用T型图来表示一个编译程序所涉及的三个语言。有关编译程序的术语编译程序的源语言(源程序)编译程序的目标语言(目标程序)编译程序的实现语言给出这些术语的英文:编译程序-compiler源语言-source language源程序-source program目标语言
3、-target or object language目标程序-target or object program实现语言-implementation language若是从运算机系统的角度看,什么是编译程序呢?咱们说编译程序是一种软件,是系统软件。通常以为系统软件是居于运算机系统中最靠近硬件的一层,其他软件一样都通过系统软件发挥作用。系统软件和具体的应用领域无关,如编译系统和操作系统等。编译程序也是一种语言处置系统,即把软件语言书写的各类程序处置成可在运算机上执行的程序。编译程序在运算机系统中的所在层来自运算机百科全书的概念 软件:运算机系统中的程序及其文档系统软件:居于计算机系统中最靠近硬件
4、的一层,其他软件一般都通过系统软件发挥作用。他和具体的应用领域无关,如编译系统和操作系统等。语言处理系统:把软件语言书写的各种程序处理成可在计算机上执行的程序。软件语言:用于书写软件的语言。它主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言。利用过运算机的人都明白,要把软件语言书写的各类程序处置成可在运算机上执行的程序,除编译程序外,还需要一些其它的程序。让咱们分析一下一个程序设计语言程序的典型的处置进程,如图,能够从中进一步了解编译程序的作用。前面介绍过,编译程序的大体任务是将源语言程序翻译成等价的目口号言程序。咱们明白,源语言的种类成千上万,从经常使用的诸如FORTR
5、AN,PASCAL和C语言,到各类各样的运算机应用领域的专用语言,而目口号言也是成千上万的,加上编译程序依照它们的构造不同,所执行的具体功能的不同又分成了各类类型,比如:一趟编译、多趟编译的、具有调试或优化功能的等等。尽管存在这些明显的复杂因素,可是任何编译程序所必需执行的要紧任务大体是一样的,通过明白得这些任务,利用一样的大体技术,咱们能够为各类各样的源语言和目口号言设计和构造编译程序。图 高级语言程序的处理过程一个源程序有时可能分成几个模块寄存在不同的文件里,将这些源程序聚集在一路的任务由一个叫做预处置程序的程序来完成,有些预处置程序也负责宏展开,像C语言的预处置程序要完成文件归并、宏展开
6、等任务。若是编译程序生成的目标程序是汇编代码形式,需要经由汇编程序翻译成可再装配的机械代码,再经由装配/连接编辑程序与某些库程序连接成真正能在机械上运行的代码。也确实是说,一个编译程序的输入可能要由一个或多个预处置程序来产生,另外,为取得能运行的机械代码,编译程序的输出可能仍需要进一步地处置。编译进程概述和编译程序的结构编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的进程。从概念上来讲,一个编译程序的整个工作进程是划分成时期进行的,每一个时期将源程序的一种表示形式转换成另一种表示形式,各个时期进行的操作在逻辑上是紧密连接在一路的。一样一个编译进程划分成词法分析、语法分析、语义分析、
7、中间代码生成,代码优化和目标代码生成六个时期,这是一种典型的划分方式。事实上,某些时期可能组合在一路,这些时期间的源程序的中间表示形式就没必要构造出来了。咱们将别离介绍各时期的任务。另外两个重要的工作:表格治理和犯错处置与上述六个时期都有联系。编译进程中源程序的各类信息被保留在各类不同的表格里,编译各时期的工作都涉及到构造、查找或更新有关的表格,因此需要有表格治理的工作;若是编译进程中发觉源程序有错误,编译程序应报告错误的性质和错误发生的地址,而且将错误所造成的阻碍限制在尽可能小的范围内,使得源程序的其余部份能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为犯错处置。图表示了编译的
8、各个时期。图 编译的各个阶段下面,咱们从源程序在不同时期所被转换成的表示形式来介绍各个时期的任务。词法分析词法分析时期是编译进程的第一个时期。那个时期的任务是从左到右一个字符一个字符地读入源程序,对组成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。那个地址所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。比如标识符用于表示变量名,是由字母字符开头,后跟字母、数字字符的字符序列组成的一种单词。保留字(关键字或大体字)是一种单词,另外还有算符,界符等等。例如某源程序片断如下:begin var sum, first, count: real; sum= fi
9、rst+count*10 end.词法分析阶段将构成这段程序的字符组成了如下19个单词序列:1. 保留字begin2. 保留字var3. 标识符sum 4. 逗号,5. 标识符first6. 逗号,7. 标识符count8. 冒号:9. 保留字real 10. 分号;11. 标识符sum 12. 赋值号=13. 标识符first14. 加号+15. 标识符count 16. 乘号*17. 整数1018. 保留字end19. 界符可以看出,五个字符即b,e,g,i和n构成了一个称为保留字的单词begin,两个字符即和=组成了表示赋值运算的符号=。这些单词间的空格在词法分析时期都被滤掉了。我们知道
10、, 标识符用于表示变量名,可以很方便的使用id1,id2和id3分别表示sum,first和count三个标识符的内部形式,那么经过词法分析后上述程序片断中的赋值语句sum=first+count*10那么表示为id1=id2+id3*10词法分析时期的任务是读字符流的源程序、从中识别并组成单词。一个Pascal源程序片断:position := initial + rate * 60;词法分析后可能返回:单词类型 单词值标识符 position算符(赋值) :=标识符 initial算符(加) +标识符 rate算符(乘) *整数 60界符(分号) ;一个C源程序片断:int a;a = a
11、 + 2;词法分析后可能返回:保留字 int标识符 a界符 ;标识符 a 算符(赋值) =整数 2界符 ;有关的英文词法分析-lexical analysis 或scanning单词-token保留字-resered word标识符 -identifier(user-defined name)语法分析语法分析是编译进程的第二个时期。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如程序,语句表达式等等。一样这种语法短语,也称语法单位可表示成语法树,比如上述程序段中的单词序列:id1=id2+id3*10经语法分析得知其是PASCAL语言的赋值语句,表示成如下图的语法树或是图所示
12、的那种形式。图 语句id1:=id2+id3*10的语法树=id2+id3*10的语法树的另一种形式语法分析所依据的是语言的语法规那么,即描述程序结构的规那么。通过语法分析确信整个输入串是不是组成一个语法上正确的程序。程序的结构一般是由递归规那么表示的,例如,咱们能够用下面的规那么来概念表达式:(1) 任何标识符是表达式。(2) 任何常数(整常数、实常数)是表达式。(3) 若表达式1和表达式2都是表达式,那么:表达式1+表达式2以及表达式1 * 表达式2都是表达式。类似地,语句也可以递归地定义,如(1) 标识符=表达式是语句。(2) while(表达式)do语句和if(表达式 )then语句
13、else语句都是语句。词法分析和语法分析本质上都是对源程序的结构进行分析。但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输入流,碰到既不是字母又不是数字字符时,将前面所发觉的所有字母和数字组合在一路而组成单词标识符。但这种线性扫描那么不能用于识别递归概念的语法成份,比如就无法仅用线性扫描去匹配表达式中的括号。语法分析的功能是进行层次分析,把源程序的单词序列组成语法短语(表示成语法树)。.依据的是语法规那么。Pascal语言的赋值语句的规那么为::=“:=”“+”“* ”=“(”“)”=id=n单词序列id1 = id2 + id3 * 10之因此能表示成图的语法树,依据的是赋值语句和表达式的概念规那么。语义分析语义分析时期的任务是审查源
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1