gpt4 book ai didi

compilation - 在 SBCL 中创建数组

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:03 25 4
gpt4 key购买 nike

make-array 在 SBCL 中如何工作? C++ 中是否有一些与 newdelete 运算符等效的运算符,或者是其他运算符,也许是汇编程序级别的运算符?

我查看了源码,但什么都不懂。

最佳答案

当使用从源代码和 Emacs/Slime 等环境编译的 SBCL 时,可以使用 M-.(元点)很容易地导航代码。基本上,make-array 符号绑定(bind)到多个事物:deftransform 定义和 defundeftransform 主要用于优化,因此最好先遵循函数。

make-array 函数委托(delegate)给一个内部的 make-array% 函数,它非常复杂:它检查参数,并分派(dispatch)到不同的数组专门实现,基于这些参数:例如,位向量的实现方式不同于字符串。

如果您遵循 simple-array 的情况,您会发现一个调用 allocate-vector-with-widetag 的函数,该函数又调用 allocate-矢量

现在,allocate-vector 绑定(bind)到多个对象、多个deoptimizers 形式、一个函数和一个define-vop 形式。

功能只有:

(defun allocate-vector (type length words)
(allocate-vector type length words))

即使它看起来像一个递归调用,它也不是。

define-vop 形式是一种定义如何将调用 编译为allocate-vector 的方法。在函数中,以及调用 allocate-vector 的任何地方,编译器都知道如何编写实现内置操作的程序集。但是函数本身是这样定义的,因此有一个同名的入口点,以及一个覆盖该代码的函数对象。

define-vop 依赖于 SBCL 中的域特定语言,该语言通过汇编进行抽象。如果您遵循定义,您可以为 allocate-vector 找到不同的 vops(虚拟操作),例如 allocate-vector-on-heapallocate-vector-栈上

堆上的分配转换为对 calc-size-in-bytes 的调用,对 allocationput-header 的调用,其中最有可能分配内存并标记它(我遵循 src/compiler/x86-64/alloc.lisp 的定义)。如何分配内存(以及如何收集垃圾)是另一个问题。

allocation 使用 %alloc-tramp 发出汇编代码,它依次执行以下操作:

(invoke-asm-routine 'call (if to-r11 'alloc-tramp-r11 'alloc-tramp) node)

显然有称为 alloc-tramp-r11alloc-tramp 的汇编例程,它们是预定义的汇编指令。评论说:

;;; Most allocation is done by inline code with sometimes help
;;; from the C alloc() function by way of the alloc-tramp
;;; assembly routine.

运行时有一个 C 代码基础,例如参见 /src/runtime/alloc.c

-tramp 后缀代表 trampoline .

另请查看 src/runtime/x86-assem.S

关于compilation - 在 SBCL 中创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52876664/

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