平台无关性和语言无关性的记录

目录

背景

平台无关性

语言无关性


背景

        最近在学习Java虚拟机(JVM: Java Virtual Machine),在学习过程中,再一次学习了JVM的平台无关性这一特性,此外也了解到了虚拟机的另外一种中立特性 --- 语言无关性,下面进行简单介绍:

平台无关性

        我们都知道Java语言一直以“一次编写,到处运行(Write Once, Run Anywhere)”著称,那么为什么Java语言可以有这样的特性呢?我们来聊一聊。

        任何语言(包括高级语言和低级语言)想要被计算机执行,都必须被最终转换成计算机可以识别的二进制格式(即:把我们编写的程序编译成二进制本地机器码 Native Code),即计算机只认识的0和1。

        假如没有JVM,我们来看看Java程序如何在计算机上运行起来:

        设想这样一个场景,小明在Windows电脑上使用Java编写了一个程序,然后使用Java语言的编译器直接把Java源代码编译成Windows操作系统和其对应的硬件平台上的二进制本地机器码(Native Code),然后Windows电脑就可以运行我们写的程序了。如下图:

        这时小明又装了一个linux系统,他想把上面编译好的二进制字节码放到Linux系统中运行,如下图:

         那么只能针对Linux系统,再开发一个针对Linux系统上的Java语言编译器,把Java源码编译成Linux硬件平台可以识别并执行的二进制字节码指令,如下图:

        那么问题来了,如果再有另一个操作系统呢,还需要再针对这个操作系统再开发一个编译器?那么我们为什么不这样呢?如下图:

         上图说明了一件事,Java语言是平台无关性的语言,而这个平台无关性是由不同平台对应的Java虚拟机,即JVM来支撑的。换句话说,Java虽然是平台无关的,但是虚拟机(JVM)却是平台相关的,即不同操作系统需要对应不同的JVM。如下图是Oracle官网提供的不同操作系统对应的JDK,JDK里面包含了JVM:

        下面在总结下Java的平台无关性是怎么实现的。

        已经知道在计算机中真正执行的是由0和1组成的二进制文件。而我们通常开发使用的C,C++和Java等都是高级语言,如果要让计算机识别Java代码,就需要把Java开发的源程序“翻译”成二进制机器码,这个"翻译"的过程称为编译。执行编译这一过程的工具叫编译器。在Java中,要把Java代码编译成二进制字节码,需要经过两个步骤:(1)前端编译和后端编译。

        前端编译主要指和源语言有关但和目标机器无关的部分,比如我们熟悉的javac,以及Eclipse,Idea等IDE中内置的前端编译器,都是为了把xxx.java源码编译成.class字节码。

        后端编译就是将中间代码翻译成机器码,在Java中,这一步是通过JVM实现的。所以,虽然Java是平台无关的,但是虚拟机却是平台相关的,不同操心系统需要对应不同的JVM。 

语言无关性

        Java虚拟机除了具有平台无关性的特性外,还有另外一种中立特性:语言无关性。在Java技术发展之初,设计者们就曾经考虑过并实现了让其他语言运行在Java虚拟机之上的可能性,他们在发布规范文档的时候,也刻意把Java的规范拆分成了《Java语言规范》(The Java Language Specification)及《Java虚拟机规范》(The Java Virtual Machine Specification)两部分。如今,商业企业和开源机构已经在Java语言之外发展出一大批运行在Java虚拟机之上的语言,如Kotlin, Clojure, Groovy, JRuby, JPython, Scala等。

        实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class 文件” 这种特定的二进制文件格式所关联,Class文件种包含了Java虚拟机指令集、符号表以及若干其它辅助信息。 

        基于安全方面的考虑,《Java虚拟机规范》种要求在Class文件必须应用许多强制性的语法和结构化约束,但图灵完备的字节码格式,保证了任意一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。作为一个通用的、与机器无关的执行平台。任何其它语言的实现者都可以将Java虚拟机作为他们语言的运行基础,以Class文件作为他们产品的交付媒介。例如使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其它语言的编译器一样也可以把他们的源程序代码编译成class文件。虚拟机丝毫不关心Class的来源是什么语言,它与程序之间的关系如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/823353.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全】upload靶场pass1-10思路

目录 Pass-1 Pass-2 Pass-3 Pass-4 Pass-5 Pass-6 Pass-7 Pass-8 Pass-9 Pass-10 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN&#x1…

GBASE南大通用-GBase 8s分片表操作 提升大数据处理性能

目录 一、GBase 8s分片表的优势 二、六种分片方法 轮转 1.轮转法 基于表达式分片 2.基本表达式 3.Mod运算表达式 4.Remainder关键字方式 5.List方式 6.interval 固定间隔 三、分片表的索引 1.创建索引的注意事项 2.detach索引替代delete功能展现 3.在现有分片表上增加一个新…

PostgreSQL 作为向量数据库:入门和扩展

PostgreSQL 拥有丰富的扩展和解决方案生态系统,使我们能够将该数据库用于通用人工智能应用程序。本指南将引导您完成使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序所需的步骤。 我们将从pgvector 扩展开始,它使 Postgres 具有特定于向量数据库…

Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合函数的使用、Lambda条件查询

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 查询方法详解 普通查询 // 根据主键id去查询单个结果的。 Test public void selectById() {User user userMapper.selectById(1739970502337392641L);System.out.print…

Games101作业5

1.实现Renderer.cpp 中的 Render():为每个像素生成光线 这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 我们要做的就是将屏幕空间下的坐标最后转换到世界空间的坐标…

Linux CPU 数据 Metrics 指标解读

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息,本文我们详解解读和标注一下各个数据项的含义,同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识,很多查看CPU的命令行工具都是 cat /proc/stat 里的数据,所…

城市自贸区/经开区/产业园基于EasyCVR视频技术的可视化、移动化、智能化视频监管方案

一、背景需求 移动互联网的发展激发了用户对轻应用的使用习惯。4G、5G使得无线带宽快速提升,令大流量视频数据流逐渐从PC往手持终端转移。借助智能手持终端也可以实时查看、远程控制、存储录像、抓拍图像,能方便快捷地掌握所关注区域的视频动态。 随着…

【面试】 Maven 的八大核心概念

Maven 的八大核心概念 在这里,举出这个标题,自然大家知道Maven是干啥的,就不过多进行赘述!我们主要对于Maven的八大核心概念做一个解释补充,这也是我自己的一个学习历程,我们一起共勉! 文章概述…

【代码随想录】刷题笔记Day42

前言 这两天机器狗终于搞定了,一个控制ROS大佬,一个计院编程大佬,竟然真把创新点这个弄出来了,牛牛牛牛(菜鸡我只能负责在旁边喊加油)。下午翘了自辩课来刷题,这次应该是元旦前最后一刷了&…

【教程】Typecho Joe主题开启并修复壁纸相册不显示问题

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 Joe主题本身支持“壁纸”功能,其实就是相册。当时还在网上找了好久相册部署的开源项目,太傻了。 但是网上教程很少,一没说如何开启壁纸功能,二没说开启后为…

【数据结构复习之路】查找(严蔚敏版)万字详解

专栏:数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】【树和二叉树】【图】,我们接着复习 查找,这篇文章我写的非常详细且通俗易懂,看完保证会带给你不一样的收获。如果对你有帮助,看在…

鸿蒙HarmonyOS-带笔锋手写板(三)

笔者用ArkTS 写了一个简单的带笔锋的手写板应用,并且可以将手写内容保存为图片。 一、效果图 手写效果如下(在鸿蒙手机模拟器上运行,手写时反应可能会有点慢) 二、实现方法 参考文章: 支持笔锋效果的手写签字控件_a…

精品Nodejs实现的校园疫情防控管理系统的设计与实现健康打卡

《[含文档PPT源码等]精品Nodejs实现的校园疫情防控管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 操作系统:Windows 10、Windows 7、Win…

【Linux操作系统】探秘Linux奥秘:操作系统的入门与实战

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS …

共享单车之数据存储

文章目录 第1关:获取工作簿中的数据第2关:保存共享单车数据 第1关:获取工作簿中的数据 相关知识 获取工作簿中的信息,我们可以使用Java POI(POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能&#…

用通俗易懂的方式讲解大模型:HugggingFace 推理 API、推理端点和推理空间使用详解

接触 AI 的同学肯定对HuggingFace[1]有所耳闻,它凭借一个开源的 Transformers 库迅速在机器学习社区大火,为研究者和开发者提供了大量的预训练模型,成为机器学习界的 GitHub。 在 HuggingFace 上我们不仅可以托管模型,还可以方便…

Linux文件系统结构及相关命令2 什么是Shell? help cd cd的用法 ls 的用法

Shell 是一种用于与操作系统进行交互的命令行解释器。它是用户与操作系统内核之间的接口,接受用户的命令并将其传递给操作系统进行执行。 在大多数的 Unix-like 操作系统(如 Linux 和 macOS)以及类 Unix 系统中,Shell 是默认的命…

关键字:abstract关键字

在 Java 中,abstract是一个关键字,用于修饰类和方法。当一个类被声明为抽象类时,它不能被实例化,只能被其他类继承。同时,抽象类可以包含抽象方法,抽象方法没有方法体,只包含方法的签名&#xf…

HackTheBox - Medium - Linux - Interface

Interface Interface 是一种中等难度的 Linux 机器,具有“DomPDF”API 端点,该端点通过将“CSS”注入处理后的数据而容易受到远程命令执行的影响。“DomPDF”可以被诱骗在其字体缓存中存储带有“PHP”文件扩展名的恶意字体,然后可以通过从其…

刷到 LeetCode 这个评论,被笑到了!

大家好,我是闭着眼睛学算法。 今天早上我在 LeetCode 第 141 号问题 环形链表 的评论区中发现了一个称得上是天秀的解法,简直太骚气了,忍不住分享给大家。 首先给没有见过这道题目的小伙伴补充一下前置知识, 环形链表这道题目讲的…