java跨平台性说明
一、举例说明
我们知道,只要是用标准C开发的程序,使用不同的编译器编译后的可执行文件是可以在对应平台运行的,比如windows可以使用VC编译,那编译后的exe文件就可以在windows下运行;liunx下可以使用GCC编译,生成的可执行文件就可以在Liunx上运行。
到这里请大家思考一个问题:“VC编译的exe能在Liunx上运行吗?”
答案肯定是否定的。使用特定编译器编译的程序只能在对应的平台运行,这里也可以说编译器是与平台相关的,编译后的文件也是与平台相关的。我们说的语言跨平台是编译后的文件跨平台,而不是源程序跨平台,如果是源程序,任何一门语言都是跨平台的语言了。这个如果您不明白,看下面一个案例:
比如火星真的有外星人,就像我们观察蚂蚁一样,火星人默默的观察着我们,有一天,当人类做的什么事情让火星人实在是看不下去了,所以决定来地球教育我们,但有一个问题,火星人只会说火星文,地球人理解不了,怎么办啊?找翻译呗!由中文翻译把火星文翻译为中文,英文翻译把火星文翻译为英文等等等等,但这样问题来了,中文翻译翻译的东西只有中国人能听懂,美国人法国人根本不明白,英文翻译翻译的文章中国人也不明白,也就是语言不能跨平台。
那上例中,火星文就是C语言,各个国家是平台,中文翻译英文翻译就是对应平台的编译器,编译后的文章就是可执行文件。虽然源文章火星文是与平台无关的,但翻译器是与特定国家相关的,翻译后的文章也是与特定国家相关的。
接下来思考另一个问题“怎么让火星文跨平台呢?”
火星人想到了地球上有世界语,于是首先把自己的文章翻译为世界语;世界语各国人当然看不懂,没关系,火星人又给每个国家配备了一个世界语到本地语的翻译,这样火星文只要翻译一次(翻译为世界语),就可以到各个国家运行了。还要记住,这个过程火星人要提供两个组件,第一是火星文到世界语的翻译,第二是世界语到对应本地语言的翻译。如下图:
有了上面案例的积累,我们也知道了语言跨平台原理:“不能编译成机器语言,因为那样就与平台相关了,编译为中间语言,再由解释器二次编译,解释执行。
类似于c语言的.c,java生成的中间码是.class,这个既是我们上文中说的中间语,各个平台解释器就是各种国家翻译。
接下来我们再比较下两种方式的差异:第一,C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关;第二,Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器。
这里再说下语言根据执行方式的不同分类:第一是编译执行,如上文中说到的C,它把源程序由特定平台的编译器一次性编译为平台相关的机器码,它的优点是执行速度快,缺点是无法跨平台;第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,类似于同声翻译,它的优点是可以跨平台,缺点是执行速度慢,暴露源程序;第三种是从Java开始引入的“中间码+虚拟机”的方式,它既整合了编译语言与解释语言的优点,同时如虚拟机又可以解决如垃圾回收,安全性检查等这些传统语言头疼的问题,所以其后微软的.NET平台也使用的这种方式。
最后再请大家思考一个问题:“开发Java程序需要什么?运行Java程序需要什么?”
答案:开发Java需要由源文件到中间文件的解释器;运行Java需要对应平台的解释器。与火星人要提供两个组件一样,SUN也得提供两个组件:第一,把源程序翻译为中间码的编译器;第二,相应平台的解释器。SUN把这两个组件包含在一个工具包中,我们把它叫做JDK(Java Developent ToolKit)。
原文链接:https://blog.csdn.net/weixin_39877284/article/details/81516647
二、跨平台的优势
java的跨平台,是指java运行时候凌驾于os之上,是在jvm中运行的,跟os没有直接联系。(os:Operating System:操作系统)
如果有机会写数据导入导出,和服务器之间交互的应用,就会知道“跨平台”有什么意义了。 (难道意义是把要交互的信息转成统一格式?不懂为什么这么类比)
在java之前,跨平台是很痛苦的事情,主要是因为所有对于系统的调用,在不同的操作系统下结果都不一样,简单的来说,int的长度在不同操作系统里面就不一样,甚至于连字节排列的顺序都不同。调用同一个函数返回的格式也不同,因此,写程序的人自己要对不同的系统非常了解,如果真的需要对不同操作系统进行兼容,要在程序里面写很多if,编译的时候要先判断使用的操作系统,创造很多环境变量才能编译,而且编译好的二进制可执行文件只能在本系统上运行。如果你写的是个功能库供别人调用的,那么光对操作系统的判断就占了代码的绝大部分,而且,还要你在不同平台下进行测试,这可是个艰苦卓绝的工作。建议你有空可以看看apache httpd服务器的源代码就知道了。
自从有了java之后,就把操作系统兼容的工作丢给了jvm了,对于程序员来说就再也不要关心int有几位,还有高位在前还是地位在前的问题了,你只要用java的代码把你程序的逻辑实现出来就可以了,这些兼容的问题就交给jvm去处理吧。这样,如果你写一个程序交付给客户使用,如果客户的环境是运行AIX的,你就不需要在本地也装一个AIX来开发和运行,你可以在windows上完成所有的开发,然后把编译好的文件交给客户就可以了,以后有别的客户需要在Solaris上运行这个程序,你都不用修改,直接拿过去就可以运行,这难道不是一种方便吗?只有被跨平台开发折磨过的人才能更深得体会到用java开发跨平台应用的优势。
三、Java语言的跨平台性是如何实现的?
Java属于高级语言中的编译语言(其实是两种高级编程语言:编译语言与解释型语言的结合),编译语言运行的大致过程为:
源代码文件是人工编写的文件,如.cpp、.java等由相应语言代码组成的源文件;
源文件不能直接被计算机执行,需要相应的编译器,将源代码进行翻译(编译),得到的是汇编语言组成的汇编程序(不同cpu、操作系统平台编译出的汇编代码不同)
不同的汇编程序经过汇编器的汇编,得到的是计算机可以运行的二进制文件,程序就可以执行了(如果需要生成可执行文件,如exe等,需要经过链接器将文件再次“打包”)
通常所说的编译语言的不可跨平台问题一般指,不同平台需要的编译器不同(对源代码的编译过程不同)、编译出的汇编文件不同(后续也不同),当在平台A中的代码在平台B上编译运行时,会出现部分偏差甚至错误。
Java文件运行大致过程
Java文件在运行时,会将源文通过javac命令编译为字节码文件,这个文件是跨平台的,java虚拟机(jvm,在java运行环境/jre中)也对应的只接收处理class文件,java虚拟机是一个通用的执行平台(但有不同版本),不同java平台编写文件通过java虚拟机转换的文件最后功能相同,因而实现在任意平台的java程序都可以在其他平台运行。
原文链接:https://blog.csdn.net/nominior/article/details/82686966
在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。