前言从最初学习Java开始,我们就知道Java的口号是:“一次编写,到处运行”。没有了平台的束缚,使得我们再编写Java时并不需要(那么)关心将来运行程序的平台。

那么,Java是如何实现 平台无关性的呢?今天我们来讨论这个问题。为什么是“不需要(那么)关心”,而不是“不需要关心”?因为在工程实践中,不全面考量运行程序的系统 / 网络 / 硬件 / 国家等因素是不可能的。

目录

1. 运行环境 = 操作系统 + 硬件

首先,理解清楚什么是平台?平台是指程序的运行平台,或者称为运行环境,具体来说:运行环境 = 操作系统 + 硬件(主要是CPU):

1.1 操作系统屏蔽了除 CPU 外的硬件差异

操作系统(Operating System)是管理计算机硬件与软件资源的程序。对于现代应用程序来说,它们是不会直接操作硬件的,而是采用向操作系统发送指令的方式来间接控制硬件,这些指令就是系统调用。

系统调用是操作系统与应用程序之间的接口(Application Programming Interface,API)。然而不同操作系统提供的 API 是不同的,这样的话,程序调用 API 的代码也会因操作系统不同而不同,因此操作系统是运行环境的要素之一。

1.2 CPU 只能运行本地代码

每种CPU只能“读懂”自身支持的机器语言或者本地代码(native code),而每种CPU使用的指令集不尽相同。因此,任何高级编程语言 / 汇编语言编写的程序,最后都需要“翻译”为CPU能够读懂的本地代码。

下面,我们对比C/C++ & Java两种语言是使用什么方式将源代码转换为本地代码的。

2. C/C++ 如何将源代码转换为本地代码步骤1:编译生成目标文件(编译时)

步骤2:链接生成可执行文件(编译时 or 运行时)

3. Java 如何将源代码转换为本地代码步骤1:编译前端生成 Class文件(编译时)

步骤2:编译后端解释或编译为本地代码(编译时 or 运行时)

4. Java 虚拟机的公有协议与私有实现Java 虚拟机的协议 指的是《Java 虚拟机规范》,它规定了 Java 虚拟机的概念模型;

Java 虚拟机实现 是指各种平台上具体的虚拟机实现,例如 Classic VM、HotSpot VM;

在这个概念模型下,不同的虚拟机实现有统一的输入输出模型:

所有虚拟机实现的输入与输出都是一致的:输入为Class 文件,处理过程是字节码解释执行的等效过程,最终输出的是预期的执行结果。这样的方式即保证了不同平台不同实现的虚拟机行为一致,也提高了伸缩性。不同平台的虚拟机实现可以根据具体平台特点,赋予虚拟机实现更多的特点:更高的性能 or 更低的内存消耗 。

5. 总结

虚拟机与字节码是Java实现无关性的基础。首先,与不同于C/C++,Java将程序存储格式从本地代码转变为字节码;其次,不同平台的虚拟机都统一采样字节码作为输入语言,并统一遵守《Java 虚拟机规范》,最终提供了一个不依赖于特定操作系统 & 硬件的运行环境,即平台无关性。

参考资料《程序是怎样跑起来的》 (第7、8章)—— 矢泽久雄

《深入理解Java虚拟机(第3版本)》(第6、7、8章)—— 周志明

《深入理解Android:Java虚拟机ART》(第2章) —— 邓凡平

推荐阅读

感谢喜欢!你的点赞是对我最大的鼓励!欢迎关注彭旭锐的Github!

java 平台无关_Java | 为什么 Java 实现了平台无关性?相关推荐

  1. java native 接口_Java本地接口--Java Native Interface (JNI)

    一.方法介绍 java native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法. java中,通过JNI(Ja ...

  2. eclipse java web乱码_JAVA and JAVA WEB with TOMCAT and ECLIPSE 学习过程中遇到的字符乱码问题及解决方法汇总(随时补充)...

    JAVA语言具有跨平台,unicode字符集编码的特点. 但是在开发过程中处理数据时涉及到的字符编码问题零零散散,尤其是处理中文字符时一不留神就可能出现一堆奇奇怪怪的符号,俗称乱码. 对于乱码,究其原 ...

  3. java循环变量_Java初学——Java入门变量 常量选择循环结构

    一.初识java 1.jdk的介绍 下载安装jdk 安装后会存在默认的安装路径 bin 目录:存放编译,运行 Java 程序的可执行文件 lib 目录:存放 Java 的类库文件 jre 目录:存放 ...

  4. java直接量_Java教程:Java直接量(字面量)

    Java教程直接量是指在程序中通过源代码直接给出的值,例如在int a = 5;代码中,为变量 a 所分配的初始值 5 就是一个直接量. 直接量的类型 并不是所有的数据类型都可以指定直接量,能指定直接 ...

  5. java序列化 反序列化_Java序列化– Java序列化

    java序列化 反序列化 Serialization in Java was introduced in JDK 1.1 and it is one of the important feature ...

  6. java获取屏幕截图_java 利用java运行时的方法得到当前屏幕截图的方法

    将截屏图片保存到本地路径: package com.test; import java.awt.AWTException; import java.awt.Dimension; import java ...

  7. java商品库管理_java实现超市商品库存管理平台

    本文实例为大家分享了java商品库存管理平台的具体代码,供大家参考,具体内容如下 1.完成超市商品初始化.创建商品,将商品添加到集合 2.显示来到超市能做的操作,也就是显示主菜单 3.根据接收到的功能 ...

  8. Java订单交易_Java实现获取105发卡平台的订单信息

    [Java] 纯文本查看 复制代码/** * unicode转字符 * */ public static String decodeUnicode(String theString) { char a ...

  9. java 父类 超类_Java超类-java.lang.object

    Java是面向对象的,Object是所有对象的超类(不是继承,也不是实现接口) Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 如 ...

最新文章

  1. 安卓端网页浏览过程中实时更新title的web实现
  2. HTTP 错误 500.19- Internal Server Error 错误解决方法
  3. python的numpy库的基本用法_python numpy库np.percentile用法说明
  4. c构造函数和析构函数_C ++构造函数,析构函数能力问题和答案(第2组)
  5. 2017.5.29-6.3 城市规划 思考记录(非常不容易)
  6. FPGA水滴穿石(目录篇)
  7. 全国计算机一级考试文稿演示题,计算机等级一级MS Office考试考题:第三套演示文稿题...
  8. 华为仿苹果字体_苹果手机和华为手机,同样的网络下为何我的手机网速这么差?...
  9. ubuntu cmakelists 配置海康 SDK
  10. 支持iphone的打印服务器,MAC苹果电脑系统 如何添加网络打印机(适用于Mac OS)
  11. 大数据杀熟行为10月1日起明令禁止!
  12. 瑞星木马防御专杀QQ,360,百度软件管家(见图为证!)
  13. JasperReport:数据填充和多种类别报表
  14. c语言练习----渔夫打鱼晒网
  15. JS仿写刮刮乐小例子
  16. golang后台管理系统Iris+Layui框架搭建教程
  17. 关闭git命令窗快捷键_zsh中git的快捷命令
  18. CPU 运行频率监控
  19. iVX低代码平台系列详解 -- 概述篇(一)
  20. 中文文本纠错神器Pycorrector是如何收获2000 Star的?

热门文章

  1. 2007年十大时尚流行发型
  2. 分享111个HTML个性简实模板,总有一款适合您
  3. 学系统集成项目管理工程师(中项)系列23b_信息系统集成及服务管理(下)
  4. 东声智能基于Handdle AI打造的深度学习缺陷检测应用实例
  5. HTML5系列代码:为文字设置描边效果文字发光
  6. wowmodelexplorer:游戏模式和坐骑
  7. 汇编实例5——大小写的转换
  8. <IBM DB2>《db2 常用命令 - 自用》
  9. php声明一个抽象类,如何在PHP中的非抽象类中声明抽象方法?
  10. 服装店老板一件衣服进价19,卖22,一骗子拿100买件,老板没零钱,去和别人调了100元,找了那人78元,第二天发现钱是假的,又赔了100,问老板总共赔多少