【问题标题】:How can I examine the JVM bytecode for a clojure function?如何检查 clojure 函数的 JVM 字节码?
【发布时间】:2011-04-18 16:50:34
【问题描述】:

在尝试优化 C 和 LISP 时,查看编译器输出的汇编代码会很有帮助。

Clojure 可能会编译成同样有用的 JVM 字节码。

我怎么看?

【问题讨论】:

  • 请注意,优化字节码实际上可能不会产生任何积极的结果。见this interview。它谈到了编写Java,但它基本上适用于所有产生字节码的语言。

标签: clojure jvm


【解决方案1】:

Clojure 在运行时将所有 Clojure 代码动态编译为字节码。我不知道你怎么能看到这个动态编译的字节码。但是,您可以自己提前 (AOT) 编译 Clojure 代码,这将生成 .class 文件。然后就可以使用javap查看字节码了。

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

编译 功能

用法:(编译库)

将符号 lib 命名的命名空间编译成一组 类文件。库的来源必须在适当的 类路径相对目录。输出文件将进入 compile-path 指定的目录,该目录也必须 在类路径中。

然后使用javap:

javap -l -c -s -private MyClass

【讨论】:

  • 请注意,您必须去掉 .class 扩展名。让我困惑了一分钟左右。
【解决方案2】:

我为此制作了一个小型库和 lein-plugin,请查看:

https://groups.google.com/d/msg/clojure/_BBXpt_GPIw/WWq2VbWkEKEJ

https://github.com/gtrak/no.disassemble

它具有不需要 AOT 的额外优势。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 请问为什么投反对票?据我所知,这些是关于如何检查已编译类文件的字节码的有效答案,因此它们与 Clojure 相关。也许还有一种更接近 Clojure 的方式,但它仍然可以正常工作。如果我说的有问题,请告诉我是什么以及为什么。
    • 我怀疑您被否决了,因为您说“Google it”。关于 SO 的一般知识是,任何以前没有在 SO 上问过的问得好和严肃的问题都是可以问的。这个想法是让 SO 成为谷歌搜索结果的一部分。
    • 啊。这听起来很公平,尽管我并不是说它是贬低 OP 并暗示他/她的懒惰,只是考虑到这是 JVM 语言的一个相当普遍的问题,它提供了永恒的答案和良好的结果。我的不好,下次我会做得更好。
    • 我是 OP,我认为你的答案很好,并投了赞成票。谢谢。我接受了另一个,因为它确切地告诉我要输入什么!
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多