动态编译(dynamic compilation)技术的发展历史不过短短的二十几年。相信谁也没有想到当年籍籍无名的动态编译会成为今天最热门的研究领域之一。目前,有关动态编译技术的讨论也仅限于论文资源,尚无书籍涉及此类话题。
实际上,动态编译技术并不神秘,其最初的应用领域就是程序移植。在20世纪80年代末,随着CPU产业竞争的日益激烈,许多CPU开发商都以兼容其他经典CPU指令集为卖点,大力推广自己的产品。除了某些CPU的确是结构兼容之外,大部分CPU都很难做到这一点。当然,技术并不是唯一的原因,商用因素也是不容忽视的。那么,所谓的“兼容”又是如何做到的呢?事实上,通常的做法就是指令转换,即把用其他CPU指令集描述的程序动态转换成用自身CPU指令集描述的形式。这种转换有些是硬件实现的,有些则是软件实现的。硬件实现的转换通常会设计一组专用的处理器凌驾于主CPU之上,完成指令的实时转换。而软件实现的转换则是将转换程序烧录到BIOS中,在装入用户程序之前,完成动态转换。当然,无论是哪种实现技术,可以肯定的是它们都比操作系统更低级。值得注意的是,在最初的设计方案中,这种转换并不一定是动态的,也可能是静态的。不过,由于应用领域的特殊性,动态转换比静态转换的优势明显得多。在现代编译技术中,通常将这类转换技术视作一种特殊的编译方式,只不过其源程序与目标程序都是二进制形式的,因此,习惯上将其称为“二进制翻译”。二进制翻译是动态编译技术中一个非常重要的领域,稍后将作相关介绍。下面先介绍动态编译技术的一些基本概念。
所谓的“动态编译器”就是指将部分编译工作延后至运行时进行的编译器。而动态编译技术研究的就是如何花费较少的时间,以获得更优化的目标代码。因此,在一定程度上,对于动态编译器而言,编译时间可能比代码质量更重要。这完全打破了静态优化技术的传统观念,许多耗时费力的分析算法是很难被动态编译器接受的。说到这里,读者应该树立一个观点,那就是动态编译通常并不苛求一次编译完成,将整个编译过程分成多次进行是可以接受的。
目前,动态编译技术的主要应用领域有如下几个:
(1)动态语言的实现。例如,Lisp、Perl、Python、Smalltalk、Ruby等都属于动态语言。这类语言的虚拟机或者运行环境通常就是一个动态编译器,它们的工作就是在程序运行过程中,实现将低级IR描述的可执行程序动态编译成二进制形式。当然,这个过程对于用户是完全透明的。(www.daowen.com)
(2)动态二进制翻译。这类应用需求与动态编译的最初原型比较相似。不过,在今天的硬件体系中,实现转换已经不再是终极目标了,如何得到更优的目标代码是人们所关注的。这种技术在目标机移植方面是非常有用的,也是CPU设计厂商重点关注的技术。目前,Intel、IBM、HP等知名公司都正在致力于该领域的研究。
(3)动态优化技术。编译优化通常是指静态优化,不过,有些特殊的代码情景是静态优化无能为力的,笔者稍后举例。在这种情况下,如果试图进一步优化,那么,动态优化将是唯一的选择。
目前,关于动态编译的技术资源并不太多,仅限于一些论文研究。因此,本书也不打算深入探讨动态编译的相关理论话题,只想结合几个经典的研究实例,阐述相关的基本概念,以便读者对动态编译有一定的认识。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。