JVM系列第3讲:到底什么是虚拟机?

我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上安装。

为什么不同系统上的软件无法安装,这是因为操作系统底层的实现是不一样的。对于 Windows 系统来说,exe 后缀的软件代码最终编译成 Windows 系统能识别的机器码。而 Mac OSX 系统来说,dmg 后缀的软件代码最终编译成 Mac OSX 系统能识别的代码。

系统软件无法通用是一个常见的问题。但使用过 Java 的同学都知道,Java 代码可以在服务端(Linux 系统)运行,也可以在 Windows 系统运行,但我们并没有生成多份不同的代码。所以 Java 语言是如何做到的呢?

与其他语言不同,Java 语言并不直接将代码编译成与系统有关的机器码,而是编译成一种特定的语言规范,这种语言规范我们称之为字节码。无论 Java 程序要在 Windows 系统,还是 Mac OSX 系统,抑或是 Linux 系统,它首先都得编译成字节码文件,之后才能运行。

但即使编译成字节码文件了,各个系统还是无法明白字节码文件的内容,这时候就需要 Java 虚拟机的帮助了。Java 虚拟机会解析字节码文件的内容,并将其翻译为各操作系统能理解的机器码。

简单地说,对于同样一份 Java 源码文件,我们编译成字节码之后,无论是 Linux 系统还是 Windows 系统都不认识。这时候 Java 虚拟机就是一个翻译官,在 Linux 系统上翻译成 Linux 机器码给 Linux 系统听,在 Windows 系统上翻译成 Windows 机器码给 Windows 系统听。这样一来,Java 就实现了「Write Once,Run Anywhere」的伟大愿景了。

在 Java 虚拟机还没出现之前,为了支持软件在不同系统上运行,我们必须在多个平台写多份代码,分别对应特定的系统。但 Java 虚拟机出现之后,你只需要按照特定规范编译书写,编译器编译成字节码文件后,虚拟机会帮你将字节码生成对应的 Windows Code 和 Mac Code。本质上最终还是会生成 Windows Code 和 Mac Code 两份机器代码,但对于开发人员来说,却只需要写一次代码了。Java 虚拟机帮开发人员承担了重复的工作,让开发效率更高了。

很多初学者关于 Java 虚拟机有一个误区,他们会觉得 Java 虚拟机只能运行 Java 代码。但实际上 Java 虚拟机运行的是字节码文件。换句话说,如果你用 php 语言写一段代码,并自己用特定编译器能生成符合字节码规范的字节码文件,那么 Java 虚拟机也是可以运行的。

所以虽然名字是 Java 虚拟机,但 Java 虚拟机与 Java 语言没有直接关系,它只按照 Java 虚拟机规范去读取 Class 文件,并按照规定去解析、执行字节码指令,仅此而已。

如果你够牛逼,你完全可以写一个编译器,将 PHP 语言代码编译成符合 Java 虚拟机规范的字节码文件,那么 Java 虚拟机也是可以执行的。

准确地说,Java 虚拟机与字节码文件(Class文件)绑定。

最后,让我们回顾一下,到底什么是虚拟机?其实 Java 虚拟机就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LEo的网络日志

Windows平台使用PyInstaller将Python脚本打包成可执行文件

47290
来自专栏北京马哥教育

Linux初级运维常用命令面试问题

各位小伙伴快来看看这里的基础题目都能完全掌握嘛? 欢迎各路大神留言或投稿自己遇到的面试题目! 请小伙伴们先只看以下题目部分,自己先思考下答案!(不要偷看后面的答...

38350
来自专栏北京马哥教育

教你Python环境如何搭建

本次将向大家介绍如何在本地搭建Python开发环境。 Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 "pytho...

56890
来自专栏武军超python专栏

2018年7月31日学习ubuntu的基础操作命令和打包压缩解压缩

今天遇到的新单词: faith n 信用,信任 usage n 用法 upload n上传

18540
来自专栏极客慕白的成长之路

网站服务器修改SSH默认22端口

2.2K50
来自专栏抠抠空间

python并发编程之多进程(理论)

一、什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二、进程与程序的区别 程序:仅仅是一堆代 进程:是指打开程序运行的过程 三、...

45470
来自专栏java一日一条

HttpInvoker运作原理

HttpInvoker是常用的Java同构系统之间方法调用实现方案,是众多Spring项目中的一个子项目。顾名思义,它通过HTTP通信即可实现两个Java系统之...

16550
来自专栏MongoDB中文社区

使用mlaunch和m快速搭建MongoDB测试集群

不知道大家在使用MongoDB的时候有没有遇到突然想要一个集群但是手边又没有的时候?特别是我已经升级到4.0了,突然想要一个3.2的集群怎么办?然后去下载,改配...

13210
来自专栏人工智能LeadAI

深入理解并发/并行,阻塞/非阻塞,同步/异步

1、阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: ? 进程状态 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。各个...

42540
来自专栏晨星先生的自留地

面试中碰到的坑之包含漏洞专题

37760

扫码关注云+社区

领取腾讯云代金券