ccQ*_*ein 3 lisp compilation sbcl common-lisp
几周前,SBCL 更新了 2.0.2 并带来了 Block 编译功能。我已经阅读了这篇文章以了解它是什么。
我有一个问题,(declaim (inline 'some-function))和 Block 编译有什么区别?块编译是由编译器自动进行的吗?
谢谢。
内联编译是一种特定的优化技术。被调用的函数直接集成到调用函数中——通常使用其源代码——然后编译。
这意味着内联函数可能不仅仅内联在一个函数中,而是内联在多个函数中。
优点:调用函数的开销消失了。
缺点:当内联函数更改并且我们希望此更改变得可见时,代码大小增加并且调用函数需要重新编译。宏也有同样的问题。
块编译意味着一堆代码被编译在一起,具有不同的语义约束,这使编译器能够进行一系列新的优化。
Common Lisp 在标准中支持单个文件的块编译。它允许文件编译器假设文件就是这样的代码块。
Common Lisp 标准中的示例:
文件中对同一文件中定义的命名函数的调用引用该函数,除非该函数已声明为 notinline。如果在运行时单独重新定义函数或在同一文件中多次定义函数,后果是不确定的。
这允许代码调用全局函数而不使用符号的函数单元进行调用。因此,这将禁用全局函数调用的后期绑定- 在此文件中和此文件中的函数。
没有说这是如何实现的,但编译器可能只是在某处分配代码,调用就跳转到那里。
所以这部分块编译是在标准中定义的,一些编译器正在这样做。
多个文件的块编译
如果文件编译器可以对一个文件使用块编译,那么多个文件呢?几个编译器也可以告诉文件编译器几个文件组成一个块编译。CMUCL 就是这样做的。SBCL 是从 CMUCL 派生和简化的,直到现在才缺少它。我认为 Lucid Common Lisp(不再积极销售)也确实支持类似的东西。
将其添加到 SBCL 也可能很有用。