7.程序是在何种环境中运行的 benben Posted on Feb 7 2023 《程序是怎样跑起来的》 ##7.1 运行环境=操作系统+硬件 CPU只能解释其自身固有的机器语言。不同的CPU能解释的机器语言的种类也是不同的。例如,CPU有x86、MIPS、SPARC、PowerPC等几种类型,它们的机器语言是完全不同的。 机器语言的程序称为**本地代码**(native code)。 程序员用C语言等编写的程序,在编写阶段仅仅是文本文件。文本文件(排除文字编码的问题)在任何环境下都能显示和编辑。我们称之为**源代码**。通过对源代码进行编译,就可以得到本地代码。在市面上出售的用于Windows的应用软件包CD-ROM中,收录的就不是源代码,而是本地代码。 CPU负责解释并运行从源代码编译而来的本地代码。  ##7.2 Windows克服了CPU以外的硬件差异 计算机的硬件并不仅仅是由CPU构成的,还包括用于存储程序指令和数据的内存,以及通过I/O连接的键盘、显示器、硬盘、打印机等外围设备。 例如一些机型虽然都搭载了486及Pentium等x86系列的CPU,不过内存和I/O地址的构成等都是不同的,因此每个机型都需要有专门的MS-DOS应用。x86提供有专门用来同外围设备进行输入输出的I/O地址空间(I/O地址分配)。至于各外围设备会分配到怎样的地址,则要由计算机的机型来定。 应用软件的功能中,存在着直接操作计算机硬件的部分。原因主要有两点 ,一是当时MS-DOS的功能尚不完善,二是为了提高程序的运行速度。  不过,随着Windows的广泛使用,这样的局面也得到了大幅改善。因为只要Windows能正常运行,同样的应用(本地代码)在任何机型上都是可以运行的。 在Windows的应用软件中键盘输入、显示器输出等并不是直接向硬件发送至指令,而是通过Windows发送指令来间接实现。  > 但即便是Windows也依然无法吸收CPU类型的差异。因为市面上销售的Windows应用软件,都是用特定的CPU的本地代码来完成的。 ##7.3 不同操作系统的API不同 CPU的类型不同,所对应的机器语言也不同,同样的道理,操作系统的类型不同,应用程序向操作系统传递指令的途径也是不同的。 应用程序向操作系统传递指令的途径称为API(Application Programing Interface) API也称为"系统调用",是应用调用操作系统的手段。 Windows及Unix系列操作系统的API,提供了任何应用程序都可以利用的函数组合。 ##7.4 FreeBSD Port帮你轻松使用源代码 Unix系列操作系统FreeBSD中,存在一种名为**Ports**的机制。该机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Ports就会自动使用FTP连接到相关站点来下载代码。  ##7.5 利用虚拟机获得其他操作系统环境 ##7.6 提供相同运行环境的Java虚拟机 除了虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。 大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程序运行环境的Java。同其他编程语言相同,Java也是将Java语法记述的源代码运行后。不过,编译后生成的并不是特定CPU使用的本地代码,而是名为**字节代码**的程序。字节代码的运行环境就称为**Java虚拟机**(JavaVM,Java Virtual Machine)。Java虚拟机是一边把Java字节代码逐一转换成本地代码一边运行。  从操作系统方面来看,Java虚拟机是一个应用,而从Java应用方面来看,Java虚拟机就是运行环境。 **Java虚拟机其实也有不少问题**。其中一点就是,不同的Java虚拟机之间无法进行完整互换。这是因为,想让所有字节代码在任意Java虚拟机上都能运行是比较困难的。而且,当我们使用只适用于某些特定硬件的功能时,就会出现在其他Java虚拟机上无法运行,或者功能使用受限等情况。 另一点就是运行速度的问题。Java虚拟机每次运行时都要把字节代码变成本地代码,这一机制是造成运行速度慢的原因。为了优化JVM虚拟机性能,Java提供了AOT(运行前编译,Ahead Of Time),JIT(即时编译,Just In Time)。当然,JVM的优化还有很多。 ##7.7 BIOS和引导 程序的运行环境中,存在着名为BIOS(Basic Input/Output Sytem)的系统。**BIOS**存储在**ROM**中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本操作程序程序外,还有启动"引导程序"的功能。**引导程序**是存储在启动驱动器起始区域的小程序。 引导程序的功能是把硬盘等记录的OS加载到内存中运行。虽然启动应用是OS的功能,但OS并不能自己启动自己,而是通过引导程序来启动。 赠人玫瑰,手留余香 赏 Wechat Pay Alipay 8.从源文件到可执行文件 6.亲自尝试压缩数据