2012-08-07 118 views
16

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

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

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

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

+3

JavaScript由浏览器解释,而不是由计算机的实际硬件(如C程序集)解释。 – thatidiotguy 2012-08-07 20:18:17

+2

@thatidiotguy wat。目前JavaScript很少被解释(Chrome的名气V8甚至没有*解释器),“C程序集”根本没有任何意义,而且汇编代码根本不被执行,它只是简单地变成机器码。虽然我不得不给你实现机器码的道具也只是在一天结束时解释。 – delnan 2012-08-07 20:27:18

+1

[编译与解释语言]可能的重复(http://stackoverflow.com/questions/3265357/compiled-vs-interpreted-languages) – jbabey 2012-08-07 20:30:22

回答

19

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

现代浏览器中的JavaScript现在即时编译。所以当脚本被加载时,JavaScript引擎所做的第一件事就是将它编译成字节码,然后执行它。从最终用户的角度来看,整个编译步骤缺失的原因是因为浏览器开发人员(幸好)维护了JavaScript没有明确编译的要求。

Java是getgo的一种语言,它总是有一个明确的编译步骤。但在很多情况下,这不再是事实。像IntelliJ或Eclipse这样的IDE可以即时编译Java,并在很多情况下删除显式编译步骤。

3

JavaScript和Java不是一回事。他们可能会分享一个类似的名字,但我会将您推荐给JS guru - Douglas Crockford以帮助消除他们根本不相关的事实。现实情况是没有什么能够阻止Java成为一种解释型语言,同样也没有什么能够阻止JavaScript成为一种编译语言(Chrome的JavaScript引擎确实可以编译来提高速度,并且做得很好)。

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

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

2

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

现在,实际上它既简单又复杂。在许多语言中,更简单的是可以更好地适应其中的一种语言 - Java是静态类型的,并且对于程序的意义而言,动态性相对较弱,因此您可以编译它,从而完成一些本来需要完成的工作运行。 JavaScript是动态类型的,你不能在运行时决定很多事情(比如+是加法还是串联),所以编译并不能提供很多性能。然而,编译器和解释器的混合(编译为简化的中间表示,然后解释和/或编译)在动态语言实现中越来越受欢迎。然后有一个事实,即现代JavaScript实现编译,事实上V8 从来没有解释任何东西。

0

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

在Java平台上有两个主要部分。 Java编程语言和JVM。它使每个部分只关注他们自己的领域。这就是为什么JVM不会使用Java编程语法进行降级的原因。它类似于运行C代码链接时不处理C代码但汇编。

字节码在JVM平台很可能在C.

的组装最终所有表示被转换成二进制表示,然后将electirical信号以某种方式。它证明我们需要编程水平。

+0

C代码不能嵌入到JVM代码中。那么,它可能可以但它不会被执行。 CLR确实允许“不安全”的代码,但这是完全不同的事情。另外,关于JS和外部世界,请参阅V8,node.js和common.js。 – delnan 2012-08-07 20:29:47

+0

我的意思是使用JNI。你可以调用目标文件中的任何方法(dll,so) – 2012-08-07 20:31:02

+0

好的,这是真的(尽管我不会称它为“嵌入在java字节码中”)。但是你也可以通过任何JavaScript引擎公开本地代码。 – delnan 2012-08-07 20:32:36