关于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实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
随机推荐
- vue组件的通信
组件的引入两种方式 动态组件 <p is="com-a"></p> 直接引入 <com-a></com-a> 插槽功能 父组件引入 ...
- 自动调参库hyperopt+lightgbm 调参demo
在此之前,调参要么网格调参,要么随机调参,要么肉眼调参.虽然调参到一定程度,进步有限,但仍然很耗精力. 自动调参库hyperopt可用tpe算法自动调参,实测强于随机调参. hyperopt 需要自己 ...
- DevExpress ASP.NET Core Controls 2019发展蓝图(No.2)
本文主要为大家介绍DevExpress ASP.NET Core Controls 2019年的官方发展蓝图,更多精彩内容欢迎持续收藏关注哦~ [DevExpress ASP.NET Controls ...
- 查询总耗CPU最多与平均耗CPU最多的SQL语句
总耗CPU最多的前20个SQL total_worker_time AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time AS ...
- Rewrite json
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- php上传文件配置
根据需要调整php.ini文件内容,完成后重启服务器即可. 上传文件相关配置内容: file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_d ...
- malloc/free与new/delete的区别与联系
相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...
- Django中Model-Form验证
Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...
- 什么是IIS ?
IIS是Internet Information Services的缩写,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务. 它包括WWW服务器.FTP服务器和SMTP服务 ...
- 左侧 随着页面滚动固定 fixed. scroll .scrollTop
1.图片. 要求:随着页面滚动 . 左侧应该顶着 浏览器顶部, 向上回滚, 就恢复原状. 2. 代码: html <div class="all "> <!-- ...