全文大约【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开发环境的搭建

从零开始学习Java系列之Java运行机制与跨平台特性的更多相关文章

  1. 理解JAVA与C的运行机制

    1.java的运行机制 java的编译过程,将java的源程序(扩展名为.java的文件),由java编译程序将java的字节码文件(.class文件)在jvm上运行,机器码有cpu运行, jvm编译 ...

  2. 【java系列】java开发环境搭建

    描述 本篇文章主要讲解基于windows 10系统搭建java开发环境,主要内容包括如下: (1)安装资料准备 (2)安装过程讲解 (3)测试是否安装成功 (4)Hello Word测试 1   安装 ...

  3. 重拾java系列一java基础(1)

    前言,不知不觉,从接触java到工作至今已有两年的时间,突然感觉自己的基础知识还很薄弱,有些知识虽然知道,但是停留在表面上,没有深挖,或者实践过,感觉掌握的很肤浅,而且时间一长,就觉得忘记了,我觉得这 ...

  4. 第2节 mapreduce深入学习:11、maptask运行机制(多看几遍)

    mapTask运行机制详解以及mapTask的并行度在mapTask当中,一个文件的切片大小使用默认值是128M,就是跟我们一个block块对应大小一样 MapTask运行的整个过程 背下来1.Tex ...

  5. Java学习之旅开篇:运行机制及环境搭建

    在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...

  6. java应用程序的运行机制

    计算机高级语言类型主要有 编译型 和 解释型 两种,java是两种类型的结合. 机制:利用编译器(javac)将源文件(后缀名.java)编译成字节码文件(后缀名.class),最后利用虚拟机(jvm ...

  7. Java 的编译和运行机制

    创建一个 名为 test.java 的 Java 源文件 源代码: class Hello{ public static void main(String[] args) { System.out.p ...

  8. Java 应用程序的运行机制

    计算机高级语言: 编译型 (C)                             解释性(JS)Java 使两种类型的结合 java     编译器    class   \|/jvm     ...

  9. 重拾java系列一java基础(2)

    1.分支流程控制 if(布尔表达式/分支条件){  //语句块} if(布尔表达式/分支条件){  //语句块1}else{  //语句块2} if(条件1){  //语句块1}else if(条件2 ...

  10. Java系列: JAVA字符串格式化-String.format()的使用(zz)

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

随机推荐

  1. 【BOOK】Ajax数据爬取

    Requests获取原始HTML文档,Ajax加载和JavaScript处理的数据无法获得 一.Ajax Ajax-异步的JavaScript和XML Ajax请求页面更新: 1. 发送请求 2. 解 ...

  2. <连城诀>剧情大纲+随笔

    --剧情还是偷个懒,从百度百科抄袭一下,红色字体为补充和说明   在湘西沅陵南郊的麻溪乡下,三间小屋之前的晒谷场上,隐居此处多年的剑术名家"铁索横江"戚长发,看着徒弟狄云与女儿戚芳 ...

  3. STM32自学笔记

    1位带操作 第一种位带操作 #define BITBAND_REG(Reg,Bit) (*((uint32_t volatile*)(0x42000000u + (((uint32_t)&(R ...

  4. Luogu P3374 【模板】树状数组 1 [单点修改-区间查询]

    P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...

  5. oracle转义单引号

    --笔记开始: 每次从表中取数据,然后都要在excel中添加单引号,再粘到查询语句中进行查询比较麻烦. 所以能在查出的结果直接加上单引号是很省时间的 . 这里用到转义. tablename: ep: ...

  6. netty库包冲突问题

    参考 http://www.yayihouse.com/yayishuwu/chapter/1603 报错信息:Caused by: java.lang.NoSuchFieldError: netty ...

  7. 3、HTTP请求头与响应头

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  8. ajax高级(请求服务器脚本,数据库, ajxa xml文件)

    请求jsp与请求普通文件不通过的地方,请求jsp可能会传参,比如搜索,用户名,页码这些 html部分:<input type="text" id="txt1&quo ...

  9. 使用TLS/SSL传输层安全机制实现web项目的通信安全

    自己的web项目在内网ip访问时,浏览器会提示不安全 原因就是因为没有证书,而传输层的TLS/SSL协议,会告诉我们本地客户端的浏览器,我现在访问的web项目的ip地址可能存在安全风险 要解决这个通信 ...

  10. JAVA 在开发中如何选择集合实现类

    先判断存储地类型(一组对象[单列]或者键值对[多列]) 一组对象:Collection接口 允许重复:list 增删多:LinkedList[底层维护了一个双向链表] 改查多;ArratList[底层 ...