2016-09-19 75 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 –