1.1 Java诞生的原因
在Java诞生之前已经出现了许多优秀的编程语言,比如大家熟悉的C语言和C++语言等,那么是什么原因导致了Java语言的诞生呢?Java语言相对于其他语言,比如C语言和C++语言,到底有着怎样的特殊优势呢?
Java语言相对于其他语言的最大优势就是所谓的平台无关性,即跨平台性,这也是Java最初风靡全球的主要原因。以下通过讲解平台与机器指令,以及程序的编译、执行来理解Java的平台无关性。
1. 平台与机器指令
无论哪种编程语言编写的应用程序都需要经过操作系统和处理器来完成程序的运行,因此这里所指的平台是由操作系统(OS)和处理器(CPU)所构成。与平台无关是指软件的运行不因操作系统、处理器的变化导致发生无法运行或出现运行错误。
所谓平台的机器指令就是可以被该平台直接识别、执行的一种由0和1组成的序列代码。需要注意的是相同的CPU和不同的操作系统所形成的平台的机器指令可能是不同的,因此,每种平台都会形成自己独特的机器指令。比如,某个平台可能用8位序列代码1000 1111表示一次加法操作,以1010 0000表示一次减法操作;而另一种平台可能用8位序列代码1010 1010表示一次加法操作,以1001 0011表示一次减法操作。
2. C/C++程序依赖平台
现在,让我们分析一下为何C/C++语言编写的程序可能因为操作系统的变化、处理器升级导致程序出现错误或无法运行。
C/C++语言提供的编译器对C/C++源程序进行编译时,将针对当前C/C++源程序所在的特定平台进行编译和连接,然后生成机器指令,即根据当前平台的机器指令生成机器码文件(可执行文件)。这样一来,就无法保证C/C++编译器所产生的可执行文件在所有的平台上都能正确地被运行,这是因为不同平台可能具有不同的机器指令(如图1.2所示)。因此,如果更换了平台,可能需要修改源程序,并针对新的平台重新编译源程序。
图1.2 C/C++生成的机器码文件依赖平台
3. Java程序不依赖平台
与其他语言相比,Java语言最大的优势就是它的平台无关性,这是因为Java可以在平台之上再提供一个Java运行环境(Java Runtime Environment,JRE)。该Java运行环境由Java虚拟机(Java Virtual Machine,JVM)、类库以及一些核心文件组成。Java虚拟机的核心是所谓的字节码指令,即可以被Java虚拟机直接识别、执行的一种由0和1组成的序列代码。字节码并不是机器指令,因为它不和特定的平台相关,不能被任何平台直接识别、执行。Java针对不同平台提供的Java虚拟机的字节码指令都是相同的,比如所有的虚拟机都将1111 0000识别、执行为加法操作。
和C/C++不同的是,Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编译,而是针对Java虚拟机把Java源程序编译为称作字节码的一种“中间代码”,比如,Java源文件中的“+”被编译成字节码指令1111 0000。字节码是可以被Java虚拟机识别、执行的代码,即Java虚拟机负责解释运行字节码,其运行原理是Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台运行该机器码,如图1.3所示。
图1.3 Java生成的字节码文件不依赖平台
4. Java之父-James Gosling
1990年Sun公司成立了由詹姆斯·高斯林(James·Gosling)领导的开发小组,开始致力于开发一种可移植的、跨平台的语言,该语言能生成正确运行于各种操作系统、各种CPU芯片上的代码。他们的精心研究和努力促成了Java语言的诞生。1995年5月Sun公司推出Java Development Kit(JDK)1.0a2版本,标志着Java的诞生,而Java的快速发展得益于Internet和Web的出现。Internet上的各种不同计算机可能使用完全不同的操作系统和CPU芯片,但仍希望运行相同的程序,Java的出现标志着真正的分布式系统的到来。
注意
印度尼西亚有一个重要的盛产咖啡的岛屿叫Java,中文译名为爪哇,开发人员为这种新的语言起名为Java,其寓意是为世人端上一杯热咖啡。