Compilation 在SBCL中生成数组

Compilation 在SBCL中生成数组,compilation,lisp,common-lisp,vm-implementation,Compilation,Lisp,Common Lisp,Vm Implementation,如何使数组在SBCL中工作?在C++中有一些等同于新< /COD>和删除< /COD>操作符,或者是别的什么,也许是汇编程序?? 我查看了源代码,但什么都不懂。当使用从源代码编译的SBCL和类似Emacs/Slime的环境时,使用M-可以非常轻松地浏览代码。(元点)。基本上,make array符号绑定到多个对象:deftransform定义和defun。deftransform主要用于优化,因此最好首先遵循函数 make array函数将委托给内部make array%函数,该函数相当复杂:它

如何使数组
在SBCL中工作?在C++中有一些等同于<代码>新< /COD>和<代码>删除< /COD>操作符,或者是别的什么,也许是汇编程序??
我查看了源代码,但什么都不懂。

当使用从源代码编译的SBCL和类似Emacs/Slime的环境时,使用M-可以非常轻松地浏览代码。(元点)。基本上,
make array
符号绑定到多个对象:
deftransform
定义和
defun
deftransform
主要用于优化,因此最好首先遵循函数

make array
函数将委托给内部
make array%
函数,该函数相当复杂:它检查参数,并根据这些参数分派给不同的数组专用实现:例如,位向量的实现方式与字符串的实现方式不同

如果您按照简单数组的情况进行操作,您会发现一个函数调用了带有widetag的分配向量,该函数依次调用分配向量

现在,
allocate vector
绑定到多个对象、多个
disoptimizer
表单、一个函数和一个
定义vop
表单

功能仅限于:

(defun allocate-vector (type length words)
  (allocate-vector type length words))
即使它看起来像一个递归调用,它也不是

define vop
表单是一种定义如何编译调用
allocate vector
的方法。在函数中,以及调用
分配向量的任何地方,编译器都知道如何编写实现内置操作的程序集。但是函数本身被定义为有一个同名的入口点和一个封装在代码上的函数对象

define vop
依赖于SBCL中的一种特定于域的语言,该语言对汇编进行抽象。如果遵循定义,可以为
分配向量
找到不同的VOP(虚拟操作),如
在堆上分配向量
在堆栈上分配向量

堆上的分配转换为对
计算字节大小的调用,对
分配的调用和
放置头的调用,这很可能分配内存并标记它(我按照
src/compiler/x86-64/alloc.lisp
的定义)。 如何分配内存(以及如何收集垃圾)是另一个问题

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

(invoke-asm-routine 'call (if to-r11 'alloc-tramp-r11 'alloc-tramp) node)
显然有称为
alloc-tramp-r11
alloc-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
后缀代表


也看一下
src/runtime/x86 assem.S

我看了一下代码,但要全部看完,工作量太大了。其基本思想是:数组有一些内存表示形式,类似于维度、填充指针、元素类型和秩等字段。这种布局很大程度上由编译器决定,然后在库的实现和编译器之间进行一系列交互,以决定在这些字段中使用哪些神奇常量来生成数组。@DanRobertson但是它究竟是如何分配内存的呢?是否有一些lisp运算符?它将内置于实现/编译器中。内存管理是一个大而不同的主题。在最简单的情况下,实现只是碰撞一个指针。在更复杂的情况下,它可能需要从免费列表中获取一些内容,将内容拆分,甚至垃圾收集第一个很好的答案,谢谢!没想到C代码会出现在这样一个地方,以为只有一小块C代码块在处理错误或smth的地方。我不知道我自己是否可以在没有太多具体知识的情况下使用所有这些函数。