编译程序把用高级语言书写的程序翻译成等价的机器语言程序或汇编语言程序。对话式编译程序,是指有程序需要运行时才进行编译的编译器。对话式编译程序能够运行时特定化:根据运行时常量,将程序代码特定化,然后在其中做各种优化工作。
简介对话式编译程序是一种提高程序运行效率的编译程序,动态的二进制代码转换和优化:将针对一种体系结构产生的目标码,直接移植到与之不同的另一类体系结构上运行。能进行Just-in-time 编译:主要针对 Java 程序进行的运行时编译, 并根据 profiling 收集到的profile 信息进行自适应的优化。一个非常近似的技术是递增式编译。递增式编译器用于POP-2、POP-11、一些Lisp的版本,如Maclisp和最少一种版本的ML语言(Poplog ML)。这需要编程语言的编译器成为执行环境的一部分作为要件以实作。如此便得以在任何时候从终端、从档案、或从执行中程式所建造数据结构中读取源码。然后,转成机器码区块或函数(有可能取代之前同名的函数),之后可立即被程式使用。因为执行中对互动开发和测试的速度的要求,编译后的机器码所做的最佳化程度不如标准“批次编译器”。然而,递增式编译过的程式跑起来通常比同一个程式的一般解译版本还快。递增式编译因而能够同时提供编译和解译语言优点。为了增加可移植性,递增式编译通常采两步骤。第一个步骤会编译到中间、与平台独立的语言,然后再到机器码。在这个例子中,移植只须改变“后端”编译器。不同于动态编译,递增式编译在程式执行后不会做更进一步的最佳化。
编译技术计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言,就是因为有了编译技术。编译技术是计算机语言发展的支柱,也是计算机科学中发展最迅速、最成熟的一个分支,它集中体现了计算机发展的成果与精华。编译技术的核心思想就是把同样的逻辑结构和思想从一种语言表示转化为另外一种语言表示。从高级语言,甚至是运行于虚拟平台的高级语言,到机器语言,最终到硬件执行的物理信号,这一层层转化,无一不涉及到“编译”这个概念的应用。因此,编译技术是人类智慧到机器执行的桥梁,软件到硬件层层推进的衔接力量。编译程序是一个足够复杂的程序,语言功能的完善,硬件结构的发展,环境的友好要求,都对编译程序提出了更高的要求。要构造一个完全独立的全新的编译器可能性很小, 大部分可在现有编译器的基础上扩展,有的采用自展的方式,有的则用自编译的方式。
自展法
随着编译技术的发展和社会对编译程序需求的不断增长,上世纪 60 年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971 年,PASCAL 的编译程序用自展技术生成后,其影响就越来越大。
自动生成法
上世纪 70 年代,随着诸多种类的高级程序设计语言的出现和软件开发自动化技术的提高,编译程序的构造工具陆续诞生,如 70 年代 Bell 实验室推出的LEX 和YACC,这两种工具在各种语言编译程序的实现中还广为应用。其中 LEX 是词法分析器的自动生成工具, YACC 是语法分析器的自动生成工具。
自编译方式
采用自编译方式生成编译程序的思想是先用目标机的汇编语言或机器语言对源程序的核心部分构造一个小小的编译程序,再以它为工具构造一个能够编译更多语言成分的较大编译程序。如此扩展下去,就像滚雪球一样,越滚越大,最后生成人们所期望的整个源语言的编译程序。
发展动力语言范型
程序设计已经基本上从传统的过程式转向对象式,并且正在从对象式转向组件型。 这其实是程序设计范型的变迁,是在计算机技术背景下认识世界的观点的变化:过程式将完成事务看成是一系列的步骤,而对象式却将世界看成是由一系列对象组成的,这些对象之间交互合作完成特定的事务。从过程式到对象式,有着质的变化,而非一般的修改和完善,由此带来了语言的变化。因此,编译技术的讨论对象从过程式语言转到对象式语言。
计算机体系结构
随着学习计算机技术的深入,更加认为计算机系统是复杂度递增的一层层封装结构。 早期计算机系统结构单一,只有一次转化,就是把机器语言转化到电器信号,没有涉及到我们一般意义上的程序设计语言之间的编译转化。然而这个单一简单的系统结构,带来的是程序编写的极大困难,计算机应用无疑成了面向少数数学家的高端应用,其学习曲线的陡峭非常人所能及。 此外,这一极大的复杂度,也影响了编写大型程序的能力。随着汇编、乃至后来高级语言的出现,这一情况就有了改观1。
本词条内容贡献者为:
宋春霖 - 副教授 - 江南大学