gpt4 book ai didi

clojure - Clojure 的优化器是如何工作的,它在哪里?

转载 作者:行者123 更新时间:2023-12-04 23:41:46 25 4
gpt4 key购买 nike

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

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

我想要一个指向 implementation 中的位置的指针我可以找到任何/所有源到源转换过程。我不太会说 Java,所以我正在努力浏览代码库。

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

谢谢你。

最佳答案

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

请注意,函数参数的文字向量是一种语法选择,即函数在源代码中的表示方式。它们是否表示为向量或列表或其他任何东西都不会影响运行时,因此无法优化。

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

When speaking about general TCO, we are not just talking about recursive self-calls, but also tail calls to other functions. Full TCO in the latter case is not possible on the JVM at present whilst preserving Java calling conventions (i.e without interpreting or inserting a trampoline etc).

While making self tail-calls into jumps would be easy (after all, that's what recur does), doing so implicitly would create the wrong expectations for those coming from, e.g. Scheme, which has full TCO. So, instead we have an explicit recur construct.

Essentially it boils down to the difference between a mere optimization and a semantic promise. Until I can make it a promise, I'd rather not have partial TCO.

Some people even prefer 'recur' to the redundant restatement of the function name. In addition, recur can enforce tail-call position.

关于clojure - Clojure 的优化器是如何工作的,它在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com