从零开始学习 Java 系列之 Java 运行机制与跨平台特性
全文大约【4000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!并带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,给你带来具有足够启迪的思考……
在上一篇文章中,壹哥给大家介绍了 Java 的历史由来、特性、版本等纯理论性的知识。其中我给大家提到了一个重要的”跨平台“特性,对很多入门小白来说,还是不明白”跨平台“是啥意思。所以在开始真正操作 Java 代码之前,壹哥还要再利用一篇文章给大家解释一下到底啥是”跨平台“,以及 Java 是如何实现”跨平台“的。而要真正弄清楚”跨平台“的含义,我们必须了解一下 Java 代码的开发步骤,以及 JVM 虚拟机等内容。
一、高级编程语言分类
壹哥在上一篇文章中给大家说过,高级编程语言可以分为两大类,如下:
1. 编译型:C、C++、Pascal 等;
2. 解释型:Basic、JavaScript、Python 等。
1. 编译型语言
编译型语言在程序执行之前有一个专门的编译过程,编译器会把程序编译成针对不同 CPU 类型的可执行文件,之后再由机器运行这个可执行文件。运行时不再需要重新翻译,直接使用编译的结果就行。编译型语言的工作原理类似于“翻译书籍”。
在同一平台(操作系统)上,编译型语言可以一次编译,无限次运行。只要在首次执行前编译生成相应的可执行文件,以后每次运行时直接运行这个可执行文件即可,因此其运行效率高于解释型语言。
但针对不同平台(操作系统),要生成的可执行文件却并不相同,因为不同平台支持的函数、类型、变量等可能都不同。所以编译型语言写出来的代码,要想在不同类型的操作系统上运行,必须经历多次不同的编译,故难以实现在不同操作系统间随意地切换,可移植性较差。
2. 解释型语言
解释型语言则是一边转换一边执行,不会把源代码生成可执行的文件。而是会把源码翻译成中间代码,再由解释器对中间代码进行解释运行,每执行一次都要翻译一次。解释型语言的工作原理类似于“同声传译”。
解释型语言写出的代码,每次运行时都要重新转换源代码。会有一个解释器根据操作系统的不同,将源代码转换成不同的机器码。所以相同的源代码,可以实现在不同的平台上运行,即“一次编写,到处运行”。但解释型语言每次执行时都要重新转换源代码,在效率上天生低于编译型语言。
总之,编译型和解释型语言各有其优缺点!
3. Java 语言特点
而我们的 Java 语言,确切地来说,既不是编译型语言,也不是解释型语言,而是结合了以上两种语言类型的优点。Java 会先对源代码进行编译,再将编译后的字节码文件解释执行!
接下来,壹哥重点给大家说一下 Java 语言到底是如何对程序进行处理的。
二、Java 程序开发步骤
为了讲清楚 Java 程序的开发步骤,我们先来看下图:
从上图可以看出,Java 对代码的处理过程可以分为 3 个核心步骤:
1. 编写源程序:这一步是利用各种开发工具,如记事本、eclipse、idea 等编写 Java 代码,生成后缀为.java 的源码文件。大家注意,我们可以在任何操作系统中编写 Java 代码。
2. 编译源程序:这一步是 Java 编译器对.java 文件进行编译,生成后缀为.class 的字节码文件。大家注意,这里生成的.class 字节码文件,和操作系统也没有关系。
3. 运行:这一步是利用 JVM 虚拟机,将.class 字节码文件加载进虚拟机中运行。大家注意,我们如果想要将生成的.class 字节码文件,在不同的操作系统中运行,需要安装对应系统的 JVM 虚拟机才行。
作为初学者,我们需要记住 Java 处理代码的以上这三个步骤,即”编写、编译、运行“,另外还要知道编写和编译阶段生成的文件后缀是什么。
壹哥只是简单地给大家展示了以上三个阶段的基本内容,但实际上这三个阶段在 JVM 中处理起来是非常复杂的,更多详细内容可以参考下图:
当然,对一个初学者来说,你暂时不必掌握的这么细致,这些内容我们会在以后的章节中进行更详细的讲解。了解了 Java 程序的处理步骤之后,我们再来学习一下什么是”跨平台“。
三、跨平台
1. 概念
首先我们得知道这里的”平台“指的是什么。所谓的平台,其实就是指计算机操作系统,比如 windows、linux、mac 系统。而跨平台则是软件开发中的一个重要概念,即软件不依赖某个具体的操作系统,也不依赖某个具体的硬件环境。在一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。通俗地说,我们开发出来一个软件,可以同时在 windows、linux、mac 等系统中运行,这就是”跨平台“!
2. 特性
Java 语言具有”跨平台“的特性,是相对于其他编程语言来说的。这是因为 Java 语言编写出的应用程序,只需要编写一次代码,就可以在不同的系统上运行。而其他的一些高级语言,比如 C 语言写出的代码,如果想在不同的平台上运行,需要编译成针对不同系统平台的目标代码。比如在 Windows 系统中编译的 C 语言程序,在 Linux 下是不能运行的,需要重新编译成 Linux 下的目标程序。反之,在 Linux 下编译的 C 语言程序,在 Windows 下也不能运行。
而 Java 在不同平台上运行时,就不需要针对不同的平台多次重新编译,这样就实现了所谓的“Write Once,Run Anywhere”。
现在你可能会很好奇,为什么 C、C++不能实现跨平台,而 Java 却可以实现跨平台?要想搞清楚这个问题,我们得了解一下什么是 JVM 虚拟机。
四、JVM 虚拟机
1. 概念
JVM:Java Virtual Machine。这是一种抽象的计算机,是在真实的计算机中仿真模拟出各种计算机的功能。简单地说,我们可以把 JVM 理解成是一个”软件“,该软件相当于一个小型的”计算机系统“。虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还有各种指令系统。Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种操作系统平台上不加修改地运行。
JVM 最核心的一个模块叫 Java 解释器,相当于是计算机的“CPU”,可以将.class 字节码解释成适合不同操作系统的可执行代码。Java 解释器实际上就是特定系统平台下的一个应用程序,只要实现了这个解释器程序,Java 字节码就能通过该解释器在该平台下运行,这是 Java 之所以可以实现跨平台的根本原因所在!
但目前并不是所有的操作系统都有自己对应的 Java 解释器,所以 Java 程序并不能在所有的操作系统下运行。它只能在已实现了 Java 解释器的平台中运行,比如 windows、linux、mac 等主流平台。
2. 种类
目前商用的 Java 虚拟机有很多种,其中比较主流的有如下几个:
1. 适用于 JavaSE/JavaEE 平台的主流 JVM(按流行程度递减):HotSpot VM、J9 VM、Zing VM。
2. 适用于 JavaME 平台的主流 JVM:CLDC-HI、J9 VM;
3. 适用于 Android 系统的主流 JVM:Dalvik VM、ART VM;
4. 其他。
对于以上这些虚拟机种类,我们作为初学者简单了解即可,尤其是对 HotSpot VM 有印象就行,这是我们进行 Java 开发默认使用的标准 JVM。
3. 跨平台实现原理(重点)
有了以上这些知识的铺垫,我们就可以尝试着理解 Java 之所以可以实现跨平台的原理了!
3.1 C 语言的编译过程
为了能让大家搞清楚 Java 的跨平台原理,我们还是先拿 C 语言的编译过程进行对比,如下图所示:
从上图可知,在 windows 系统下,我们编写的 C 语言源码文件后缀是.c,在 windows 平台下进行编译会生成后缀名为.exe 的可执行文件,经常安装软件的同学应该对这个.exe 后缀不陌生。生成.exe 文件后,就可以在 windows 系统中运行了。
但是如果我们换一个 linux 操作系统,即使是同样的 C 语言代码,在没有进行重新编译的前提下,是无法直接运行的。windows 里的.exe 可执行文件,在 linux 中是不能执行的!所以我们需要将之前的 C 语言程序,针对 linux 平台重新编译,生成适合于 linux 平台的可执行文件才行。
以上就是 C 语言针对不同平台的编译过程,换一个平台就得编译一次,所以 C 语言是无法实现跨平台的!但 Java 却可以实现跨平台,它是怎么做到的呢?我们往下看!
3.2 Java 语言的编译过程
Java 之所以可以实现跨平台,最根本的原因是由于 JVM 虚拟机的存在!我们先来看下图:
根据上图,并结合之前壹哥给大家讲过的 Java 编程步骤,我们知道 Java 编程要经历编写、编译、执行这三个核心步骤。而在执行之前,我们会把.java 源码文件编译成.class 字节码文件,这里的.java 文件、.class 文件和具体的操作系统无关,无论是 windows/linux/mac 等任何系统,这些文件都是一样的。那 Java 到底是依靠什么,才能实现不同操作系统上跨平台的呢?从上图可以很明显的看出,关键在于 JVM Java 虚拟机!正是因为存在 JVM 虚拟机,所以 Java 才能实现跨平台!
那 JVM 又是如何实现跨平台的呢?
3.3 JVM 跨平台实现机制
JVM 之所以可以实现跨平台,原理其实很简单!其实 JVM 本身并没有实现跨平台,也就是说不同的操作系统中,需要不同的 JVM 虚拟机,如下图所示:
所以,如果我们想在 Windows 系统下开发 Java 项目,就需要去 Oracle 官网下载安装一个 Windows 版的 JVM;如果我们想在 Linux 系统下开发 Java 项目,就需要去 Oracle 官网下载安装一个 Linux 版的 JVM;其他系统以此类推。也就是说,.java 文件、.class 文件,无论在哪个系统上都是一样的,但 JVM 是不一样的,基于此实现了跨平台!如下图所示:
从上图可知,Java 源程序编译后生成的.class 字节码,.class 字节码文件运行在 JVM 虚拟机上,并不直接运行在具体的 Windows 系统上,而 JVM 虚拟机又分为 Windows 版、Linux 版、Mac 版。JVM 充当了中间人的角色,把.class 文件和操作系统分割并联系了起来,.class 文件不和操作系统直接交互,而是由 JVM 和操作系统进行交互。
我们可以在 Windows、Linux、Mac 等任意系统中编写 Java 程序,并生成.class 字节码文件,但要想实现跨平台,则需要安装 Windows、Linux、或 Mac 等系统自己版本的 JVM 虚拟机。然后把字节码文件放到不同系统下的 JVM 虚拟机中运行,这样就实现了所谓的跨平台。这样我们程序员就只需要去编写和编译 Java 代码,至于跨平台的事情,是 JVM 要做的,我们不关心!
所以说,Java 跨平台的根本原理,就是通过 JVM 虚拟机来实现的!但你要知道,Java 语言是跨平台的,JVM 却不是跨平台的,不同的操作系统有不同版本的 JVM!
五、结语
至此,壹哥就重点把跨平台的实现原理给各位讲解了,现在你知道 Java 为什么可以实现跨平台了吗?如果你还有不明白的地方,可以在评论区留下你的问题。
六、今日作业
第一题
请简述编译型语言和解释型语言的区别,请在评论区给出你的答案。
第二题
简述 Java 程序的开发步骤有哪些?每个阶段生成的文件后缀是什么?评论区给出你的答案吧。
第三题
请简述 JVM 虚拟机实现跨平台的基本原理,在评论区给出你的答案。
【下篇预告】
Java 学习必备内容——Java 开发环境的搭建
评论