compilation - SBCL 的内联编译和 block 编译有什么区别?

标签 compilation lisp common-lisp sbcl

几周前,SBCL更新了2.0.2,带来了Block编译功能。我读过这个article了解它是什么。

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

谢谢。

最佳答案

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

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

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

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

block 编译 意味着一堆代码被编译在一起,具有不同的语义约束,这使编译器能够进行大量新的优化。

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

来自 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.

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

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

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

阻止多个文件的编译

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

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

关于compilation - SBCL 的内联编译和 block 编译有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60749799/

相关文章:

lisp - 在 Lisp (CLOS) 中访问槽的问题

lisp - 口齿不清错误 : Expected-type: REAL datum: NIL

java - 编译器对泛型方法的空参数的行为不同

c++ - 如何在 Xcode 中更改构建线程的数量?

c# - Mono AOT 编译 - 如何获取 .so 文件?

Lispworks 编辑器颜色编码

compilation - 有没有办法在 Visual Studio Code 中编译 Lisp 源文件?

emacs - 使用 SLIME 在远程 Emacs 上完成 Tab 键

iphone - Xcode编译为较低版本的iOS

lisp - 总是喜欢标签而不是车队?