运行环境=操作系统(OS)+硬件(hardware)
操作系统和硬件决定了程序的运行环境。
操作系统:Windows、Unix、Linux等,程序一般不能跨OS运行。
硬件:CPU、内存、硬盘、存储设备和输入输出设备等。本地代码
在程序的运行环境中,CPU是非常重要的参数。CPU只能解释自身固有的机器语言,不同的CPU能解释的机器语言是不同的。
源代码(source code):用编程语言编写的程序,只是文本文件:
本地代码(native code):是机器语言的程序,对源代码进行编译得到。
windows中,应用程序的本地代码,通常是DLL格式和EXE文件等。市面上出售的windows应用程序的CD-ROM中,收录的也是本地代码。
Windows克服了CPU以外的硬件差异
Windows出现之前,计算机机型很多,他们即使拥有同样的X86处理器,他们的内存机制和I/0地址构成都是不同的,因此,各个机型都需要专门的MS-DOS应用软件来帮助控制硬件。
Windows出现之后,windows上各应用的实现,不再是去控制硬件,而是windows操作系统发送指令,然后由windows操作系统控制硬件。这样,因为由windows来控制硬件,而不是程序员来控制硬件,因此程序员就不必再去在意内存和I/0地址的不同了。
API(Application Programming Interface)
API:应用程序向操作系统传递指令的途径,提供了适用于本操作系统中任何程序的函数(接口)的集合。
同类型操作系统的API,不会因为硬件的不同而不同,因此在任何硬件上都可以运行。
不同操作系统的API会有差异,因此在移植同样的应用程序是,需要重写部分API函数。
FreeBSD Port
“既然CPU的不同会导致同样的本地代码无法重复使用,为什么不直接把源代码发给程序呢?”
Unix操作系统FreeBSD中,存在一种Port机制。
Port,即porting移植,表示根据不同的运行环境而重新调整程序。
Port机制:结合当前的运行环境编译源代码,得到适合CPU要求的、可以运行的本地代码程序。如果本地磁盘上没有储存目标源代码,则自动使用FTP协议去相关站点下载源代码。
Port机制,在某种程度上,克服了CPU在内的所有硬件差异。
运用虚拟机在本机上获得其他操作系统环境
“如果运行其他OS上的应用,又不想使用移植呢?”
虚拟机软件
Mac OS系统:“Virtual PC for Mac”
Windows系统:Virtual Box、VMWare。
Java虚拟机
“除了使用虚拟机,还有一种方法可以在本机上使用其他操作系统的应用,就是java。”
java有两层意思,一层是指编程语言java,另一种是程序运行环境java。
java虚拟机:编译运行java语法写的源代码,生成的并不是本地代码,而是字节代码程序。字节代码程序的运行环境就是java虚拟机(Java VM)。java虚拟机一边把字节代码逐一转换为本地代码一边运行。
通过字节代码的使用,就实现了在任何环境在使用同一应用了。
小结:
BIOS(Basic Input/Output System,标准输入输出)系统
BIOS引导程序:引导操作系统的启动。