SBCL 的内联编译和块编译有什么区别?

What's the differences from inline and block compilation of SBCL?

几周前,SBCL更新了2.0.2,带来了Block编译功能。我已阅读此 article 以了解它是什么。

我有一个问题,(declaim (inline 'some-function))和块编译有什么区别?块编译是由编译器自动进行的?

谢谢。

内联编译是一种特殊的优化技术。被调用的函数直接集成到调用函数中——通常使用它的源代码——然后编译。

这意味着内联函数可能不只在一个函数中内联,而是在多个函数中内联。

优点:调用函数的开销消失了。

缺点:当内联函数改变并且我们希望这个改变变得可见时,代码量增加并且调用函数需要重新编译。宏有相同的问题

块编译意味着一堆代码一起编译具有不同的语义约束,这使编译器能够做一堆新的优化。

Common Lisp 在标准中支持 单个文件的块编译。它允许文件编译器假设文件就是这样的代码块。

来自 Common Lisp 标准的示例:

3.2.2.3 Semantic Constraints

A call within a file to a named function that is defined in the same file refers to that function, unless that function has been declared notinline. The consequences are unspecified if functions are redefined individually at run time or multiply defined in the same file.

这允许代码调用全局函数并且使用符号的函数单元格进行调用。因此,这将禁用全局函数调用的 后期绑定 - 在此文件中以及此文件中的函数。

没有说这是如何实现的,但编译器可能只是将代码分配到某个地方,调用就跳转到那里。

所以块编译的这一部分在标准中定义,一些编译器正在这样做。

阻止多个文件的编译

如果文件编译器可以对一个文件使用块编译,那么多个文件呢?少数编译器还可以告诉文件编译器,几个文件组成一个进行编译。 CMUCL 就是这样做的。 SBCL 是从 CMUCL 派生和简化而来的,直到现在还没有它。我认为 Lucid Common Lisp(不再积极销售)也支持类似的东西。

将此添加到 SBCL 也可能有用。