使用虚拟机编译(例如JVM)相对于本机编译语言有什么好处?

bar*_*lop 17 c java pascal qbasic

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

当然,它看起来类似于当前的情况,每个人都有一个特定于他们平台的编译器.因此没有解释这个优点.但我认为我看到了解释..问题必须是在java情况下,你不能或不想以特定于操作系统的方式直接访问真机.

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

任何人都可以提供一个简短的例子,就像一个演示这个的Hello World程序吗?毫无疑问,它将在非Java中,例如C.

因为它不是通常在Hello World程序中发生的事情,或者是我在java上使用过的书籍以来最常见的事情,所以不幸的是"如何编程"样式书,而且其中的所有内容都没有演示它(也许'他们不能或不想用java来演示它!).虽然他们大肆宣扬它是一个很大的优势.我想看看它的例子.

Jes*_*per 9

...每个人都有一个特定于他们平台的编译器.因此没有解释这个优点.

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

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

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

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


bar*_*lop 0

我整理了一些答案..

\n\n

虽然我还没有测试过它们..我从答案中看到了对我来说有意义的好例子

\n\n

Bruno 提供了一个 C 语言的例子

\n\n

#include <win32.h>(必须为不同的操作系统重写特定于操作系统的行和代码)\n仅限于使用 stdio.h 和其他一些(可移植)中的调用的内容

\n\n

加里(Gary)谈到了一个与 int 的案例。在C中,“int在32位机器上是32位。在64位机器上是64位”“可移植的方法是使用int32_t”以及关于C和汇编语言的一点..我问过周围发现,如果超过限制,它会循环回 0。因此,这将是代码在不同系统和编译上具有不同效果的情况,但可能无法按预期工作,并且必须被重写。

\n\n

Thorbj\xc3\xb8rn 提供了不同 CPU 上的汇编语言示例的链接。Win32 ASM 适用于 32 位 CPU,Win64 适用于 64 位。每个文件都有一个 hello world 示例,并表示转换它们并不容易,因为“在 Win32 中,所有参数都是通过堆栈传递的,但在 Win64 中它们是通过寄存器传递的。” 他说它使用不同的指令..\n我想也许它的意义不止于此,如果它是不同的汇编语言..\n而汇编语言是一个明显的不可移植性的情况..因此我问题中没有提到它,但很高兴看到该链接上的示例。拥有这些知识是很好的。很高兴看到一些当代的汇编语言而不是晦涩的机器。

\n