如何检查Clojure函数的JVM字节码?

17
在优化C和LISP时,查看编译器生成的汇编代码可以提供很大帮助。Clojure预计会编译成对JVM字节码同样有用的形式。
我该如何查看它呢?

4
请注意,优化字节码可能不会产生任何积极的结果。请参见此次采访。虽然它谈论的是Java编程,但基本上适用于所有生成字节码的编程语言。 - Joachim Sauer
3个回答

15

Clojure会在运行时将所有的Clojure代码动态编译成字节码。我不确定如何查看这个动态编译的字节码。但是,你可以使用 Ahead Of Time (AOT) 编译自己的Clojure代码,这样会生成 .class 文件。然后你可以使用 javap 命令来查看字节码。

使用 Clojure/core 中的 compile 函数来编译你的命名空间:

compile function

用法: (compile lib)

将名为 lib 的命名空间编译成一组 class 文件。lib 的源码必须位于适当的类路径相对目录中。输出文件将放置在由 compile-path 指定的目录中,该目录也必须在类路径中。

之后使用 javap 命令:

javap -l -c -s -private MyClass

1
请注意,您必须省略掉“.class”扩展名。这让我困惑了一两分钟。 - John Lawrence Aspden

7

4

1
我可以问一下为什么要点踩吗?据我所知,这些都是关于如何检查编译后的类文件字节码的有效答案,因此它们与Clojure相关。也许有更适合Clojure的方法,但它们同样有效。如果我说错了什么,请告诉我是什么以及为什么。 - haylem
4
我猜测你被踩的原因是使用了“Google一下”这个回答。在SO社区,人们普遍认为只要一个问题是好的并且严肃的,并且尚未在SO上提问过,那么这个问题就可以被提出来。这样做的目的是让SO成为谷歌搜索结果的一部分。 - Rayne
啊,听起来还不错。虽然我并不是想贬低原帖作者,也不是要暗示他/她懒惰,只是说这个问题对于JVM语言来说是一个相当常见的问题,而且提供了永久有效的答案和好的结果。我的错误,下次我会做得更好。 - haylem
我是楼主,我认为你的回答很好并点赞了它。谢谢。我接受了另一个回答,因为它告诉我要输入什么! - John Lawrence Aspden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接