使用虚拟机编译有哪些优点(例如JVM) 是否优于本机编译语言?

2022-09-02 04:17:04

我听说Java的优势在于人们可以编写代码,为JVM编译它,并在任何地方运行它。每个人只需要一个JVM应用程序即可用于他们的平台。

当然,它看起来与当前情况类似,每个人都有一个特定于其平台的编译器。因此,优势并不能用它来解释。但我想我看到了解释。问题一定是在Java情况下,你不能或不应该以操作系统特定的方式直接访问真实机器。

我想这意味着在其他语言中,代码本身必须根据运行它的计算机进行修改。

任何人都可以提供这方面的简短例子,比如一个Hello World程序来证明这一点?毫无疑问,它将在非java中,例如C

由于这不是在Hello World程序中经常发生的事情,也不是自从我在java上使用的书以来我看到的大多数事情,不幸的是,它们是“如何编程”风格的书籍,并且其中的所有内容都没有证明它(也许'因为他们不能或不想使用java来演示它!)。虽然他们吹嘘这是一个很大的优势。我想看看它的例子。


答案 1

...每个人都有一个特定于其平台的编译器。因此,优势并不能用它来解释。

移植用例如C或C++编写的代码几乎总是比简单地重新编译代码更复杂。这当然不是普通的非开发人员计算机用户可以轻松完成的事情。用编译语言编写的代码通常是针对特定操作系统(例如Win32 API)的API编写的,因此无法轻松地在其他操作系统上进行编译。

Java 字节码在有 Java 运行时环境可用的任何平台上运行。不需要重新编译代码。当然,你可以用Java编写特定于操作系统的代码,但是Java的标准库以及Web上可用的许多免费库提供了一个非常丰富的跨平台环境。

除了可移植性之外,在虚拟机上运行还有其他优点。Java 使用 JIT 编译器在运行时将 Java 字节码编译为本机机器代码。JIT 编译器可以对运行程序的特定 CPU 进行复杂的优化,并且它可以使用提前编译器无法使用的分析信息 - 原则上,JIT 编译器因此可以生成比“普通”编译器更优化的代码。

除了 Java VM 之外,还有其他虚拟机。例如,Microsoft .NET包含CLR(公共语言运行时)和LLVM,LLVM具有许多不同语言的前端,包括C和C++(并且应该将JIT编译的优势也带到C和C++)。


答案 2

除了JVM的优势之外,由于JIT编译器,它允许您以合理的性能独立于CPU架构执行代码,Java的一个基本优势是它不仅仅是一种编程语言,而是一个运行时环境,其API与它可以运行的所有底层平台通用(偶尔会有一些差异, 但它们往往是虫子)。

gcc例如,GNU Cross Compiler将允许您为或多或少的任何平台编译C代码。原则上,对于仅限于使用调用和其他一些调用的任何内容,这都没问题。但是,一旦您尝试使用更特定于操作系统的东西,您很快就会遇到麻烦,这往往会很快出现:GUI,一些I / O,线程,进程,网络。stdio.h

一旦你在C代码中获得一个或类似的代码,你将不得不重写部分代码以将其移植到Linux / OSX平台,其中一些工作可能不明显或直接可能。#include <win32.h>

Java的优势不仅在于它的虚拟机和在任何平台上读取和运行相同字节码的能力,还在于作为JRE一部分的相当大的库(例如J2SE)的可用性以及通用的线程和网络模型。


推荐