2010-09-29 12 views
13

En essayant d'optimiser C et LISP, regarder le code assembleur produit par le compilateur peut être d'une grande aide. Clojure compile vraisemblablement un bytecode JVM qui serait également utile.Comment puis-je examiner le bytecode JVM pour une fonction clojure?

Comment le voir?

+4

Veuillez noter que l'optimisation du bytecode pourrait ne produire aucun résultat positif. Voir [cette interview] (http://java.sun.com/developer/technicalArticles/Interviews/goetz_qa.html#CodePerformsWell). Il parle d'écrire Java, mais il s'applique essentiellement à tous les langages produisant du bytecode. –

Répondre

11

Clojure compile dynamiquement tout le code Clojure de bytecode à l'exécution. Je ne suis pas sûr comment vous pouvez voir ce bytecode compilé dynamiquement. Cependant, vous pouvez faire Ahead Of Time (AOT) la compilation de votre code Clojure vous-même et qui va générer des fichiers .class. Ensuite, vous pouvez utiliser javap pour voir le bytecode.

Utilisez la fonction compile dans Clojure/noyau pour compiler votre espace de noms:

compilez fonction

Utilisation: (compiler lib)

Compile l'espace de noms nommé par le symbole lib dans un ensemble de classfiles. La source de la lib doit être dans un répertoire relatif au chemin d'accès relatif. Les fichiers de sortie iront dans le répertoire spécifié par chemin de compilation, et ce répertoire doit également être dans le classpath.

Puis utilisez javap:

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

Doux! Merci beaucoup. –

+1

Notez que vous devez laisser l'extension .class. Confus moi pendant une minute ou deux. –

3

Quelques solutions faites à la main:

+1

Puis-je demander pourquoi le vote à la baisse? Pour autant que je sache, ce sont des réponses valides sur la façon d'examiner le bytecode des fichiers de classe compilés, donc ils sont pertinents pour Clojure. Peut-être y a-t-il une manière plus Clojure-y, mais ça marche tout aussi bien. Si quelque chose que je dis est faux, s'il vous plaît dites-moi quoi et pourquoi. – haylem

+4

Je suppose que vous avez été déclassé parce que vous avez dit "Google".Il est de notoriété publique que toute question pertinente et sérieuse qui n'a pas été posée auparavant est une bonne question à poser. L'idée est que SO fasse partie des résultats de google. – Rayne

+0

Ah. Cela semble assez juste, bien que je ne le pensais pas comme une réprimande et une indifférence de sa part, mais plutôt comme une réponse intemporelle avec de bons résultats étant donné que c'est une question assez courante pour les langages de la JVM. Mon mauvais, je ferai mieux la prochaine fois. – haylem