Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对解释性语言的优势感到困惑_Java_Interpreter_Interpreted Language - Fatal编程技术网

Java 对解释性语言的优势感到困惑

Java 对解释性语言的优势感到困惑,java,interpreter,interpreted-language,Java,Interpreter,Interpreted Language,我对像java这样的解释语言相对于编译语言的优势感到困惑 解释语言(如java)优于编译语言的标准解释是,相同的.class文件可以在不同类型的机器架构上运行。这怎么帮你省下工作 对于每个不同的机器体系结构,您不需要不同的编译器来将相同的.class文件解释为机器语言吗?因此,如果您需要为每个不同的机器体系结构使用不同的编译器来将相同的.class文件解释为机器代码,这将如何节省您的工作 为什么不制作一种编译语言,将.java源文件立即编译成机器语言呢。当然,这需要一个不同的编译器来从java源

我对像java这样的解释语言相对于编译语言的优势感到困惑

解释语言(如java)优于编译语言的标准解释是,相同的.class文件可以在不同类型的机器架构上运行。这怎么帮你省下工作

对于每个不同的机器体系结构,您不需要不同的编译器来将相同的.class文件解释为机器语言吗?因此,如果您需要为每个不同的机器体系结构使用不同的编译器来将相同的.class文件解释为机器代码,这将如何节省您的工作

为什么不制作一种编译语言,将.java源文件立即编译成机器语言呢。当然,这需要一个不同的编译器来从java源文件编译到每台机器架构的机器语言,但是这比从.class文件编译到机器语言的每台机器都需要一个不同的编译器有多大的工作量呢

我的意思是,这与编译语言相同——无论是将java源文件编译成机器代码还是将类文件编译成机器代码,每个机器体系结构都需要一个编译器


谢谢

首先,Java是一种编译语言,也是一种解释语言,因为您必须从.Java编译到.class

为了回答您的问题,Java通过(某种程度上)解释而获得的优势是,您只需要编译每个程序一次,并且它可以在任何计算机上运行,因为Java运行时环境(JRE)可以在不需要(或只需最少)的情况下,提前编译以匹配本地操作系统和体系结构,从而弥合这一差距进一步汇编

然而,在一种不令人费解的语言中,您必须为每个操作系统和要运行它的每个体系结构编译每个程序,这需要比只为每个操作系统和体系结构编译一次JRE和只编译每个程序一次多得多的工作和总编译时间

让一种语言在每次运行时都针对本地体系结构进行编译是不切实际的,因为编译是一个相当密集的过程。Python在每次运行时都会编译(不过,与Java一样,它是为运行时环境而编译的,而不是为本地体系结构编译的),而且它是速度最慢的语言之一


希望这有助于澄清问题。

我喜欢SOURD299的答案。我的两分钱:

  • 在技术上,您有无数不同的目标体系结构
  • 因此,同时为所有目标编译代码并将其打包在一起将产生一个无限大的可执行文件
  • 因此,根据虚拟机字节码编译Java是一个更好的解决方案:因为它只有一个目标体系结构
  • 虽然开发人员可以为所有新的和旧的体系结构分别添加JVM,但允许所有新的东西(比如Raspberry PI)运行上个世纪编译的java代码
另一方面,“提前编译多个目标”并不是一件完全疯狂的事情。Afaik Windows Universal Apps是这样工作的:它是同一个exe文件中的同一个应用程序,但实际上exe包含为80x86和ARM目标编译的代码。这样一来,一个应用程序看起来可以在windows mobile和桌面解决方案之间移植,而无需进一步解释

对于每种不同的机器架构,您不需要不同的 编译器将相同的.class文件解释为机器语言? 因此,如果您需要为每台不同的机器使用不同的编译器 将相同的.class文件解释为机器代码的体系结构,如何 这能帮你节省工作吗

上述说法是你的核心误解

应用程序开发人员编写编译成字节码的Java代码,这些字节码可以在任何兼容的Java虚拟机上运行

Java虚拟机解释(并可能编译)这个字节码并执行应用程序。这些JVM是为主要的体系结构和操作系统开发的,例如英特尔上的Windows/Mac/Linux。JVM开发人员是一个相对较小的工程师群体,例如Oracle和Sun的工程师

从应用程序开发人员的角度来看,他或她只需要编译一次,因为字节码(在.class文件中)可以在兼容的JVM上执行。应用程序开发人员不需要担心底层架构或操作系统;它们只需要针对JVM的体系结构。JVM开发人员是处理底层的人。

首先,“Java被解释”的说法虽然有一定的事实依据,但很容易引起误解,如果你干脆从头脑中删除这个概念可能是最好的

Java在构建时从源代码编译为中间表示(类文件、字节码)。第一次加载类时,大多数JVM实现(包括Oracle HotSpot和IBM J9)都将经历一个短暂的解释阶段,但如果该类将以任何频率使用,则动态编译器(JIT)将运行并编译为本机代码。(有些JVM,如JRockit,直接转到本机而不需要解释器。)

我认为“为什么Java不直接编译成本地代码”是这里真正的问题。正如其他人所说,显而易见的答案是可移植性。但它比这更微妙:动态编译比静态编译产生更高质量的代码。当代码被动态编译时,JIT知道静态编译器无法知道的事情:当前硬件的特性(CPU版本、步进级别、缓存线大小等),以及当前运行的属性(感谢在解释过程中收集的分析数据)。您的决策质量取决于您的报告质量