7.1 运行环境 = 操作系统 + 硬件
程序的运行环境包括两个方面:操作系统和硬件。下图是office2007的运行环境介绍,可以看到里面既注明了操作系统也填写了硬件要求。
从程序的运行环境这一角度来考量硬件时,CPU的种类是特别重要的参数。不同的CPU能解释得机器语言的种类也是不同的。
机器语言的程序称为本地代码(native code)。程序员用C语言等编写得程序称为源代码。
7.2 不同操作系统的API不同
同样机型的计算机,可安装的操作系统类型也会有多种选择。例如,AT兼容机的情况下,除Windows之外,还可以采用Unix系列的Linux及FreeBSD等多个操作系统。应用软件必须根据不同操作系统类型来专门开发。因为操作系统类型的不同,应用程序向操作系统传递指令的途径也是不同的。
应用程序向操作系统传递指令的途径称为API(Application Programming Interface)。操作系统的API提供了任何应用程序都可以利用的函数组合,像键盘输入、鼠标输入、显示器输出、文件的输入输出等同外围设备进行输入输出的功能,都是通过API提供的。
同类型操作系统下,不管硬件如何,API基本没有差别,当然由于CPU种类不同,机器语言也不相同,因此本地代码也是不同的。在这种情况下就需要利用能够生成各CPU专用的本地代码的编译器,来对源代码进行重新编译了。
7.3 FreeBSD Port 帮你轻松使用源代码
FreeBSD是1993年加州大学伯克利分校的Computer Systems Research Group 在4.4BSD-Lite的基础上开发的Linux系列操作系统。
FreeBSD中存在一种名为Port的机制。该机制能够给当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Port就会自动使用FTP连接到相关站点来下载代码。可以说Port能够克服包括CPU在内的所有硬件差异的系统。
7.4 提供相同运行环境的Java虚拟机
除了虚拟机的方法之外,还有一种方法能够提供不依赖特定硬件及操作系统的程序运行环境那就是Java。
同其他编程语言相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序。字节代码的运行环境就称为Java虚拟机(JVM Java Virtual Machine)。Java虚拟机是一边把Java字节代码逐一转换成本地代码一边运行的。
sample.java —> sample.class —> 本地代码
但是Java并非完美,他也存在问题:
(1) 不同的Java虚拟机之间无法进行完整互换,想让所有字节代码在任意Java虚拟机上都能运行是比较困难的。而且,当我们使用只适用于某些特定功能时,就会出现在其他Java虚拟机上无法运行,或者功能受限的情况。
(2)另一点就是运行速度问题,Java虚拟机每次运行都要把字节代码变换成本机代码,这一机制是造成速度慢的原因。
7.7 BIOS和引导
BIOS(basic Input/Output System)存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。
开机后BIOS会确认硬件是否正常运行,没有问题就会启动引导程序。引导程序的功能是把硬盘等记录的OS加载到内存中运行。虽然启动应用是OS的功能,但OS并不能自己启动自己,而是通过引导程序来启动。