Knowledge Point 20180506 深究Java的跨平台特性

  本章主题:从骨子里看Java的跨平台;本文内容部分摘自http://www.javashuo.com/article/p-nloylylr-ha.htmlhtml

  有过基础Java知识的开发人员都知道Java是跨平台的,可咱们知道Java为何要跨平台吗,Java的跨平台又是如何实现的呢?下面咱们来一一了解。java

1.什么是平台

  Java是能够跨平台的编程语言,那咱们首先得知道什么是平台,Java是一个高级开发语言,经过操做系统提供的接口进行开发,因此这里的平台主要指的就是操做系统了。linux

  操做系统是充当用户和计算机之间交互的界面软件,不一样的操做系统支持不一样的CPU,严格意义上说是不一样的操做系统支持不一样CPU的指令集。例如  windowsliunx都支持IntelAMD的复杂指令集,但并不支持PowerPC所使用的精简指令集,而早期的MAC电脑使用的是PowerPC处理器,因此也就没法在MAC下直接安装windows,直到05MAC改用了IntelCPU,才使在MAC下安装windows成为可能。但问题来了,原来的MAC 操做系统也只支持PowerPC,Intel上也不能安装,怎么办?因此苹果公司也得重写本身的MAC操做系统以支持这种变化。最后总结下,咱们要知道,不一样的操做系统支持不一样的CPU指令集,如今的windows,liunx,mac,solaris都支持IntelAMDCPU指令集。程序员

  有了上面的铺垫,下面就要告诉你们,若是您要开发程序,首先应该肯定本身使用什么操做系统,知道什么是平台,咱们看Java跨平台原理。web

2.Java跨平台的原理

  首先看一张与C语言有关的图:   编程

 

  若是您有过C的开发经历,这张图看起来将很是轻松。咱们知道,只要是用标准C开发的程序,使用不一样的编译器【编译器:将一种语言规范转化为另外一种语言规范,一般编译器是将便于人们理解的语言规范转化为机器容易理解的语言规范。例如,咱们将C语言的语言规范转换为平台的语言规范(可以被平台识别的指令集),这是C语言编译器所作的事情】编译后的可执行文件是能够在对应平台运行的,好比windows可使用VC编译,那编译后的exe文件就能够在windows下运行;liunx下可使用GCC编译,生成的可执行文件就能够在Liunx上运行。到这里请你们思考一个问题:“VC编译的exe能在Liunx上运行吗?windows

  答案确定是否认的。使用特定编译器编译的程序只能在对应的平台运行,这里也能够说编译器是与平台相关的,编译后的文件是与平台相关的。咱们说的语言跨平台是编译的文件跨平台【跨平台分为源码级的跨平台和中间码的跨平台】,而不是源程序跨平台,若是是源程序,任何一门语言都是跨平台的语言了。这个若是您不明白,看下面一个案例:好比火星真的有外星人(而且毋庸置疑,火星是韩国人的,火星文也必定是韩国人发明的),就像咱们观察蚂蚁同样,火星人默默的观察着咱们,有一天,当人类作的 什么事情让火星人实在是看不下去了(好比你的单纯赶上可恶的拜金),因此决定来地球教育咱们,但有一个问 题,火星人只会说火星文,地球人理解不了,怎么办啊?找翻译呗(也许非主流能够帮忙,玩笑)!由中文翻译把火星文翻译为中文,英文翻译把火星文翻译为英文 等等等等,但这样问题来了,中文翻译翻译的东西只有中国人能听懂,美国人法国人根本不明白,英文翻译翻译的文章中国人也不明白,也就是语言不能跨平台。浏览器

  那上例中,火星文就是C语言,各个国家是平台,中文翻译英文翻译就是对应平台的编译器,编译后的文章就是可执行文件。虽然源文章火星文是与平台无关的,但翻译器是与特定国家相关的,翻译后的文章也是与特定国家相关的。接下来思考另外一个问题怎么让火星文跨平台呢?安全

  火星人想到了地球上有世界语,因而首先把本身的文章翻译为世界语;世界语各国人固然看不懂,不要紧,火星人又给每一个国家配备了一个世界语到本地语的翻译,这 样火星文只要翻译一次(翻译为世界语),就能够到各个国家运行了。还要记住,这个过程火星人要提供两个组件,第一是火星文到世界语的翻译,第二是世界语到对应本地语言的翻译。以下图:服务器

 

  有了上面案例的积累,咱们也知道了语言跨平台原理:不能编译成机器语言,由于那样就与平台相关了,编译为中间语言,再由解释器二次编译,解释执行。以下是Java跨平台原理表示图:

 

  上图中的.java就是源程序,相似于c语言的.c,生成的中间码是.class,这个既是咱们上文中说的中间语,各个平台解释器就是各类国家翻译。

接下来咱们再比较下两种方式的差别:

  • 第一,C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关
  • 第二,Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,处处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不一样的平台须要不一样的解释器.

这里再说下语言根据执行方式的不一样分类:

  • 第一是编译执行,如上文中说到的C,它把源程序由特定平台的编译器一次性编译为平台相关的机器码,它的优势是执行速度快,缺点是没法跨平台;
  • 第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,相似于同声翻译,它的优势是能够跨平台,缺点是执行速度慢,暴露源程序;
  • 第三种是从Java开始引入的中间码+虚拟机的方式,它既整合了编译语言与解释语言的优势,同时如虚拟机又能够解决如垃圾回收,安全性检查等这些传统语言头疼的问题,因此其后微软的.NET平台也使用的这种方式。

3.跨平台的优势

  从上面咱们知道了Java跨平台的原理即最后生成的由平台操做的程序文件对于不一样的平台是不一样的,Java源文件通过编译生成字节码文件.class,字节码文件经由JVM解释生成能被平台执行的机器语言;在这个过程当中咱们注意字节码文件是相同的,不一样的是通过解释后的机器码,Java跨平台正是基于解释.class文件的虚拟机的,可是虚拟机倒是不跨平台的,只要在须要运行java应用程序的操做系统上,先安装一个Java虚拟机(JVM JavaVirtual Machine)便可。由JVM来负责Java程序在该系统中的运行。简单来讲就是如图所示那样程序代码通过编译以后转换为一种称为Java字节码的中间语言,Java虚拟机(JVM)将对字节码进行解释和运行。编译只进行一次,而解释在每次运行程序时都会进行。编译后的字节码采用一种针对JVM优化过的机器码形式保存,虚拟机将字节码解释为机器码,而后在计算机上面运行。

  同一个.class文件在不一样的虚拟机会获得不一样的机器指令(WindowsLinux的机器指令不一样),可是最终执行的结果倒是相同的

  跨平台使得Java的源代码一经编译能够借助于JVM处处运行实现了它的“write once,run anywhere”可是随着JavaB/S中的普遍使用,跨平台的特性显得就有些鸡肋了,这是由于B/S咱们借助浏览器对网络另外一端的服务器访问,此时相对应的客户端只是依赖与浏览器,因此平台相对应的只是服务器的平台,因此从客户端来看它的跨平台就很"鸡肋",实际上这种想法是很偏见的.下面咱们来聊一下Java跨平台的鸡肋.

4.聊聊"鸡肋"Java跨平台

  咱们初学Java,只怕最深的印象就在于Java的跨平台了,咱们的前辈教师,老是会将Java的跨平台夸赞的不得了,可实际接触开发一段时间后,会不会有这么一个疑问呢?那就是Java源自于C++,C++是如何操做的呢?Java的跨平台究竟在C++的基础上,作出了哪些进步呢?为何网上有了一种说法,Java的跨平台很"鸡肋"?是这样吗?下边针对这些问题聊聊;

    C++语言原本就是跨平台的,不过是“源码级”跨平台。原本就存在针对linuxwindows的不一样的编译器。因此有C语言“一次编写,处处编译”,Java是“一次编译,处处运行”的说法。如C++创始人酸溜溜的说法,JVM造了一个新的平台,让全部Java程序只能在这个平台上运行,而CC++的代码能够在几十个不一样的平台上运行,从源码这个角度而言,CC++是跨平台的,而Java不是。这里所说的源码是通过编写不曾编译的。那么这么看起来Java的跨平台是否是真的有些鸡肋了呢?

  这种说法也是有失偏颇的,由于JavaC针对的方向不一样因此跨平台承担的责任也就不一样了,C主要用于系统底层的开发,如操做系统Linux,硬件驱动程序。因此对于跨平台就是源码级别的。而Java呢则属于中间码的跨平台。

  C++ 编译生成的是纯二进制的机器指令,而JAVA编译生成的是非纯二进制的字节码。而这种基于Unicode的字节码是不依赖于特定的计算机硬件架构而存在的——这就意味着只要有JVM环境,你的字节码就能够在任何平台上运行。其次,JAVA字节码的二进制数据以固定的格式进行存储和传输,消除了字节顺序的干扰。

  JAVA为何能跨平台?由于字节码是在虚拟机上运行的,而不是编译器。换而言之,是由于JVM能跨平台安装,因此相应JAVA字节码即可以跟着在任何平台上运行。只要JVM自身的代码能在相应平台上运行,即JVM可行,则JAVA的程序员就能够不用考虑所写的程序要在哪里运行,反正都是在虚拟机上运行,而后变成相应平台的机器语言,而这个转变并非程序员应该关心的。

       Java的起源, 发明的初衷, 最开始Java是为了单片机开发的, 而单片机的发展是很迅速的, 你花了半年为某种单片机开发了程序, 等程序出来了可能这个型号的单片机已经没人用了, Sun当时是为了解决这个问题, 提出了程序只用写一遍编译一遍, 而后让JVM来适应单片机型号的不一样.这是最初的跨平台,而发展到了今天呢?咱们知道Java已经成为了web开发的主流语言,但是咱们开发的时候是在Windows下开发,而部署每每是部署在LinuxUnix下的,因此此时Java的跨平台就又能够大展神威了,由于无论何时,Java说白了都是运行在JVM上的,真正须要跨平台的是JVM,因此对于咱们编写程序来讲,就让编码和跨平台分开了,便利了开发和测试。最为引人注意的一点是,Java在继承C++的优势的时候,也摒弃了C++的缺点,其中有一点就是内存的分配和回收,Java将这部分工做交由JVM自动执行,而减轻了开发人员对于这方面的操做,因此说Java的跨平台是不少因素形成的,发展到了今天Java已经超出了一种语言,更多的成为了一个平台。【想象一下若是是如C++那样的编写方法,那么咱们编写后的程序部署后还要再通过编译才能够,而经过Java咱们能够在开发中直接编译,只须要将中间码部署在服务器上,其后的事情就不须要咱们来管理了,相对来讲开发和部署就简单了。】

  咱们做为编写端,只注重在编写代码,至于跨平台的任务就交给了JVM来处理,中间码是跨平台的,JVM却不是跨平台的,这点要注意!

  综上;咱们说Java的跨平台鸡肋,是很片面的,针对性不一样,没有可比性!

赘述

  咱们有没有考虑这么一个问题,那就是一样跨平台,为何互联网开发更多的选择了Java,而没有选择C呢?

  其实选择哪一种语言用于开发,这并无一个彻底正确的答案,咱们使用Java开发的程序,一样也是可使用C开发的,只不过,在互联网发展之初对于语言的要求就是安全,跨平台和支持互联网操做,而Java很好的支持了这些,同时Java源于C++,又摒弃了C++中的很差的东西,因此相对来讲Java的简单受到了更多人的推崇,使用的人多了,市场上对其的支持也就多了。

相关文章
相关标签/搜索