我正在自学编程语言理论,我想知道为什么我们需要一台Java虚拟机或任何虚拟机呢?根本原因是什么?
仅仅是为了让它成为多平台吗?如果是这样,为什么我们不能只为不同的平台提供独立于平台的语言和不同的编译器?
答案 0 :(得分:6)
在1996年的白皮书The Java Language Environment中,Sun的Java团队为Java语言指出了以下design goals:
Java TM编程语言的设计要求是由必须部署软件的计算环境的性质驱动的。
互联网和万维网的大规模发展使我们以全新的方式看待软件的开发和分发。为了生活在电子商务和分销领域,Java技术必须能够在异构的分布式网络中的多个平台上开发安全,高性能和高度健壮的应用程序。
在异构网络中的多个平台上运行会使传统的二进制分发,发布,升级,补丁等方案无效。为了在这个丛林中生存,Java编程语言必须是架构中立,可移植和动态适应的。
为满足这些需求而出现的系统是简单,因此大多数开发人员都可以轻松编程; 熟悉,以便当前的开发人员可以轻松学习Java编程语言; 面向对象,利用现代软件开发方法并适应分布式客户端 - 服务器应用程序; 多线程,用于在需要执行多个并发活动的应用程序中实现高性能,例如多媒体;和解释,以获得最大的可移植性和动态功能。
更进一步,他们更详细地解决了使用口译员的原因:
Java解释器可以直接在已移植解释器和运行时系统的任何机器上执行Java字节码。在诸如基于Java技术的系统之类的解释平台中,程序的链接阶段是简单的,增量的和轻量级的。您可以从更快的开发周期中受益 - 与传统的重量级编译,链接和测试周期相比,原型设计,实验和快速开发是正常情况。
虽然Java编译器在编译时静态检查方面是严格的,但语言和运行时系统在其链接阶段是动态的。类仅在需要时链接。新代码模块可以根据需要从各种来源链接,甚至可以从网络中的来源链接。对于HotJava浏览器和类似应用程序,可以从任何地方加载交互式可执行代码,从而实现应用程序的透明更新。结果是不断发展的在线服务;他们可以保持创新和新鲜,吸引更多客户,并促进互联网上电子商务的发展。
答案 1 :(得分:3)
为什么我们不能只为不同的平台提供独立于平台的语言和不同的编译器?
好。如果我在16位机器上编写线性搜索程序(使用任何语言编写..),使用16位编译器编译它然后尝试在32位机器上运行它会怎么样?它的行为方式是否相同?。
想象一下拥有数百万行代码的产品。您是否认为由于机器架构的变化,百万行代码中的任何内容都不会中断?
现在,
虚拟机:这些基本上是用于将指令转换为“机器理解/操作系统理解语言”的软件。它们位于您的操作系统之上并对其进行调用,即让操作系统了解您的应用程序需要的内容。
JVM:是一种用于Java的虚拟机。当你编写和编译一个java程序时,它将处于“几乎与机器无关”的状态。这称为字节代码。您可以将它带到另一台机器上并运行/解释它。
答案 2 :(得分:2)
是否适用于平台可移植性?是。您已经了解了JVM的大部分显而易见的特性及其优势,其他人已经做出了出色的回应。
在这里,我将添加虚拟机提供的优势的人性化方面。它主要用于易于开发和达到。
将C视为平台无关语言的示例,其中包含特定操作系统的特定编译器。可以在Linux和Windows上使用C编写代码。但是,您需要额外的库头文件conio.h才能在Windows系统上运行相同的程序。
现在,如果需要在每个系统(具有不同的硬件和软件)上重新编译大量的内容源代码程序和应用程序套件,则需要它们在每个编译器上反复重新编译相同的代码。如果开发人员错过了对该系统的编译,这可能会将某些系统作为可能的目标,。
这实际上发生在游戏行业中,某些游戏只是没有编译并为某些系统构建(比如大多数高端游戏都不是为Linux制作的)。游戏工作室每次都需要为他们想要的每台目标机器编译,如Wii,PS3,PS4,PC,XBOX等。
浪费时间,精力,资源和理智(特别是当您处理超大量异构文件类型和源代码时,需要花费大量时间编译)。
总之;它是为了减少每个系统的相同源代码的重复重新编译,这样我们的程序员就可以专注于值得我们时间的事情。 [或者我们只是懒惰;)]
附录:
根据Perl编程语言的原作者Larry Wall的说法,程序员有三大优点;懒惰,急躁和傲慢。 Link
答案 3 :(得分:1)
Java虚拟机(JVM)是运行字节代码的平台或沙箱。字节代码具有特殊的指令集和操作,只能由JVM识别。
对于需要特定操作集的任何虚拟机,情况都是如此。
答案 4 :(得分:1)
虚拟机是一种重要的抽象,用于简化语言开发和实现。
大量语言使用某种虚拟机来执行它们。动态脚本语言(如Ruby和Python)在运行时在简单虚拟机上进行解释。这样做的好处是,如果可以重新编译解释器以在给定环境中运行,那么语言本身也可以在该环境中使用。
其他语言(如Java)可以提前编译为字节码,然后将其解释或即时(JIT)编译以供执行。在此模型中,只需要将虚拟机本身(而不是编译器)移植到任何给定环境以在其中运行代码。 Java通过允许将应用程序嵌入到网页中来实现这一点。
即使在这些更动态的语言之外,虚拟机也可用于抽象出底层硬件的细节。例如,低级虚拟机(llvm)编译器的设计使得它首先将C,C ++,Objective-C或其他任何内容编译为在虚拟机体系结构上运行的指令,然后将其转换为真实的机器代码。这种转换可以直接完成,就像传统的C或C ++编译器一样,或者在运行时使用JIT编译。
这些不同类型的虚拟机在不同的抽象层次上工作。正如其名称所示,llvm虚拟机的级别非常低。它抽象了CPU架构的不同特性,例如如何加载和存储浮点数,是否应该在堆栈或寄存器中传递等等。然而,诸如Python之类的语言的虚拟机正在抽象操作系统API和类似的东西。