关于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实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
随机推荐
- MySQL拓展操作
MySQL除了基本的增删该查功能,还有以下拓展功能: create table t1( id int ...., num int, xx int, unique 唯一索引名称 (列名,列名), con ...
- cocoaPods安装爬坑总结
1.移除现有Ruby默认源 $ gem sources --remove https://rubygems.org/ 2.使用新的源 $ gem sources -a https://ruby.t ...
- jmert中如何测试上传文件接口(测试上传excel文件)
第一次用jmeter这个工具测试上传接口,以前没做过这一块,导致走了很多弯路.特地把经验谢谢,怕自己以后忘记... 一,jmeter如何上传文件 jmeter 的 http requests post ...
- 字符串及其操作,字符的Unicode编码
plainText=input('message:') for c in plainText: print(chr(ord(c)-3),end='') plainText=input('message ...
- Mad libs
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type &q ...
- java完整并发知识结构图
一张大的java并发知识结构图,梳理清楚知识的脉络,知识不再零散
- alibaba/druid 下的 密码加密
使用ConfigFilter cliangch edited this page on 3 Feb · 12 revisions ConfigFilter的作用包括: 从配置文件中读取配置 从远程ht ...
- 2018-2019-2 20175224 实验一《Java开发环境的熟悉》实验报告
实验报告封面 实验内容与步骤 Java开发环境的熟悉-1 1.建立“自己学号exp1”的目录 2.在“自己学号exp1”目录下建立src,bin等目录 3.javac.java的执行在“自己学号exp ...
- 问题1:Oracle数据库监听启动失败(重启监听,提示The listener supports no services)
编辑监听文件:/home/DB/oracle/11gR2/db/network/admin/listener.ora 在文件内添加静态监听实例,如下内容: SID_LIST_LISTENER =(SI ...
- Mac 中 PyCharm 配置 Anaconda环境