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

欢迎!请参阅关于页面了解有关此信息的更多内容。

0

我观察到Clojure编译器的一个奇怪现象:它可以对相同的输入产生不同的输出。也就是说,生成的.class文件包含不同的字节,但运行时行为却完全相同。为什么会有这种现象?我已经创建了一个Docker容器和脚本,展示了这个问题

虽然对于结果的Java程序功能来说是无害的,但这对试图基于简单的字节平等缓存编译过的类的方法是个问题,例如在Docker层次结构缓存中。理想情况下,可以编译第三方Clojure库,并将这些库存储在容器中Clojure应用的单独Docker层。如果这个层在特定的固定依赖集给定的情况下产生了相同的字节输出,那么在推送到仓库时可以认出这个层已经存在。这将避免由于创建整个新的uberjar而造成的存储和网络成本,每当您的应用程序代码中的任何源代码更改时,都需要创建新的uberjar。

在没有使用AOT编译时可以进行此类缓存,但这是以较慢的应用程序启动速度为代价的。

1 答案

+1

这种情况可能由几个不同原因引起,但主要原因有两个:一是在编译过程中在无序的Clojure集合(如集合或映射)中保持状态,或者依赖于Java反射API返回的结果顺序(任意的)。

我们并不认为使Clojure构建可重复执行是一个优先事项,但如果我们认为这样做有意义,我们当然愿意评估此类问题并进行修复。(例如,1.11中的情况:https://clojure.atlassian.net/browse/CLJ-1973)。

与整个Docker环境打交道是一个非常复杂的过程——如果您能将其缩小到特定问题,我将很乐意为其创建一个jira。

Alex,非常感谢您如此迅速地回答!虽然重复构建不是一个优先考虑的事项,但我想这可能是Clojure动态特性优先级的一个合理的权衡。

也许关于构建重复性保证缺失的事实值得关注在AOT编译文档页面上提一下?(https://clojure.org/reference/compilation
...