2010-09-29 9 views
13

Beim Versuch, C und LISP zu optimieren, kann eine Analyse des vom Compiler ausgegebenen Assemblercodes eine große Hilfe sein.Wie kann ich den JVM-Bytecode für eine Clojure-Funktion untersuchen?

Clojure kompiliert vermutlich zu einem JVM-Bytecode, der ebenso hilfreich wäre.

Wie kann ich es sehen?

+4

Bitte beachten Sie, dass die Optimierung des Bytecodes möglicherweise keine positiven Ergebnisse liefert. Siehe [dieses Interview] (http://java.sun.com/developer/technicalArticles/Interviews/goetz_qa.html#CodePerformsWell). Es geht um das Schreiben von Java, aber es gilt grundsätzlich für alle Sprachen, die Bytecode erzeugen. –

Antwort

11

Clojure erstellt dynamisch die alle Clojure Code Bytecode zur Laufzeit. Ich bin nicht sicher, wie Sie diesen dynamisch kompilierten Bytecode sehen können. Sie können jedoch Ahead Of Time (AOT) kompilieren Sie Ihren Clojure-Code selbst und das generiert. Class-Dateien. Dann können Sie javap verwenden, um den Bytecode zu sehen.

Verwenden Sie die compile Funktion in Clojure/Kern Ihren Namensraum zu kompilieren:

kompilieren Funktion

Verbrauch: (kompilieren lib)

den Namensraum durch das Symbol lib in eine benannte Compiliert Satz von Classfiles. Die Quelle für die Lib muss in einem geeigneten Klassenpfad-relativen Verzeichnis sein. Die Ausgabedateien werden in das Verzeichnis geleitet, das durch compile-path angegeben wird. Auch dieses Verzeichnis muss im Klassenpfad enthalten sein.

Dann nutzen javap:

javap -l -c -s -private MyClass 
+0

Süß! Vielen Dank. –

+1

Beachten Sie, dass Sie die Erweiterung .class verlassen müssen. Verwirrt mich für eine Minute oder so. –

3

Einige handgemachte Lösungen:

+1

Darf ich fragen, warum die Abstimmung stimmt? Soweit ich weiß, sind dies gültige Antworten darauf, wie man den Bytecode von kompilierten Klassendateien untersuchen kann, so dass sie für Clojure relevant sind. Vielleicht gibt es einen Clojure-y-Weg, aber es funktioniert genauso gut. Wenn etwas, was ich sage, falsch ist, sag mir bitte was und warum. – haylem

+4

Ich vermute, du wurdest abgelehnt, weil du "Google it" gesagt hast.Es ist allgemein bekannt, dass jede gut gestellte und ernsthafte Frage, die zuvor nicht zu SO gestellt wurde, eine gute Frage ist. Die Idee ist, dass SO Teil der Google-Ergebnisse sein soll. – Rayne

+0

Ah. Das klingt fair genug, obwohl ich es nicht als eine Absetzung des OP und die Verlangsamung seiner selbst meinte, nur dass es zeitlose Antworten mit guten Ergebnissen liefert, wenn man bedenkt, dass es eine ziemlich häufige Frage für JVM-Sprachen ist. Mein schlechtes, ich werde es nächstes Mal besser machen. – haylem

Verwandte Themen