X86的过去与未来 吴刚 2000年 第28期   有关x86未来的问题在几年前就有人提起过,并得出这样一个结论:x86应该在五年后达到极限。可结果呢?英特尔的PⅢ和AMD的Athlon已经上市一段时间了,现在英特尔最新的处理器P4(Willamette)很快也会上市。这一切表明x86至少到目前为止还看不出任何衰亡的迹象,显然上面对x86未来的判断是不正确的。现在这个问题被人们再次提起:x86到底有没有极限?什么时候达到这一极限?这是一个很难回答的问题,在回答这个问题之前,首先应该了解x86的起源。   在计算机工业发展初期,计算机制造商还没有设计出兼容的计算机系统。那时软件的编写都是直接面向硬件系统的,每台计算机都有自己的操作系统和应用软件,这和今天游戏机的情况很相似。这些操作系统和应用软件无法运行在其他类型的计算机系统上,甚至是同一计算机制造商的其他类型计算机上,就像N64游戏无法运行在早期的NES或PlayStation上一样。因为软件不兼容暴露出的问题是显而易见的,每当一种新机型出现,软件开发者不得不重新开始为新机器编写操作系统和应用软件。你无法利用已有的代码,软件开发者必须重新学习新机器的指令系统,这无疑浪费了大量的时间和金钱,所以下面的问题摆在软件开发者面前:如何找出硬件系统共同的特性并使开发出的软件可以运行在不同的硬件系统上。   为了解决上述问题,IBM引入了ISA(Instruction Set Architecture工业标准体系结构)概念,将软件开发者编程所需的硬件信息从硬件系统中分离出来,或者说开发者所需要的指令系统从每一台机器上剥离下来。这样开发者就可以面向ISA进行编程,开发出的软件不经修改就可以应用在其他采用ISA架构的系统上。IBM制造的IBM System/360就是首先引入这种结构的计算机系统。ISA为软件开发者提供了这样一个接口:通过揭示出硬件系统的共同特点,允许硬件厂商为了提高系统性能对硬件系统进行改进,而不用担心和已经存在的软件系统兼容性问题。   为方便编程而从硬件系统中剥离出来的ISA接口,又被称作微码引擎(Microcode engine),微码引擎可以看作是包含在CPU内部的另一块CPU。它由微码ROM(内部包含着微码程序)和执行单元(用于执行信息码程序)两部分组成。这些微码程序(Microcode programs)的作用就是将处理器接收到的指令翻译成内部芯片可以执行的指令。采用这种方式,所有的程序都以一种有效的模拟方式运行着。微码引擎在现代的CPU中依然存在,如Athlon就是通过内部的解码单元分解出x86指令的。使用微码模拟执行指令要比直接执行指令慢一些,不过现在微码引擎的效率可以达到直接执行的99%以上。   通过引入ISA使代码重新使用成为可能,这极大地刺激了软件公司在软件开发上的投入,大量的投资被投向了基于ISA的软件开发,撇开ISA带来的巨大经济效益,通过引入ISA (仅仅作为一个概念)可以有效保护软件厂商在软件开发上的投入,从而调动了他们的积极性。   随着CPU制造技术的飞速发展,新一代CPU不断地被生产出来。尽管新CPU在构造上和以前CPU有很大的差异,由于遵循了ISA接口规范,所以做到了软件上的兼容。不过,随着技术的进步,作为解决问题提出来的ISA已经不太适合当前的形势,所以必须引入一种全新的结构解决当前面临的问题。在最新的CPU如Transmeta的Crusoe、Sun的MAJC、HP的Dynamo和Internet的Willamette中出现了一种新的解决方式,奠定了结构发展的新方向。   这些新CPU是通过ISA翻译做到和以前软件兼容的。ISA翻译的作用看起来和前面提到的微码引擎有些相似,其实它们是截然不同的两个概念。微码引擎只能在每个时钟周期翻译一条指令并执行它,内部没有空间用于储存翻译后的代码,所以微码翻译器会重复大量无益的工作,效率十分低下。而这些新款CPU都可以储存翻译后的指令以备下次使用,这种缓存翻译后的代码方式,我们称之为翻译,像Athlon翻译一条指令再执行的方式称之为模拟,尽管它们看起来非常相似。和微码模拟相比,翻译另一个优点是可以在执行指令过程中进行代码优化,可以大大提高程序的运行效率。英特尔的Willamette采用的就是这种技术,尽管我们还不太清楚实现的具体细节,但有一点是清楚的:Willamette的指令缓存中储存了大量已被翻译过的代码以备重新使用。   通过将原来引入的ISA分成模拟ISA和本地ISA,可以很好地揭示出这种发展趋势。本地ISA可以看作原先的ISA,它的作用也和原来的ISA相似。模拟ISA是新引入的概念,它可以帮助我们理解CPU未来发展的方向,现在流行的CPU(如Athlon)是通过模拟方式执行指令的。模拟ISA重要性是显而易见的,而CPU发展方向是用实时翻译(runtime translation)完全取代模拟ISA。目前正处在转型阶段,下一代CPU(如Willamette)并没有完全抛开模拟ISA,但已经朝最终取代模拟ISA迈出了坚实的一步。   结论:当初引入ISA概念主要是希望解决下面两个问题:1.如何找出硬件系统的共同特性;2.使开发出的软件不需修改就可以运行在不同的硬件系统上。在60年代最令人头痛的还是第2个问题,由于当时的程序员是直接面对赤裸裸的机器进行编程,所以熟悉每台机器的性能对他们来说是必需的。今天的问题同样十分相似,而且还引出了新的问题:我们是否还需要继续支持原先的ISA?这意味着现在的重点是第1个问题了。为了某种特别的目的你当然可以选择放弃对原先ISA的继承,这样做的后果是无法和以前的软件保持兼容,重新开发软件系统不仅要花费大量的时间和金钱,而且对某些行业来说是根本行不通的。 将ISA细分成模拟ISA和本地ISA还有助于问答上面两个问题,它们分别与上面两个问题一一对应,这样做的优点主要体现在以下三个方面:   1. 软件开发商和用户可以在最新的硬件系统件中使用以前的代码,而不必担心兼容性问题和由于模拟导致的性能上的损失。   2. 软件开发商可以自由地重新编写ISA接口,甚至仅仅是重写本地ISA就可以让新硬件达到最佳的运行状态而不必担心已经存在的硬件系统。   3. 软件开发商可以仅为硬件的某项新功能重新编写ISA,而不用担心和原来的代码发生冲突。   所以一旦你采用了x86架构(或者说你选择了继承原先的ISA),你就会发现这些问题诸如“x86在何时何地达到其极限?”显得非常可笑。比较合理的问题是:“x86软件还可以发展多久?”答案是:“可能很长很长。”