VM的优点

时间:2013-09-14 01:43:01

标签: language-agnostic operating-system bytecode jit vm-implementation

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

然后有C,C ++,Haskell等语言直接编译为native。

我的问题是,使用VM有什么好处(在OS独立之外)?通过[源代码 - >来创建额外的解释步骤不使用VM字节码 - >原生的]而不仅仅是[源代码 - >天然]

为什么在可以直接编译时使用VM?

修改

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

编辑2

是的。看着它。 Python,Ruby和PHP都使用中间表示,但不是直接存储在单独的文件中,而是由VM直接执行。请参阅问题:Java "Virtual Machine" vs. Python "Interpreter" parlance?

  

“即使Python使用虚拟机,也可以使用   从用户的角度来看,大多数时候都可以忽略这个细节。 “

4 个答案:

答案 0 :(得分:4)

VM的一个优点是,在运行时修改代码的某些部分要容易得多,这称为Reflection。它带来一些优雅的能力。例如,您可以询问用户要调用哪个函数/类,并通过其STRING名称调用函数/类。在Java程序(可能还有一些其他基于VM的语言)中,用户可以在运行时中添加额外的库,并且库可以立即运行!

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

请注意,虚拟机并不总是解释代码,因此它并不总是比机器代码慢。例如,Java有一个名为 hotspot 的组件,它搜索经常调用的代码块,并用本机代码(机器代码)替换它们的字节码。例如,如果调用for循环,例如100次,则热点将其转换为机器代码,以便在下次调用中它将本机运行!这可以确保代码的瓶颈本机运行,而其余部分则具有上述优势。

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

P.S。 [source-code - >部分代码不是问题,它编译一次,与执行时间无关。我猜你会问为什么他们不能在可能的情况下执行机器代码。

答案 1 :(得分:1)

Python,Ruby和PhP不使用VM。然而,它们被解释了。

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

您列出的所有语言都被解释,所以我认为您可能实际要问的是解释语言和编译语言之间的区别。口译语言是跨平台的。这是最大的,主要的优势。您无需为它们运行的​​每组不同的硬件或操作系统编译它们,而是可以在任何地方使用它们。

传统上,编译语言的优点是速度和效率。

答案 2 :(得分:0)

因为VM允许在我的不同操作系统上运行相同的指令集(前提是它们具有interperetor)

我们以Java为例。 Java被编译成字节码,这基本上是一组计算机要遵循的操作。但是,并非计算机中的所有处理器都以相同的方式理解同一组指令 - 这意味着,计算机A上的一组本机指令意味着什么可能在计算机B上有所不同。

因此,运行VM,每台计算机都有一台VM。这样,编写的Java字节码是标准化的,只有解释器才能将其转换为机器语言。

答案 3 :(得分:0)

操作系统独立性是它的一个重要组成部分,但你也可以从CPU等其他东西中获取抽象......只要有适当的JVM,相同的Java代码就可以在ARM,x86上执行,无需修改。