1

我们称java为平台无关,因为java有一个虚拟机JVM,它可以在任何平台上独立执行字节码。

但是 JVM 必须安装(或必须驻留在)该系统上。

现在,为什么人们不为其他现有语言创建像 JVM 这样的虚拟机并将这些语言称为平台无关?

4

3 回答 3

2

我可以想到几个原因:

很长

这需要时间。您基本上是在创建 2 种编程语言——高级语言和中间语言(字节码)。这意味着要考虑两种设计,编写编译器、词法分析器、链接器和所有附带的工具。没有人保证它会流行,尤其是因为它必须与 Java、C# 等成熟的版本进行比较。然后,您必须为那里的每个操作系统、每个文件系统和每个类似的变量依赖项编写代码(不是字面意思,但越多越好)。甚至 Oracle 的工作也不尽如人意,只看 I/O,我记得在发现 File#renameTo 非常不可靠之前,我一直在想我做错了什么。

你需要达到非常好的表现

这意味着,您必须在执行代码时编译和优化代码,而不会引起用户注意。就像第一次编译它(到字节码)是不够的。这不是你可以在一夜之间完成的事情。再一次,你必须击败 JVM、.NET、ART 以及更多已经存在的东西。

尽管如此,仍然有许多虚拟机,而且可能还有更多正在制作中。编译成已经创建的 VM 的字节码也更容易,所以你有例如与 JVM 一起工作的 Jython,但它的高级部分实际上(非常类似于)Python。

我会添加更多,因为我记得。

编辑:为了澄清这一点,因为您似乎混淆了术语:您不需要虚拟机来制作独立于平台的应用程序(您可以为每个操作系统编译它们等),并且并非每个虚拟机都可以在每个操作系统上运行(例如 . NET 仅适用于 Windows)。

于 2014-08-23T20:30:06.180 回答
2

平台独立性与拥有虚拟机没有直接关系。平台独立开发意味着您开发的软件可以在多个平台上运行。这也可以通过 C 或 C++ 来实现,例如在使用多平台库作为 QT 或 boost(无论您的目的是什么)时。必须提到的是,C 和 C++ 不能在虚拟机中运行。其他语言(如 Java)和 .Net 语言(如 C#)被翻译成字节码并在虚拟机中运行。要在不同的平台上运行字节码,您需要一个适用于这些平台的 VM。因此,必须为每个特定平台开发虚拟机。

而且你不能简单地为 C 创建一个虚拟机,它根本不考虑在 VM 中运行。您拥有两种语言:“直接”运行的语言和在 VM 中运行的语言。您可以使用这两种语言开发独立于平台的软件。简而言之:平台独立性与虚拟机没有直接关系(但当然,虚拟机不需要为每个平台编译一次代码,只需要一次编译,并允许在拥有该虚拟机的所有平台上直接执行,因此拥有虚拟机可以事情容易一些。)

于 2014-08-23T20:36:33.360 回答
2

大多数常见语言确实在虚拟机或解释器中运行,因此与平台无关,包括 Python、Ruby、Javascript 等。少数直接编译成机器的语言是更成熟的编译语言,例如古老的 C 和 C++。编辑:还有较新的 Rust 和 Go 语言。

与为其设计运行的特定系统优化的机器代码相比,虚拟机付出了性能损失。有关此问题的更多详细信息,请参阅此问题

于 2014-08-23T20:36:37.257 回答