虚拟机的优势

Ari*_*des 3 language-agnostic jit operating-system bytecode vm-implementation

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

然后是 C、C++、Haskell 等直接编译为 native 的语言。

我的问题是,使用 VM(操作系统独立性之外)有什么优势?通过使用 [源代码 -> 字节码 -> 本机] 而不是 [源代码 -> 本机],使用 VM 是否只是创建了一个额外的解释步骤?

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

编辑

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

编辑 2

是的。查了一下。Python、Ruby 和 PHP 都使用中间表示,但根本不存储在单独的文件中,而是由 VM 直接执行。请参阅问题:Java“虚拟机”与 Python“解释器”用语?

“尽管 Python 在幕后使用了虚拟机,但从用户的角度来看,大多数时候人们可以忽略这一细节。”

Ali*_*Ali 5

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

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

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

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

PS [source-code -> byte-code] 部分没有问题,编译一次,与执行时间无关。我想您是在问为什么他们在可能的情况下不执行机器代码。