首页 > 编程语言 >趣味解释Java虚拟机是啥玩意

趣味解释Java虚拟机是啥玩意

时间:2023-10-15 12:00:43浏览次数:37  
标签:看得懂 Java 操作系统 虚拟机 玩意 源程序 字节

下文通过生动形象的例子,帮助小伙伴们轻轻松松地理解Java虚拟机的基本作用。

大力:“为什么说Java语言是一种高级编程语言呢?”

卫琴:“之所以称Java为高级语言,是因为它和人类的语言有一点点相近。比如用Employee类表示员工,用name属性表示员工的姓名,用selfIntro()方法模拟员工的自我介绍行为,这都很符合人类的思维习惯。”

程序是交代电脑执行的一连串操作命令。可是,电脑作为硬件,只懂得由“1”和“0”排列组合成的机器指令语言。电脑无法直接看得懂用Java高级编程语言编写出来的源程序代码。

为了让电脑“看得懂”程序员编写的Java程序,需要借助Java语言的两个重要工具:

(1)Java编译器:把Java源程序编译成Java字节码。

(2)Java虚拟机:解析并执行Java字节码。

Java编译器会把Java源程序编译成Java字节码,对于Employee.java源文件,编译后的字节码位于Employee.class类文件中。

趣味解释Java虚拟机是啥玩意_源程序

Java编译器把Java源程序编译成Java字节码

Employee.class文件中的字节码用二进制指令来描述源程序,对普通的程序员而言,尝试阅读字节码,如同阅读外星人的文字一样困难,而且操作系统也无法看得懂字节码。

那么,到底谁会看得懂字节码呢?答案是Java虚拟机。字节码是为Java虚拟机量身定制的语言。在运行Java程序时,Java虚拟机会解析并执行这些字节码。

趣味解释Java虚拟机是啥玩意_字节码_02

Java虚拟机解析并执行Java类文件中的字节码

大力:“我大学里学的是小语种语言。本来还打算从事这种语言的翻译工作。这个Java编译器有点像翻译员,把Java源程序翻译成Java虚拟机看得懂的字节码。那为什么编译器不直接把Java源程序翻译成操作系统看得懂的二进制机器指令呢?”

卫琴:“你问的问题很好。C语言的编译器就是直接把源程序翻译成操作系统看得懂的可执行程序,可执行程序中包含了二进制机器指令。问题是,不同的操作系统使用的机器指令语言不一样。这就意味着在Windows操作系统中编译出来的可执行程序只有Windows操作系统能看得懂,并顺利执行它,而Linux完全无法理解它。如果要在Linux中运行程序,还需要在Linux中重新编译源程序。”


趣味解释Java虚拟机是啥玩意_源程序_03

用C语言编写的源代码需要在各个操作系统中进行编译

Java语言和其他高级语言(如C语言)的一个重要区别,就在于Java语言是跨越操作系统平台的语言。所谓跨平台,是指编译生成的Java类能够在任意的操作系统中运行。

卫琴:“Java语言之所以具有跨平台的本领,要归功于Java虚拟机。”

大力:“Java虚拟机的名字很玄乎!Java虚拟机看不见摸不着,到底是何方神圣?”

卫琴:“Java虚拟机可不是工厂里的庞大无比的机器,其实它本身也不过是个可执行程序,这个可执行程序的任务就是解析并执行Java程序。”

趣味解释Java虚拟机是啥玩意_源程序_04

Java虚拟机解析并执行Java程序

Java虚拟机程序本身的实现不是跨操作系统平台的,对于不同的操作系统,需要开发专门的Java虚拟机程序。不过,不管是哪个操作系统中的Java虚拟机,它们解析并执行Java程序的行为是一样的,都包含以下步骤:

(1)解析Java类文件中的字节码。

(2)把Java字节码翻译成底层操作系统能够理解的机器指令。

(3)由底层操作系统执行机器指令。

大力:“在神话故事中,许多神仙都有特定的坐骑,太上老君的坐骑是青牛精,观音菩萨的坐骑是金毛吼,牛魔王的坐骑是避水金睛兽。有了坐骑,神仙们就能上天下海,周游世界。Java虚拟机就像Java程序的坐骑。”

卫琴:“你的这个比喻很贴切形象。当Java程序乘坐在Java虚拟机上,就能在网络世界里畅通无碍,在如今流行的分布式的软件系统中独领风骚。无论是电脑上的Windows操作系统或Linux操作系统,还是手机上的Android操作系统,都能顺利地运行Java程序。”

趣味解释Java虚拟机是啥玩意_Java_05

Java虚拟机就像Java程序的坐骑,助力跨平台运行

上文参考孙卫琴的经典Java书籍《Java面向对象编程》

趣味解释Java虚拟机是啥玩意_Java_06

标签:看得懂,Java,操作系统,虚拟机,玩意,源程序,字节
From: https://blog.51cto.com/sunweiqin/7870614

相关文章

  • java——redis随笔——实战——商户查询缓存
                      把key做了下代码优化: /***根据id查询商铺信息*@paramid商铺id*@return商铺详情数据*/@OverridepublicResultqueryById(Longid){//key要唯......
  • java项目实践-webapp-mytomcat-day16
    目录1.http协议2.自定义的web框架3.具体实现4.启动1.http协议CS架构建立连接“三次握手”断开连接“四次挥手”三次握手:client:可以与你建立连接吗?server:可以的client:我也可以了四次挥手:client:我要断开server:可以断开server:我要断开client:可以断开双方都有......
  • java学习笔记day03
    java学习笔记day03数据类型public class 数据类型 {  public static void main(String[] args){    //整数类型    byte num1 = 10;    short num2 = 200;    int num3 = 3000;    long num4 = 400000L;    ......
  • JavaWeb-Maven的应用
    目录1.MavenPOM2.pom.xml内容MavenPOMPOM(ProjectObjectModel,项目对象模型)是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven会在当前目录中查找POM。它读取POM,获取所需的配置信息,然......
  • 从零开发一款图片编辑器(使用html5+javascript)
    最近开发了一个图片编辑器,类似于photoshop的网页版,源码参考自GitHub上,顺便也总结下使用html+js开发一个编辑器需要用到哪些知识点。预览地址:https://ps.gitapp.cngithub地址:https://github.com/photopea/photopea架构设计选型:jquery.js和blueimp-canvas.js都是强大的......
  • JAVA大文件(10G以上)的上传下载实现技术
    在现代互联网应用中,经常需要上传和下载大文件,如视频、音频、数据库备份等等。对于Java开发者来说,处理大文件上传下载是一个非常常见的需求。然而,由于Java内存限制和网络传输速度的限制,处理大文件上传下载需要一些特殊的技术。本文将介绍一种基于流的方式来实现Java大文件的上传和......
  • 深入理解 JavaScript 时间分片:原理、应用与代码示例解析
    JavaScript时间分片(TimeSlicing)是一种优化技术,用于将长时间运行的任务拆分为多个小任务,以避免阻塞主线程,提高页面的响应性和性能。本文将详细解释JavaScript时间分片的原理、应用场景,并通过代码示例帮助读者更好地理解和应用该技术。本文首发于:kelen.cc概念时间分片(TimeSl......
  • Javascript、axios、vue基础命令快速学习
    1.js:JavaScript基础学习JavaScript基础学习简单案例1.点击img1,则展示img1图片默认,点击img2则展示img2图片2.输入框鼠标聚焦onfocus后,显示小写toLowerCase(),失去焦点onblur后显示大写toUpperCase()3.点击全选按钮,所有复选框为被选中状态,点击反选则取消勾选状态JavaScrip......
  • 深入理解 python 虚拟机:GIL 源码分析——天使还是魔鬼?
    深入理解python虚拟机:GIL源码分析——天使还是魔鬼?在目前的CPython当中一直有一个臭名昭著的问题就是GIL(GlobalInterpreterLock),就是全局解释器锁,他限制了Python在多核架构当中的性能,在本篇文章当中我们将详细分析一下GIL的利弊和GIL的C的源代码。选择GIL......
  • JavaWeb-JDBC增删改查
    目录1.MySQL准备2.JDBC项目3.JDBC新增4.JDBC查询5.JDBC修改6.JDBC删除内容MySQL准备新建表t_personCREATETABLE`t_person`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键',`name`varchar(30)NOTNULLCOMMENT'姓名',`birthdate`datetim......