Jon*_*eld 4 clojure compiler-optimization
我是Clojure的新手,但不是lisp.一些设计决策对我来说很奇怪 - 特别是需要一个向量用于函数参数并使用recur显式请求尾调用.
将列表转换为向量(反之亦然)是优化器的标准操作.通过在编译为字节代码之前重写为等效的clojure,可以将尾调用转换为迭代.[]和recur语法表明当前实现中都没有这些优化.
我想在什么地方在执行我能找到的任何/所有源到源变换通行证.我不会说Java很好,所以我很难在代码库中导航.
如果在逐个函数转换为JVM的字节代码之前没有任何优化,我会对此的设计原理感兴趣.也许是为了实现更快的编译?
谢谢.
编译器代码中没有显式的优化器包.任何优化都是"内联"完成的.有些可以通过编译器标志启用或禁用.
观察函数参数的文字向量是如何在源代码中表示函数的语法选择.它们是否表示为向量或列表或其他任何内容都不会影响运行时,因此无法进行优化.
关于自动recur,Rich Hickey 在这里解释了他的决定:
在谈到一般TCO时,我们不仅讨论递归自调用,还讨论对其他函数的尾调用.后一种情况下的完整TCO目前在JVM上是不可能的,同时保留Java调用约定(即不解释或插入蹦床等).
虽然自我尾调用跳转很容易(毕竟,这就是recur所做的),但隐含地这样做会对那些来自的人产生错误的期望,例如具有完全TCO的Scheme.所以,我们有一个明确的重复构造.
从本质上讲,它归结为仅仅优化和语义承诺之间的差异.在我能做出承诺之前,我宁愿没有部分TCO.
有些人甚至更喜欢"重复"到功能名称的冗余重述.此外,复发可以强制执行尾部呼叫位置.
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |