关于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实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
随机推荐
- winfrom程序Datagridview列名问题
之前在做程序的时候,有遇到过这个问题: 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColume"解决方法 解决办法 ...
- MFC动态创建对话框中的按钮控件并创建其响应消息
转自:http://www.cnblogs.com/huhu0013/p/4626686.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 1 ...
- Problem A: 字符的变化
Description 定义一个Character类,具有: 1. char类型的数据成员. 2.构造函数Character(char). 3. Character toUpper():如果当前字符是 ...
- WINDOWS SERVER 2016 IE使用FLASH PLAYER的方法
Windows Server 2016出于安全的考虑,默认禁用了Flash Player.把Windows Server 2016作为日常操作系统的童鞋会发现,IE里完全没有Flash Player这 ...
- vscode里使用.vue代码模板的方法
1.设置.vue模板 打开编辑器,点击文件 —— 首选项 —— 用户代码片段,会弹出来一个输入框. 在输入框输入vue,回车,会打开一个vue.json文件. 在里面复制以下代码: { "P ...
- 20165214 2018-2019-2 《网络对抗技术》Exp1+ 逆向进阶 Week4
<网络对抗技术>Exp2 PC平台逆向破解之"MAL_简单后门" Week4 一.实验内容 Task1 自己编写一个64位shellcode.参考shellcode指导 ...
- c++单链表冒泡排序(交换结点),链表增删改查,运算符重载
#include <iostream> #include <stdlib.h> #include <time.h> #include <fstream> ...
- day 15递归 匿名函数
三元表达式 目的是简化书写 局限性:三元表达式智能简化仅有两个分支的if判断,而且这个判断无论是否成立都必须要返回值 res = True if age >=18 else False 递归: ...
- 今天写代码遇到了一个BUG
在我们日常写注释是需要注意,在有返回值的里面不要用以下方式注释,不然不会报错,运行状态码返回也是200,但就不是想要的结果. 下面举个例子 return { 'token':token, 'user_ ...
- amazeUI的confirm控件记录缓存问题的解决办法
场景:列表行每行都有删除按钮,点击删除按钮将行记录的id传给js方法,js方法中调用amazeui的confirm控件,确认删除function通过ajax执行删除行为. 问题现象:每次删除列表第一行 ...