编译程序是指把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序要求足够复杂和完善的语言功能。可扩充编译程序是其他编译程序在现有编译器基础上扩展,最后得到较为完善的源语言的编译程序。
简介一个编译程序的重要性体现为它使得多数计算机用户不必考虑有关的繁琐细节。使程序员和设计专家独立于计算机。可扩充编译程序简单来说是指编译程序允许程序设计人员对编译程序的功能进行扩充和完善。与编译实现方式有关,例如编译程序采用自编译方式,程序设计人员就可以根据实际需求对编译程序进行完善。
编译实现方式自展法
随着编译技术的发展和社会对编译程序需求的不断增长,上世纪 60 年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971 年,PASCAL 的编译程序用自展技术生成后,其影响就越来越大。
自动生成法
上世纪 70 年代, 随着诸多种类的高级程序设计语言的出现和软件开发自动化技术的提高,编译程序的构造工具陆续诞生,如 70 年代 Bell 实验室推出的 LEX 和 YACC ,这两种工具在各种语言编译程序的实现中还广为应用。 其中 LEX 是词法分析器的自动生成工具, YACC 是语法分析器的自动生成工具。
自编译方式
采用自编译方式生成编译程序的思想是先用目标机的汇编语言或机器语言对源程序的核心部分构造一个小小的编译程序,再以它为工具构造一个能够编译更多语言成分的较大编译程序。 如此扩展下去,就像滚雪球一样,越滚越大,最后生成人们所期望的整个源语言的编译程序1。
编译程序编译程序(Compiler)是一种程序。它把用高级语言写的源程序作为数据接收,经过翻译转换,产生面向机器的代码作为输出。编译程序完成从源程序到目标程序的翻译工作是一个复杂的整体过程,一般来说,一个编译程序的整个工作过程是分成六个阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。这个六个阶段是: 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。
词法分析程序的主要任务: 读源程序,产生单词符号和滤掉空格。逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。词法分析是编译过程中的一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。词法分析程序的主要功能是从字符流的源程序中识别单词,他要从左至右逐个字符地扫描源程序,因此他还可完成其他一些任务。比如,滤掉源程序中的注释和空白;又比如 ,为了使编译程序能将发现的错误信息与源程序的出错位置联系起来2。
语义分析阶段审查源程序有无语义错误 ,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个运算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告出错。又比如某些语言规定运算对象可被强制,那么当二目运算施于一整型和一实型时,编译程序应将整型转换实型而不能认为是源程序的错误。
中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现中间代码,即为中间语言程序,中间语言的复杂性介于源程序语言和机器语言之间。中间语言有多种形式,常见的有逆波兰记号、四元式、三元式和树。代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。
本词条内容贡献者为:
宋春霖 - 副教授 - 江南大学