2016-09-19 3 views
1

Kompilieren und Ausführen eines einfachen HelloWorld dauert etwa 1 Sekunde in Java.Gibt es Java-Interpreter, die die Kompilierung umgehen?

$ time javac HelloWorld.java 

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

Zum Vergleich kann Lua in etwa 0,002 Sekunden das gleiche tun.

In einigen (zugegebenermaßen ungewöhnlichen) Anwendungen werden Tausende von Java-Anwendungen mit kurzer Laufzeit dynamisch generiert, so dass 1 Sekunde in Stunden kompilieren übersetzt werden kann.

Ich frage mich, ob es Java-Interpreter gibt, die Kompilierung zu *.class Dateien insgesamt umgehen?

(Ich weiß, dass es Groovy ist, aber es ist keine strenge Obermenge von Java)

+0

Eine Sekunde scheint viel zu lang. Sie können den Java-Compiler als API innerhalb der JVM verwenden und Sie können die resultierende Klasse sofort in die laufende JVM laden. –

+0

@MarkoTopolnik Ich sehe 0,7s Echtzeit und 1,2s Benutzerzeit (wegen Multithreading, vermutlich). Können Sie mit der Compiler-API deutlich darunter liegen? – MaxB

+0

Was testen Sie? 'javac' an der Kommandozeile? Wenn ich innerhalb der JVM verwendet werde, denke ich, dass Sie ein stabiles "heißes" Setup haben können, in dem alles mit Ausnahme der Quelldatei geladen wird, die Sie kompilieren. Die Kompilierungszeit sollte in Millisekunden liegen. –

Antwort

1

Also, wenn Ihre Ausgangssprache ist Java, gibt es wirklich nicht. Es gibt ein paar Tools, mit denen Sie Java von einer REPL laden und interpretieren können, aber die Semantik von Java hängt wirklich davon ab, Dinge wie Klassenbeziehungen auflösen zu können.

Es gibt jedoch JVM-Sprachen, die ohne Vorkompilierung verwendet werden können, z. B. Clojure, Scala und Groovy.

+0

Clojure ist schrecklich langsam zu starten. –

+0

Ja, die Quelle muss Java sein. Was sind diese REPL-Tools? Überspringen sie die 1s-Zusammenstellung? – MaxB

+0

Ah. REPL ist "read-eval-print loop". In einer Sprache wie Clojure, LISP oder Groovy gibt es ein Programm, das * liest * eingibt, * es * als Programm auswertet, dann * das Ergebnis * und * loops * zurückdruckt, um es erneut zu lesen. Aber die Struktur der Java-Sprache bedeutet, dass es irgendwie kompiliert werden muss, auch wenn Sie es nicht sehen. Vielleicht haben Sie einen Blick auf diese: https://repl.it/languages/java –

Verwandte Themen