2016-09-19 76 views
1

编译和运行一个简单的HelloWorld需要约1秒的Java。是否有绕过编译的Java解释器?

$ time javac HelloWorld.java 

real 0m0.659s 
user 0m1.203s <-- 1.2s 
sys  0m0.113s 

为了便于比较,Lua可以在大约0.002秒内完成相同操作。

在一些(诚然异常)的应用中,动态地生成的数以千计的短期运行的Java应用程序,以使得1秒可以转化为小时编译的。

我不知道是否有Java解释器完全绕过编译到*.class文件?

(我知道有Groovy的,但它不是Java的一个严格的超)

+0

一秒钟似乎太长。您可以将Java编译器用作JVM中的API,并且可以立即将生成的类加载到正在运行的JVM中。 –

+0

@MarkoTopolnik我看到0.7s的实时和1.2s的用户时间(据推测,由于多线程)。你可以大大低于编译器API的下面吗? – MaxB

+0

你在测试什么? 'javac'在命令行?当在JVM中使用时,我认为你可以有一个稳定的“热”设置,除了你正在编译的一个源文件之外,所有的东西都被加载。编译时间应该在毫秒内。 –

回答

1

所以,如果你的源语言是Java的,是不是真的有。有几个工具可以让你从REPL加载和解释Java,但是Java的语义实际上依赖于能够解决类关系等问题。但是,有些JVM语言可以在不进行预编译的情况下使用,例如Clojure,Scala和Groovy。

+0

Clojure启动起来非常慢。 –

+0

是的,源代码必须是Java。那些REPL工具是什么?他们是否绕过1s编译? – MaxB

+0

啊。 REPL是“read-eval-print loop”。在像Clojure,LISP或Groovy这样的语言中,有一个程序可以读*输入*作为程序评估*然后*打印*结果和*循环*回读。但是Java语言的结构意味着它需要以某种方式进行编译,即使你没有看到它。 您可能需要看看这个:https://repl.it/languages/java –