编译器之前编译代码,然后解释器/汇编器动态地将这些编译的指令转换为本机机器指令并运行它们。 在此过程中,解释器将时间转换为将代码转换为机器语言然后运行。 为什么我们不能让我们准备好运行机器指令的离线解释器,以便我们可以有更快的程序? 我知道内存位置仅在运行时已知,因此我们可以在准备运行的机器中使用一些偏移量
答案 0 :(得分:1)
Java旨在成为一种跨平台语言。你构建应用程序,你得到一个Jar。此时,正如您所说,您没有本机代码。要运行您的应用程序,您可以在Java虚拟机(JVM)中执行您的jar,这就是所有魔法发生的地方。只要您的平台上安装了有效的JVM,您就可以在Windows上编译Jar并在Linux或MacO上运行它。 JVM将根据您的平台而改变,您的代码不会。
答案 1 :(得分:1)
编译语言将您的高级代码转换为操作系统本机代码,因此,编译语言依赖于它将运行的环境,例如C,它可以从不同的系统编码,但每个都有自己的库,编译器和构建器。
解释将您的高级代码转换为解释器将执行的指令。解释器总是接受相同的指令,但最终,它必须在系统上调用一些本机代码。事情是:相同的代码可以跨系统重复使用,但是由于您没有直接执行本机代码,最终会失去性能,并且每个系统都需要实现自己的解释器,例如Python。
另一方面,Java是编译和解释的混合体。通过添加虚拟机(JVM),java确实在本机代码和高级代码之间添加了另一层。 Java代码首先编译为JVM本机代码。然后,JVM解释此代码,并能够将其解释为命令并调用本机代码,或者将该代码完全编译为要执行的本机程序。 JVM在执行过程中执行抽象,并且能够根据程序选择哪种类型的本机执行更快。是的,java总是比纯本机代码慢,但它可以比纯解释的快得多,而不会失去可移植性。缺点是每个系统都必须实现自己的JVM(这实际上只是Oracle和其他JVM提供程序的一个问题)。答案 2 :(得分:0)
考虑像这个javascript:
这样简单(和愚蠢)的东西var x = prompt('Enter some javascript code');
eval(x);
要编译这将需要编译器将ENTIRE javascript编译器嵌入到可执行文件中,否则eval()
无法工作。没有可能的优化,因为编译器不知道用户将作为他们的JS选择代码输入什么。也许它只是alert('Hi mom!')
,也许它将是一个500万行的x86 cpu模拟器。