关于java的跨平台特性
Write once, compile anywhere,“一次编译,到处运行”的著名口号大家想必都听说过吧
一次编译:把java代码(.java文件)通过编译器转换成字节码(.class文件)(符合java规范的二进制数)
到处运行:指的也就是java的跨平台性,即相同的字节码放在不同的操作系统上,运行出来的结果依旧是一样的。
java不仅仅只是狭义的一门高级语言,更是一种java体制
到这里我还是对Write once, compile anywhere没有任何概念,难道别的高级语言就不可以吗。
我们来看看另一门高级语言c语言。我们编写了一个hello.c文件,linux下编译结果是hello,window下编译结果是hello.exe,而mac下编译结果是hello.out。我们无法把别的平台下的编译结果拿到当前平台下进行运行。
仅仅只是因为后缀名(扩展名)不同导致的吗,我们把c语言编译后的结果后缀名都统一成一种格式就可以了吗?当然不是!即使面对的是同一个后缀名的执行程序,不同的平台,不同的芯片,不同的环境(32位,64位)的指令集合也完全不同。编译出来的结果也千差万别
仔细想想电脑所有的文件都是二进制文件,不同的是操作系统需要通过不同的后缀名来使用不同的软件打开该文件。所以错不在后缀名上,错在不同操作系统解析这些二进制代码的方式各有所不同,产生的结果也各不相同。
举个例子 现在写了一个马冬梅.c 的程序(printf(“我叫马冬梅”)),将它放在不同系统中执行的结果
window(32位):我叫马梅
window(64位):我叫马冬梅
linux:我叫马东
mac:我叫冬梅
java虚拟机定义的二进制格式,这种我们称之为 字节码(ByteCode),是java虚拟机所能运行的格式
那么JVM又是怎么实现跨平台的呢?
首先指定规则告诉编译器我们不搞特殊,我们所有平台都一视同仁,你们编译出来的java代码的后缀必须是.class文件,到这一步,其实也没有解决实质性的问题,就是操作系统不能正确解析字节码。
既然操作系统解决不了的问题,那么我们自己解决,我们在操作系统前来解析这些字节码。
打一个比方,将这些操作系统比作windows比作美国人,mac比作韩国人,Linux比作日本人。
如果这个时候我们对他们说我爱你,他们当然听不懂。但是可以使用一个类似翻译机的东西
我爱你->英语翻译器->I love you 美国人(windows)听懂了
我爱你->韩语翻译器->사랑해 韩国人(mac)听懂了
我爱你->日语翻译器->あなたのことが好きです 日本人(Linux)听懂了
这翻译器都做是同一个工作就是让外国人听懂(操作系统执行正确的指令)。JVM就是这些翻译器,尽管平台再多,我们对应每一个平台我们都给他整一个翻译器。然后我们收到的必须是中文(规定编译器解析出同一个类型的文件.class),我们就能翻译个外国人听,让他们听懂(JVM执行字节码,得到相同的结果)
软件都要根据平台下载,有些还要严格区分32位/64位

jvm也不另外(不同款式的翻译机,操作系统找到适合自己的翻译机就能运行啦)

总结:原来jvm的存在已经为我们解决解决了跨平台的问题,也解决了GC(垃圾回收,再后面会提到),内存管理......当然有利就有弊,在算法网站可以明显看到同样的算法运行时长最短的永远是c/c++。
最后说一点我对跨平台的看法:我个人觉得java的跨平台的特性十分适合于技术适合网络世界,当请求调用服务时:java对象被序列化成二进制流/java类的字节码文件传输到别的机器上的时候能快速的通过java虚拟机解析出来,执行下一步操作,而不再需要考虑机器类型。
关于java的跨平台特性的更多相关文章
- Knowledge Point 20180506 深究Java的跨平台特性
本章主题:从骨子里看Java的跨平台;本文内容部分摘自https://www.cnblogs.com/roger-yu/p/5827452.html 有过基础Java知识的开发人员都知道Java是跨平 ...
- 如何理解JAVA的跨平台特性
1.java的跨平台,是指java在运行时是凌驾于os之上,是在jvm中运行的,跟os没有直接联系. 2.java跨平台主要是由java的编译方式决定的,因为java是通过jvm先编译再执行,它编译的 ...
- java基础二 java的跨平台特性
一:java跨平台的特性: 1.生成不平台无关系的字节码. 2.通过和平台有关的jvm即java虚拟机来执行字节码.jvm不跨平台. 图示: 疑问:1.为什么我们不直接写字节码? 因为字节码只有jvm ...
- Java的跨平台特性
语言跨平台是编译后的文件跨平台,而不是源程序跨平台.Java源代码首先经过编译器生成字节码,即class文件,该class文件与平台无关,而class文件经过解释执行之后翻译成最终的机器码,这是平台相 ...
- IT兄弟连 Java语法教程 Java语言的跨平台特性
什么是平台 Java是可以跨平台的编程语言,那么首先我们需要知道什么是平台,通常我们把CPU与操作系统的整体称为平台. CPU大家都知道,是计算机的大脑,它既负责思维运算,又负责计算机中各种零部件的命 ...
- java发展史与java的语言特性
概述: Java 体系比较庞杂,功能繁多,这也导致很多人在自学 Java 的时候总是感觉无法建立 全面的知识体系, 无法从整体上把握Java 的原因. 在这里我们先简单了解一下Java 的版本. 具体 ...
- 示例解读Java的跨平台原理
首先简单的解释一下Java跨平台的特征,相当于说写一个Java程序论述上可以运行在不同的操作系统平台上面(此处的平台我们就简单的看成是操作系统平台).下面我们用一些事例来说明它的好处. 我们先了解一些 ...
- Java 8新特性解读
(四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...
- Java 浅析三大特性之一继承
上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
随机推荐
- 使用eclipse新建一个c项目
一.打开eclipse并新建项目 1.快捷键:字体放大:Ctrl+Shift+“+” 字体缩小:Ctrl+“-”
- winfrom程序文本框第一次选中问题
想实现这样的功能: 就是在panel中的文本框,当第一次点击文本框时,全选文本框的内容:再次选择时,可以全选,也可以部分选中, 可是文本框总是从左全部选中,还不能从右边选择,在Enter或Down事件 ...
- php封装curl,模拟POST和GET请求HTTPS请求
<?php /** * @title 封装代理请求 * @author victor **/ class ApiRequest { /** * curl提交数据 * @param String ...
- MySQL 必知必会学习笔记(常用命令二)
CREATE TABLE students(student_id INT UNSIGNED, name VARCHAR(30), sex CHAR(1), birth DATE, PRIMARY KE ...
- JS中的变量和数据类型
所谓变量,就是里面存储的数据是可以改变的. 在使用变量之前,我们需要先声明变量.声明变量的关键字有var let const 在ES里面声明变量可以使用var,如下: //var 变量名 var ...
- Excel身份证验证,身份证校验公式
=IF(LEN(Q4)=0,"空",IF(LEN(Q4)=15,"老号",IF(LEN(Q4)<>18,"位数不对",IF(CH ...
- YYY0.1YYY
XXX0.2XXXZZZ目前提供免费下载和自动更新功能,由于自己的时间有限,就我一个开发,后期持续更新在线听歌.mp4转mp3.高音质下载.全球dj网站免费下载功能!ZZZ
- puts方法要点
puts是print string的缩写.尽管没有直观的表示会调用换行符,但是puts会这样做:如同print,打印用户的数据,之后自动地转到新一行.假如让puts打印已经以换行符结束的一行,它不会再 ...
- python实现文件的复制
# 练习: # 1. 写程序,实现文件的复制,(注:只复制文件,不复制文件夹) # 要求: # 1) 要考虑文件关闭的问题 # 2) 要考虑超大文件无法一下加载到内存的问题 # 3) 要能复制二进 ...
- .NET复习笔记-泛型
1.yield关键字用于返回迭代器具体的值,如下框代码所示 /// 返回0~9整数集合 public static IEnumerable<int> yieldSampleMethod() ...