程序中包含着运行环境这一内容。操作系统和硬件决定了程序的运行环境。同一类型的硬件可以选择安装多种操作系统。从程序的运行环境这一角度来考量硬件时,CPU的种类是特别重要的参数。CPU只能解释其自身固有的机器语言。不同的CPU能解释的机器语言也是不同的。机器语言的程序被称为本地代码。程序员用C语言等编写的程序,在编写阶段,仅仅是文本文件。文本文件(排除文字编码的问题)在任何环境下都能显示和编辑。我们称之为源代码。通过对源代码进行编译,就可以得到本地代码。
计算机的硬件并不仅仅是由CPU构成的,还包括用于存储程序指令和数据的内存,以及通过I/O连接的键盘显示器,硬盘,打印机等外围设备。Windows操作系统对克服这些硬件构成的差异做出了很大的贡献。在 Windows 的应用软件中,键盘输入、显示器输出等并不是直接向硬件发送指令,而是通过向 Windows 发送指令来间接实现的。因此,程序员就不用注意内存和 I/O 地址的不同构成了。
同样机型的计算机,可安装的操作系统类型也会有多种选择。应用软件则必须根据不同的操作系统类型来专门开发。CPU 的类型不同,所对应的机器语言也不同,同样的道理,操作系统的类型不同,应用程序向操作系统传递指令的途径也是不同的。应用程序向操作系统传递指令的途径称为 API。在同类型操作系统下,不管硬件如何,API 基本上没有差别。
Unix 系列操作系统 FreeBSD 中,存在一种名为 Ports 的机制。该机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Ports 就会自动使用 FTP连接到相关站点来下载代码。全球很多站点都提供适用于 FreeBSD 的应用源代码。通过使用 Ports 可以利用的程序源代码,大约有 16000 种。这些代码还被按照不同的领域进行了分类整理,可以随时拿来使用。FreeBSD 上应用的源代码,大部分都是用C语言来记述的。FreeBSD 等 Unix 系列操作系统中,都带有标准的 C 编译器。C 编译器可以结合 FreeBSD 的运行环境生成合适的本地代码。
即使不通过移植,也可以使用别的方法来运行其他操作系统的应用。[11]Macintosh(统称为 Mac)是美国苹果公司生产的计算机。
除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是 Java。大家说的 Java,有两个层面的意思。一个是作为编程语言的 Java,另一个是作为程序运行环境的 Java。同其他编程语言相同,Java 也是将 Java 语法记述的源代码编译后运行。不过,编译后生成的并不是特定 CPU 使用的本地代码,而是名为字节代码的程序。字节代码的运行环境就称为 Java 虚拟机。Java 虚拟机是一边把 Java 字节代码逐一转换成本地代码一边运行的。虽然这样看起来 Java 虚拟机全是好处,但其实也有不少问题。其中一点就是,不同的 Java 虚拟机之间无法进行完整互换。另一点就是运行速度的问题。
程序的运行环境中,存在着名为 BIOS的系统。BIOS 存储在 ROM 中,是预先内置在计算机主机内部的程序。引导程序是存储在启动驱动器起始区域的小程序。