Clojure的优化工作如何工作,它在哪里?

Jon*_*eld 4 clojure compiler-optimization

我是Clojure的新手,但不是lisp.一些设计决策对我来说很奇怪 - 特别是需要一个向量用于函数参数并使用recur显式请求尾调用.

将列表转换为向量(反之亦然)是优化器的标准操作.通过在编译为字节代码之前重写为等效的clojure,可以将尾调用转换为迭代.[]和recur语法表明当前实现中都没有这些优化.

我想在什么地方在执行我能找到的任何/所有源到源变换通行证.我不会说Java很好,所以我很难在代码库中导航.

如果在逐个函数转换为JVM的字节代码之前没有任何优化,我会对此的设计原理感兴趣.也许是为了实现更快的编译?

谢谢.

Leo*_*hin 6

编译器代码中没有显式的优化器包.任何优化都是"内联"完成的.有些可以通过编译器标志启用或禁用.


观察函数参数的文字向量是如何在源代码中表示函数的语法选择.它们是否表示为向量或列表或其他任何内容都不会影响运行时,因此无法进行优化.

关于自动recur,Rich Hickey 在这里解释了他的决定:

在谈到一般TCO时,我们不仅讨论递归自调用,还讨论对其他函数的尾调用.后一种情况下的完整TCO目前在JVM上是不可能的,同时保留Java调用约定(即不解释或插入蹦床等).

虽然自我尾调用跳转很容易(毕竟,这就是recur所做的),但隐含地这样做会对那些来自的人产生错误的期望,例如具有完全TCO的Scheme.所以,我们有一个明确的重复构造.

从本质上讲,它归结为仅仅优化和语义承诺之间的差异.在我能做出承诺之前,我宁愿没有部分TCO.

有些人甚至更喜欢"重复"到功能名称的冗余重述.此外,复发可以强制执行尾部呼叫位置.