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
java跨平台性说明的更多相关文章
- JDK配置 java跨平台性
jdk 虚拟机jre 依赖包javac 编译java 运行JAVA_HOME 一个存储jdk路径的自定义的变量,方便其他地方配置以后更改方便其他地方调用JAVA_HOME使用%JAVA_HOME%配置 ...
- java跨平台性分析
实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在CSDN论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍.我以前很喜欢Serv-U,自从它用Java重 ...
- 写在开始编写Java之前(1)——Java的跨平台性
Java语言之所以比C语言更加实用 是有原因的 Java的一个重要的特点——跨平台性 无论是哪个平台,如Windows.Linus还是Mac系统 Java的语法都是一样的 这个要比C语言用处要广 因为 ...
- JAVA学习之跨平台性
Java语音的特点:跨平台性什么是跨平台性通过Java语音编写的应用程序再不同的系统平台上都可以运行. 原理是什么只要在需要运行Java应用程序的操作系统上.先安装一个Java虚拟机(JVM Java ...
- java什么是跨平台性?原理是什么?
所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行. 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行 ...
- [java基础]java跨平台的基础知识
1.Javac编译器 Javac编译器读取Java源代码,并将其编译成字节代码(.class格式),调用Javac的命令行示例如下: C:>javac options filename.java ...
- 快捷键和功能键、进入DOS命令行的方法、DOS命令讲解、java跨平台原理、JRE和JDK的定义、书写格式
快捷键和功能键A:键盘功能键* a:Tab* b:Shift* c:Ctrl* d:Alt* e:空格 * f:Enter* g:Window* h:上下左右键* i:PrtSc(PrintScree ...
- 什么是跨平台性?原理是什么?JVM
所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行. 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行 ...
- 01-常见Dos命令、Java历史、Java跨平台、配置Path环境变量、第一个HelloWorld例子
常见Dos命令 dir: 列出当前目录下的文件以及文件夹 md: 创建目录 rd: 删除目录 cd: 进入指定目录 del: 删除文件 copy: 复制文件 xcopy: 复制目录 tree: 列出目 ...
随机推荐
- 你,确定了解Java的String字符串?
本文将描述JDK6中String.intern()是如何实现的,以及在JDK7和JDK8中对字符串池化技术做了哪些改变. String池化介绍 String池化就是把一些值相同,但是标识符不同的字符串 ...
- 4.3CNN卷积神经网络最详细最容易理解--tensorflow源码MLP对比
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 CNN卷积神经网络 ...
- 【模拟8.05】优美序列(线段树 分块 ST算法)
如此显然的线段树,我又瞎了眼了 事实上跟以前的奇袭很像....... 只要满足公式maxn-minn(权值)==r-l即可 所以可以考虑建两颗树,一棵节点维护位置,一棵权值, 每次从一棵树树上查询信息 ...
- k8s-生产环境部署django项目k8s-dashboard管理系统
1. k8s-生产环境部署django项目k8s-dashboard管理系统 gitee地址: https://gitee.com/scajy/django-k8s-dashboard.git 部署架 ...
- 4、git和gitlab的配置(2)
4.10.使用 gitlib 模拟开发流程: 1.项目经理指定开发计划: project01 需求 开发者 完成日期 v1.0 首页 dev01 4.28 支付 dev02 4.30 2.rpm(项目 ...
- vue v-if条件判断
<view class='circle-G' v-if="item.status === 'G'"></view> <view class='circ ...
- 如何获取微信小程序for循环的index
在微信小程序开发中,对于wx:for,可以使用wx:for-index="index"来获取数组中的元素的索引值(下标). <view class="item&qu ...
- Docker:docker国内镜像加速
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式 { "registry-mirrors": [ "https://registry.do ...
- pdfkit html转pdf
pdfkit的通用option选项 参考:https://cloud.tencent.com/developer/ask/202116https://www.cnblogs.com/taceywong ...
- buu crypto 幂数加密
一.这和二进制幂数加密有些不同,可以从数字大小判断出来,超过4了,一般4以上已经可以表达出31以内了,所以是云影密码,以0为分隔符,01248组成的密码 二.python代码解密下 code=&quo ...