在日常生活中,对于两个不同体系的自然语言而言,翻译工作可能是相当复杂的。众所周知,在语法、语义等体系上,不同的自然语言之间都存在着巨大差异,因此,至今自然语言的翻译工作仍然是以手工完成为主。当然,随着对自然语言理解的深入研究,或许在不久的将来计算机准确翻译自然语言会成为可能。那么,作为一种人工语言,程序设计语言的翻译又是如何进行的呢?
程序设计语言的复杂性远不及自然语言,因此,试图让计算机完成程序设计语言的翻译的想法并非奢望。从20世纪60年代开始,许多计算机大师就着眼于高级程序设计语言及其翻译工具的研究,成就了不少优秀的程序语言,例如读者熟知的C、Pascal等。在没有任何理论基础的情况下,大师们进行了艰苦的探索,构造了程序设计语言翻译体系的雏型。在经典编译技术中,程序设计语言的翻译模型主要有两种:解释与编译。
首先,笔者简单介绍一下“解释”。运用解释方法进行翻译的高级语言工具被称为解释程序。解释程序是高级语言翻译程序的一种,它将某一高级语言源程序作为输入,解释一句后就提交计算机执行一句,直至源程序读取完毕。解释程序在计算机应用中并不少见,例如,早期的BASIC语言的翻译程序就是解释程序。另外,网络浏览器也是一种解释程序,它是将HTML以及JavaScript等脚本程序进行解释执行的。再如,UNIX/Linux的Shell也是解释执行的。
下面,再来谈谈“编译”。运用编译方法进行翻译的高级语言翻译器称为编译器(或称为编译程序),这也是本书讨论的重点。虽然编译器的目标语言并不唯一,但是,汇编语言或机器语言是最为常用的目标语言。通常,编译器指的就是把用高级语言源程序翻译成等价的计算机汇编语言或机器语言的目标程序的翻译程序。编译器把高级语言源程序作为输入,而以汇编语言或机器语言的目标程序作为输出。因此,在编译完成后,编译器会生成相应的目标程序。编译器是程序设计语言翻译中应用极广的软件,例如,早期的Turbo C、Turbo Pascal,现代的Delphi、VC++等都是编译器。
这里,笔者必须指出,“解释”与“编译”只是两种翻译方法或者说是方案,并不能直接与某种程序设计语言挂钩。例如,有些书认为BASIC语言是解释语言、C语言是编译语言。严格地说,这种说法并不正确。笔者认为程序设计语言本身并不存在解释、编译之分,C语言一样可以运用解释的方法设计它的翻译程序,BASIC语言同样可以运用编译方法设计它的翻译程序。
随着人们对程序设计语言翻译技术的不断深入研究,有一种新的翻译方法逐步被人们接受,就是编译与解释相结合的方法。这种翻译方法的思路是先通过编译生成一个目标程序,但这一目标程序并不是真正的机器语言程序,而是一种编译器设计人员定义的一个较低级语言描述的程序(可能近似于汇编语言)。这一程序再经过相应的解释器解释执行,如图1-1所示。早期的Lisp语言就是应用这种翻译方式实现的,它使用一种类似于语法树形式的语言作为目标程序的描述语言。
图1-1 “编译+解释”翻译过程(www.daowen.com)
近年来,人们热衷于编译与解释相结合的方法探索,提出了两种改进方案:即时编译、动态编译。
即时编译:先把源程序翻译成一种比较低级的内部语言描述的程序,然后,在执行装载程序时,即时地将程序编译为目标机器的本地机器语言程序,然后直接执行机器语言程序。这种实现方案被广泛应用,例如,Java语言编译器和微软的.NET开发平台都是应用这种方法实现的。Java生成的目标程序是称为字节码的一种较低级语言的程序。而.NET开发平台生成的目标程序是面向CLR(Common Language Runtime)的程序。
动态编译:为了避免即时编译的运行代价,开始时正常解释执行,在执行中,检查执行的热点(如循环、递归调用等),发现热点后动态编译这部分代码,生成本机的机器语言程序以提高执行效率。
关于三种翻译方式的优缺点在学术界争论已久,本书不进行深入分析,只是列出几个公认的观点,见表1-2。笔者认为,作为一位有志于深入学习与研究编译技术的读者,了解翻译方式的基本知识还是有必要的。
表1-2 翻译方式的特点
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。