gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:28:48 26 4
gpt4 key购买 nike

几周前,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/

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