题记:
电脑的硬件有CPU(中央处理器)、RAM(内存)、Hard Disk(硬盘)、BIOS(基本输入输出系统)等;电脑的软件有操作系统,编译器,应用软件等。其中最关键的是CPU和操作系统的交互。CPU拥有ISA(指令集),操作系统通过将高级语言编写的程序转化为汇编语言(能被CPU翻译成机器语言的特定汇编语言)后,再进一步转化为CPU能够识别的机器语言,CPU利用自身的指令集将二进制代码翻译为相应的指令。操作系统之所以重要,是因为它是硬件与应用软件的中间人,它将通过自己的平台开发出来的应用程序解析为汇编语言和机器语言与硬件交互。
首先明确几个概念。高级语言:比如basic,fortran等,这样的语言实际上是比较接近于人类的语言的,计算机绝对无法直接识别这样的语言,需要编译器将高级语言翻译成机器能懂的执行码,然后才能执行。低级语言:汇编语言和机器语言。这样的语言是机器可以直接识别的,但是和人类的语言相去甚远。所以这样的语言执行效率非常高,但是编写代码的代价也很非常高。机器语言和汇编语言是和计算机的指令集一一对应的,机器支持怎样的指令集,低级语言就有怎样的命令集。
再谈到移植的问题。如果使用汇编代码编写程序,那么假设A机器的指令集和B机器的指令集不相同,如果A机器的汇编语言中有一条指令在程序中出现了10000次以上,而b机器却不支持这条指令,那么如果我们想把a机器的程序移植到b机器上执行,就必须修改程序代码这10000个地方,让他们都能被b支持。这样的工作量是非常巨大的;但是,如果使用高级语言,由于高级语言对机器硬件来说是抽象的,那么实际上a机器的高级语言放到b机器上,然后用b机器适合的编译器编译,如果编译成功,那么b机器也可以运行这个程序了。当然a机器和b机器对同样一种高级语言,他们用的编译器是不一样的。如果把b机器的编译器放到a机器上去编译程序,那一定无法成功。总之,高级语言的特点就是指令和最终的可执行代码的透明性,所有的硬件差异都由编译器去解决了,作为高级程序的程序员是看不到这个差异的,因为程序员本人不用去写编译器,他们只是直接用相应正确的编译器就可以了。
不过在不同的机器上实现不同的编译器还是代价很高的事情。为了降低代码移植的成本,人们想到了虚拟机机制,就是在高级语言和机器语言中间加上一层:“中间层”。比如java,java的源代码通过javac编译器编译了以后,生成了一种叫bytecode的字节码,这样的代码也是一种二进制代码,人是看不容易看明白的。但是这样的代码也不是机器代码,不能直接运行。java体系中的中间层java虚拟机才能看明白这样的代码,然后java虚拟机再负责将bytecode转换为机器可执行代码。如此一来,只要人们能为java语言设定一个统一标准,至于在特定的硬件平台上java虚拟机如何把bytecode翻译成机器代码,就由专门的硬件平台开发商和虚拟机开发商去负责就是了(反正这也是他们开发设计必须要做的工作)。程序员写的代码在不同的硬件平台上都可以无障碍运行,换硬件平台的时候也不用修改任何代码。