程序在怎样的环境下运行
每个程序都有其对应的运行环境。程序的运行环境是通过操作系统和硬件(处理器、内存等)来表示的,也就是说,操作系统和硬件决定了程序的运行环境。一台计算机可以安装多种操作系统,因为操作系统有很多版本,有些应用程序可能只在特定版本的操作系统中运行。将硬件作为程序运行环境考虑时,CPU的类型非常重要,CPU只能解释特定种类的机器语言,不同类型的CPU能解释的机器语言也不同。机器语言的程序也称为本机代码。程序员使用C语言等编写的程序,在编写阶段都只是普通的文本文件,在任何环境下的文本文件不考虑字符编码问题的话都可以显示和编辑,这样的文件被称为源代码,对于源代码进行编译,可以得到本机代码。在大多数情况下,应用程序不是以源代码的形式分发的,而是以本机代码的形式分发的。计算机的硬件并不只有CPU还有用来存储程序指令和数据的内存通过I/O连接的键盘、显示器、硬件、打印机等外部设备。在不同的计算机中,这些外部设备的访问方式也有所不同。windows为消除这些硬件差异作出的巨大贡献。在windows应用程序中,键盘输入、显示器输出等操作不是通过直接访问硬件来实现的,而是通过向windows发出请求来间接的实现的。这样一来,程序员就不需要关注内存和I/O地址的差异了,因为windows代替了应用程序对各种不同机型的硬件进行操作。然而,即便是windows也无法彻底抹平CPU类型的差异,因为windows应用程序都是以特定CPU的本机代码的形式来分发的。
同一种机型的计算机也可以安装多种操作系统,如果说CPU类型的差异表代表机器语言的差异,那么操作系统的差异就代表应用程序向操作系统发出请求方式的差异。应用系统向操作程系统发出请求的方式是由API来决定的。由于不同的操作系统提供的API不同,所以如果要将一个应用程序移植到另一个操作系统上,就必须重新编写其中使用API的部分。API提供了键盘输入、鼠标输入、显示器输出、文件输入或输出等与外部设备之间输入或输出的功能。在同一个系统中,无论使用怎样的硬件,API都是基本相同的。因此,按照操作系统的API编写的程序,在任何硬件上都可以运行。当然,如果CPU类型不同,机器语言也会不同,本机代码不可能保持不变。在这种情况下,我们需要使用对应的编译器重新编译源代码,以便生成适配各种CPU的本机代码。在LINUX中安装新程序时,我们可以选择包含所有必要程序的软件包,也可以选择通过源代码来安装。其中第二种方式就是将源代码先在本机上编译后再使用。Linux程序的源代码大多是用C语言来编写的,这些源代码可以从遍布互联网的LINUX仓库中获取。LINUX内置了标准的C语言编译器,使用该编译器就可以按照当前LINUX的运行环境生成对应的本机代码。
不将源代码编译为本机代码,而是一种中间代码,就可以提供不依赖特定操作系统和硬件的运行环境了,Java使用的就是这种方法。Java这个词有两个含义,一个是Java编程语言,另一个是Java程序运行环境。和其他编程语言一样,用Java编写的源代码也需要经过编译才能运行,但是编译后生成的并不是针对特定的CPU的本机代码,而是一种称为字节码的代码。字节码的运行环境称为Java虚拟机。java虚拟机会将Java字节码逐一转换为本机代码来执行。从操作系统的角度来看,Java虚拟机也是一种应用程序,但从Java应用程序的角度来看,Java虚拟机就是其运行环境,也就是操作系统+硬件的结合体。然而,看上去好处多多的Java虚拟机也有他自己的问题。首先,不同的Java虚拟机之间并不能做到完全兼容。Java虚拟机很难做到运行任何字节码程序这一点。其次是运行速度,需要在运行时将字节码转换成本机代码的Java程序,在运行速度上比直接编译成本机代码的C语言程序要慢。通过互联网来使用硬件、操作系统、应用程序等计算机资源的计划称为云计算。根据其所提供的具体服务,云计算可分为SAAS、PAAS和IAAS几种类型。简单来说,SAAS提供的是应用程序,PAAS提供的是操作系统,IAAS提供的是硬件。程序的运行环境还包括BIOS,BIOS存储在ROM中,是预先内置在计算机中的一段程序,BIOS除了提供键盘和磁盘设置设备的基本控制程序,还负责启动引导装入程序。引导装入程序是存储在启动磁盘开头的一段很短的程序。启动磁盘一般是硬盘,但光盘和USB驱动器也可以作为启动磁盘使用。操作系统的启动需要由引导装入程序来完成。