3

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

然后还有C、C++、Haskell等语言直接编译成native。

我的问题是,使用虚拟机(不依赖于操作系统)有什么好处?使用 VM 不只是创建一个额外的解释步骤,通过 [源代码 -> 字节码 -> 本机] 而不是 [源代码 -> 本机]?

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

编辑

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

编辑 2

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

“尽管 Python 在幕后使用了虚拟机,但从用户的角度来看,大部分时间都可以忽略这个细节。”

4

4 回答 4

5

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

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

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

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

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

于 2013-09-14T02:09:07.330 回答
1

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

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

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

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

于 2013-09-14T01:47:05.900 回答
0

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

让我们以Java为例。Java 被编译成字节码,这基本上是计算机要遵循的一组操作。但是,并非计算机中的所有处理器都以相同的方式理解同一组指令——也就是说,一组本机指令在计算机 A 上的含义可能与计算机 B 上的不同。

结果,运行了一个 VM,其中一个特定于每台计算机。这样,编写的 Java 字节码是标准化的,只有解释器必须工作才能将其转换为机器语言。

于 2013-09-14T01:46:28.323 回答
0

操作系统独立性是其中很大一部分,但您也可以从其他事物(例如 CPU)中获得抽象……只要有 JVM,相同的 Java 代码就可以在 ARM、x86 上执行,无需修改即可。

于 2013-09-14T01:46:52.177 回答