Language agnostic 虚拟机的优势

Language agnostic 虚拟机的优势,language-agnostic,operating-system,bytecode,jit,vm-implementation,Language Agnostic,Operating System,Bytecode,Jit,Vm Implementation,我遇到的大多数语言都使用虚拟机或虚拟机。Java(JVM)、Python、Ruby、PHP(HHVM)等语言 然后有语言,如C、C++、Haskell等,它们直接编译为Nut. 我的问题是,使用VM(操作系统独立性之外)有什么好处?使用虚拟机不是只是创建一个额外的解释步骤,通过使用[source code->bytecode->native]而不是仅仅使用[source code->native]吗 既然可以直接编译,为什么要使用VM 编辑 我的理解是,Python、Ruby等使用类似于VM的东

我遇到的大多数语言都使用虚拟机或虚拟机。Java(JVM)、Python、Ruby、PHP(HHVM)等语言

然后有语言,如C、C++、Haskell等,它们直接编译为Nut. 我的问题是,使用VM(操作系统独立性之外)有什么好处?使用虚拟机不是只是创建一个额外的解释步骤,通过使用[source code->bytecode->native]而不是仅仅使用[source code->native]吗

既然可以直接编译,为什么要使用VM

编辑

我的理解是,Python、Ruby等使用类似于VM的东西,如果不完全符合这样的定义,脚本将编译为中间表示(对于Python,例如.pyc文件)

编辑2

是的。我查过了。Python、Ruby和PHP都使用中间表示,但它们不是存储在单独的文件中,而是由VM直接执行。见问题:

即使Python在幕后使用虚拟机,从 从用户的角度来看,大多数情况下可以忽略此细节。”


因为虚拟机允许同一组指令在我的不同操作系统上运行(前提是它们有interperter)

让我们以Java为例。Java被编译成字节码,字节码基本上是计算机要执行的一组操作。然而,并非计算机中的所有处理器都以相同的方式理解同一组指令——这意味着,一组本机指令在计算机A上的含义在计算机B上可能有所不同


因此,运行一个VM,每个计算机都有一个特定的VM。通过这种方式,编写的Java字节码是标准化的,只有解释器才能将其转换为机器语言。

操作系统独立性是其中的一个重要部分,但您还可以从其他方面(如CPU)获得抽象。。。只要有JVM,同样的Java代码可以在ARM、x86上执行,而无需修改。

Python、Ruby和PhP不使用虚拟机。然而,它们是被解释的

回答您的实际问题:Java利用VM来增加操作系统/硬件与正在执行的代码之间的距离。目标是安全性和耐性(耐性意味着代码对系统中其他进程产生厌恶影响的可能性较低)

您列出的所有语言都是解释的,所以我认为您实际上可能想问的是解释语言和编译语言之间的区别。解释语言是跨平台的。这是最大的,也是最主要的优势。您不需要为它们操作的每一套不同的硬件或操作系统编译它们,相反,它们将在任何地方都可以工作


传统上,编译语言的优势在于速度和效率。

虚拟机的优势在于,在运行时修改代码的某些部分要容易得多,这就是所谓的。它带来了一些优雅的功能。例如,您可以询问用户要调用哪个函数/类,并通过其字符串名称调用该函数/类。在Java程序(可能还有其他一些基于VM的语言)中,用户可以在运行时向程序添加额外的库,并且库可以立即运行

另一个优点是能够使用高级垃圾收集,因为字节码的结构更容易分析

请允许我注意,虚拟机并不总是解释代码,因此它并不总是比机器代码慢。例如,Java有一个名为hotspot的组件,它搜索经常调用的代码块,并用本机代码(机器代码)替换它们的字节码。例如,如果一个
For
循环被调用了100多次,hotspot会将其转换为机器代码,以便在下一次调用中它会以本机方式运行!这确保了只有代码的瓶颈在本地运行,而其余部分则考虑到了上述优势

另外,将代码直接编译为本机代码并非不可能。许多基于VM的语言都有编译器版本(例如,有一个PHP编译器:)。但是,请记住,通过将整个程序编译为本机代码,您将禁用上述某些功能

注意,[源代码->字节码]部分不是问题,它只编译一次,与执行时间无关。我想你是在问为什么他们在可能的情况下不执行机器代码