机器 – 程序 – 人 (2)

"A machine with C++ or COBOL as its machine language would be complex indeed but could easily be built in today's technolody." Andrew S. Tanenbaum, <<Structured Computer Organization>> 4th edition, 1.1.1

按Andrew的说法,Intel等公司很容易就可以制造出一部直接执行C++或COBOL语句的CPU,并不需要Compiling和Assembling。在关于Java的章节1.4.3中,Andrew有提到直接执行ByteCode的CPU,即应用于嵌入式计算领域的picoJava。我的记忆中,.NET刚出来时,也有看到过Microsoft和Intel在合作开发直接执行IL指令的CPU,后来似乎就没有下文了。如果按Andrew的逻辑,不用说,直接执行Java或C#语句的计算机应该也是可以制造出来的。 有意思的是,虽然很容易就可以制造出来直接执行高级语言语句的CPU,但是,事实上这一类CPU却很罕见,我Google了一下,就找到一个Cjip,也是运用于嵌入式计算领域的,可以直接执行C/C++/Forth/Java。计算机诞生60多年以来,市场上大行其道的都是所谓“General CPU”和“General Computer”。何以如此呢?Andrew指出,这是由于通用类CPU在制造成本上具有巨大优势,而其应用则几乎不受限制。也就是说,picoJava/Cjip这类CPU,不仅制造成本上没有优势,而且其应用范围也必然受到该语言本身的约束。
 
在Andrew看来,既然理论上可以制造出直接执行高级语言的CPU,无妨把高级语言本身也看成是一个Virtual Machine,即对于使用高级语言的程序员而言,有一个Virtual Machine负责Translate或Interpret他写的程序。Translate一个程序就是把该程序转换成一个新程序,新程序由另一个低一级的Virtual Machine或Actual Machine负责处理,如果又是由一个Virtual Machine处理,则再进行一次类似的Translate或Interpret处理,最终一直到由一个最低级的Actual Machine来直接执行其机器指令。而Interpret一个程序则是把高一级的Virtual Machine指令一个个的转换成等价的低一级的Virtual Machine指令或Actual Machine指令,整个过程中实时对每一个指令进行转换并执行,并不生成新的程序。由此,Andrew提出了一个多级计算机理论模型:
 

如上所述,这个模型中,最底层的是一个Actual Machine,其它的均是不同级别的Virtual Machine。无论是Actual Machine还是Virtual Machine,都有自己的Machine Language,程序员根据需要使用这些不同级别的Machine Language来编写程序。不同级别的Virtual Machine负责使用低一级Virtual Machine提供的Machine Language,通过Translate或Interpret把自己的程序转换为的低一级的Machine Code,一直到Actual Machine进行最后的执行。
  
根据这个理论模型对迄今为止的计算机进行分析和梳理,Andrew给出了下面这个模型:
 
按Andrew的说法,所有的计算机均由一个Actual Machine加上一个或多个不同级别的Virtual Machine构造而成。一个计算机至少必须包含一个Actual Machine和一个Virtual Machine。我们所习惯的一些概念,如Compiler和Assembler所扮演的均是Translator的角色,级别不同而已,而一般所说的Machince Instruction则对应到Level2这一级的Machine Language,而OS所提供的系统功能加上Level2的Machine Language也构成一个新的Machine Language,属于Level3的Virtual Machine,而Assember则属于Level4,C/C++/COBOL/VB/LISP/Java/C#则属于Level5的相互竞争的不同Virtual Machine。显然,这个模型所定义的Virtual Machine更一般化抽象化,不同于我们所熟悉的JVM/CLR这些Virtual Machine。JVM所提供的ByteCode和CLR所提供的IL则归属于Level2的一个细分级别,因为和常规的ISA指令相比,二者均进行了一些抽象。
 
我是很欣赏Andrew的上述二个模型的,而且,我觉得,Andrew的模型很好地体现了所谓“People First,Machine Second”原则(请参见前一篇)。
  1. 从Level0到Level5的Machine Language,很明显是一个从简单到复杂,抽象化程度逐步变高的发展趋势。其意图很明显就是为了体贴程序员,也就是“People First”原则了。
  2. 从Level0到Level3的Machine Language都是面向机器的二进制的数字,从Level4开始变成面向人的英文单词和缩写。
  3. 从Level5开始一个语句不再直接对应到一个低级的指令,而是等价于多个低级的指令的组合。
  4. C++/Java/C#这类主流OO语言,很明显就是为了契合人的思维习惯,从而方便和体贴程序员进行编程。
  5. Level3即OS对Level2进行了极为重要的抽象,如Process,Thread,VM,IO等,其动机,一方面是为了充分发挥计算机的作用,更为重要的无疑就是为了方便和体贴程序员开发程序了。
  6. 由Maurice Wilkes于1951年提出的Level1,其意图是为了减化Level0即硬件的设计,并降低制造成本。而60年以来一直到现在,这一招仍然是必用的,唯一的变化是Level1本身硬件化了。这里无疑体现了浓浓的“Machine Second”的意味,因为按本文开头Andrew所说的,C++等高级语言也是很容易就可以硬件化的,实际应用却很少。
  7. 唯一的遗憾是Andrew没有提到DSL,如果顺着其内在逻辑,我以为可以给Andrew的模型添加一个Level6用以表示各种DSL。

 

总而言之,“Software and Hardware are logically equivalent” ,“Virtual Machinde and actual machine are also logically equivalent”,现实中,如何抉择? 如何灵活运用呢? 我以为,其奥秘就是Steve所谓“People First,Machine Second”原则。

 
(按:Andrew S. Tanenbaum是著名学院派计算机专家,MINIX之父,MINIX是一个免费教学用OS,Linus Torvalds在学习MINIX时,决定动手把MINIX移植到自己的一台IBM PC 386上,并扩展为面向实用的OS,由此诞生了后来如日中天的Linux。)
posted @ 2011-12-11 16:32  James Leng  阅读(922)  评论(2编辑  收藏  举报