读《程序是怎么跑起来的》第7章
如果运行环境不同,程序是无法运行的。例如,在Macintosh上直接运行Windows用的程序,基本上是无法实现的。这是因为运行环境的不同造成的。运行环境=操作系统+硬件。也就是说,操作系统和硬件决定了程序的运行环境。机器语言是程序称为本地代码(native code)。程序员用C语言等编写的程序,在编写阶段仅仅是文本文件。文本文件(排队文字编码的问题)在任何环境下都能显示和编辑。我们称之为源代码。通过对源代码进行编译,就可以得到本地代码。在市面上出售的用于Windows的应用软件包CD-ROM中,收录的就不是源代码,而是本地代码。Windows应用程序的本地代码,通常是EXE或DLL文件等形式。
在Windows的应用软件中,键盘输入、显示器输出等并还是直接向硬件发送指令,而是通过向Windows发送指令来间接实现的。因此,程序员就不用注意内存和I/O地址的不同构成了。因为Windows操作的是硬件而非应用软件,而且针对不同的机型,这些硬件的构成也是有差异的。即使是Windows,也依然无法吸收CPU类型的差异。这是因为,市面上销售的Windows应用软件,都是用特定的CPU的本地代码来完成的。
应用程序向操作系统传递指令的途径称为API(Application Programming Interface)。Windows及Unix系列操作的API,提供了任何应用程序都可以利用的函数组合。因为不同操作系统的API是有差异的,因此,将同样的应用程序移植到其他操作系统时,就必须重写应用中利用到API的部分。像键盘输入、鼠标输入、显示器输入、文件输入输出等同外围设备进行输入输出操作的功能,都是通过API提供的。在同类型操作系统下,不管硬件如何,API基本上没有差别。因而,针对某特定操作系统的API所编写的程序,在任何硬件上都可以运行。当然,由于CPU种类不同,机器语言也不相同,因此本地代码当然也是不同的。这种情况下,就需要利用能够生成各CPU专用的本地代码的编译器,来对源代码进行重新编译了。
Java虚拟机,大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程序运行环境的Java。同其他编程相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序。字节代码的运行环境就称为Java虚拟机。Java虚拟机是一边把Java字节代码逐一转换本地代码一边运行的。
BIOS系统,BIOS存储在ROM中,是预先内置在计算机主机内部的程序,带有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。操作系统启动驱动器一般是硬盘,不过有时也可以是光盘或优盘。引导程序的功能是把在硬盘等记录的OS加载到内存中运行。虽然启动应用是OS的功能,但OS并不能自己启动自己,而是通过引导程序来启动。