Clojure 2024年调查中分享您的想法!

欢迎!请查阅关于页面,了解有关此系统的一些更多信息。

0
编译器

我观察到了Clojure编译器的奇怪之处:它可以为相同的输入生成不同的输出。也就是说,生成的.class文件包含不同的字节,尽管在其他方面有相同的运行时行为。为什么会出现这种情况?我创建了一个Docker容器和脚本,展示了该问题

虽然这在最终生成的Java程序的功能方面并没有危害,但这仍然是尝试根据简单的字节比较来缓存编译后的类的一个问题,例如使用Docker层缓存。理想情况下,可以被编译的第三方Clojure库可以存储在容器的单独Docker层中,以便在Clojure应用中使用。如果这样的层在给定的特定固定依赖关系集下产生了相同的字节输出,那么当推送到存储库时就可以识别出它已经存在。这将避免由于在您的应用程序代码中的每个源代码更改中都创建新的uberjar而导致的存储和网络成本。

当不使用AOT编译时可以实现这种缓存,但代价是应用程序启动速度变慢。

1 答案

+1

这种事情发生的原因有很多,但其中两个主要原因是在编译过程中,状态被保存在无序的Clojure集合(集合或映射)中,或者依赖于Java反射API返回的(任意)结果顺序。

我们不认为使Clojure构建可重复是一个优先事项,但我们很乐意评估此类问题,并在合理的情况下修复它们。(示例来自1.11版本:https://clojure.atlassian.net/browse/CLJ-1973)。

处理整个Docker堆栈很多事情 - 如果您能将其缩小到特定问题,我很乐意为此问题创建一个jira。

by
Alex,非常感谢您的快速回答!可重复的构建不是优先事项很遗憾,但我想这在优先考虑Clojure的动态性方面是一个合理的权衡。

也许关于构建可重复性的缺乏保证可以值得在AOT编译文档页面上提及?(https://clojure.org/reference/compilation
...