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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
编译器

我观察到Clojure编译器的一个奇怪现象:它可以为相同的输入生成不同的输出。例如,生成的.class文件包含不同的字节,尽管在运行时具有相同的行为。这是为什么?我已经创建了一个Docker容器和脚本,该脚本演示了这个问题

虽然从生成Java程序的功能性来看是无害的,但这种尝试基于简单的字节相等来缓存编译类(例如,使用Docker层缓存)是一个问题。理想情况下,可以将第三方Clojure库编译并存储在Clojure应用程序容器的单独Docker层中。如果给定的特定固定依赖关系集的结果字节输出相同,那么在推送到存储库时可以识别出已经存在的层。这样可以避免创建每个应用程序代码中的单个源更改的整个新的uberjar所带来的存储和网络成本。

如果不使用AOT编译,可以进行这种缓存,但这会以更慢的应用程序启动时间为代价。

1 个答案

+1

这种情况可能由多个原因造成,但主要原因有两个:一是在编译过程中使用无序的Clojure集合(集合或映射)保留状态,二是依赖Java反射API返回的(任意)结果顺序。

我们没有将其视为优先事项来使Clojure构建可重复,但我很高兴评估此类问题并在合理时修复。(例如1.11版本:[https://clojure.atlassian.net/browse/CLJ-1973](https://clojure.atlassian.net/browse/CLJ-1973))。

与整个Docker环境一起工作压力很大——如果您能将其缩小到特定问题,我将很高兴为此创建一个jira。

感谢你的快速回答,Alex!虽然可重复构建不是一个优先事项,但我猜这是优先考虑Clojure动态性的合理权衡。

也许关于构建可重复性的保证不足的问题可以在AOT编译文档页面中提及?([https://clojure.org/reference/compilation](https://clojure.org/reference/compilation))
...