为什么需要编译Java代码,但JavaScript代码不需要编译

时间:2012-08-07 20:15:35

标签: java javascript compilation bytecode

为什么用Java编写的代码需要在JVM解释的字节代码中编译,但用JavaScript等语言编写的代码不需要编译,可以直接在浏览器中运行?

有没有简单的方法来理解这个?

这两种语言的编写方式之间的根本区别是什么,这可能有助于理解这种行为?

我不是CS学生,所以请原谅这个问题的天真。

4 个答案:

答案 0 :(得分:22)

从历史上看,JavaScript是一种解释型语言。这意味着解释器接受源代码并一步完成所有操作。这里的优点是简单性和灵活性,但解释器非常慢。编译器将高级语言转换为较低级语言,本机处理器或VM(在本例中为Java VM)可以直接执行。这要快得多。

现代浏览器中的JavaScript现在可以即时编译。因此,当加载脚本时,JavaScript引擎所做的第一件事就是将其编译成字节码然后执行它。从最终用户的角度来看,缺少整个编译步骤的原因是因为浏览器开发人员(谢天谢地)保持了未明确编译JavaScript的要求。

Java来自getgo是一种始终具有明确编译步骤的语言。但在许多情况下,这不再是真的。像IntelliJ或Eclipse这样的IDE可以动态编译Java,并且在许多情况下可以删除显式编译步骤。

答案 1 :(得分:3)

JavaScript和Java不是一回事。他们可能会分享一个相似的名字,但我会引用你JS guru - Douglas Crockford来帮助澄清他们真的根本不相关的事实。

现实情况是,没有什么可以阻止Java成为一种解释型语言,并且同样没有什么能阻止JavaScript成为一种编译语言(Chrome的javascript引擎确实进行了编译以提高速度,并且做得非常好)。

在浏览器的上下文中,Java以与Flash或Silverlight相同的方式运行 - 需要一个插件,浏览器充当该插件的主机;它托管Java运行时环境。

Javascript被设计为浏览器的脚本语言,这就是浏览器可以原生地理解它的原因。 浏览器实际上如何实现该代码的运行,完全取决于浏览器。也就是说 - 它可以纯粹在脚本级别运行,假设对下一行代码零知识并运行纯粹的基于软件的堆栈;或者它可以执行一些JIT以使代码更接近硬件并且(希望)提高速度。

答案 2 :(得分:2)

可以编译和解释任何语言。在这两种情况下,一个软件必须读取源代码,拆分它,解析它等,以检查某些要求,然后为程序的每个部分分配含义。唯一的区别是编译器然后继续生成具有(几乎)相同含义的另一种语言(JVM字节码,或JavaScript,或机器代码,或完全不同的东西)的代码,而解释器立即执行程序的含义。

现在,在实践中,它既简单又复杂。它在许多语言中更简单,更适合两者之一 - Java是静态类型的,并且关于程序含义的动态相对较少,所以你可以编译它,从而做一些本来需要的工作在运行时完成。 JavaScript是动态类型的,你不能在运行时之前决定很多事情(例如+是加法还是连接),因此编译不能提供很多性能。然而,编译器和解释器的混合(编译为简化的中间表示,然后解释和/或编译)在动态语言实现中越来越流行。然后就是现代JavaScript实现编译,事实上V8 从不解释任何东西。

答案 3 :(得分:0)

由于Java和Javascript之间编译级别的复杂性,Javascript存在一些限制。由于字节码是在为特定操作系统编写的JVM平台上执行的,因此硬件字节码执行对访问系统资源具有更多优势。甚至C代码也可以嵌入到Java字节码中。另一方面,由于Javascript仅在浏览器上运行,因此与它无关。

Java平台有两个主要部分。 Java编程语言和JVM。它使每个部分只关注自己的区域。这就是JVM不会使用Java编程语法的原因。它类似于运行C代码时链接不处理C代码而是处理程序集。

JVM平台中的字节码很可能是C语言中的一个程序集。

最终所有表示都转换为二进制表示,然后以某种方式转换为电子信号。它证明我们需要编程水平。