data-structures - lisp 等链表的表示

标签 data-structures lisp cpu-architecture

谁能概述一下 LISP 中的链表在计算机内存中是如何表示的?计算机是使用 cpu 寄存器来保存指针,还是使用堆来保存列表的头部和其余部分?

最佳答案

这在很大程度上取决于所使用的特定编译器和语言运行时。然而,一般来说,类 Lisp 语言中的数据结构是堆分配的单元格,带有指向其邻居的指针。然后,当函数对数据进行操作时,这些数据将加载到硬件寄存器中。

考虑 Haskell 中的链表类型:

 data [a] = [] | a : [a]

给定的列表可以写成:

1 : (2 : (3 : (4 : (5 : []))))

或更简洁:

[1,2,3,4,5]

这表示为以下形式的堆分配对象:

enter image description here

其中箭头代表指针; (:) 表示一个“cons cell”,一个存储指向当前元素的指针的小结构,以及列表的尾部。

现在,当一个函数访问这个数据结构时,它会将指向该结构的指针加载到寄存器中,并开始从这些指针加载数据。其中的精确细节取决于编译模型和运行时系统模型。例如。对于 GHC Haskell,这是由 STG Machine 给出的.此外,指针中的低端位可用于指示所指向的特定构造函数;它的评估状态(已评估或未评估),如果它很小,甚至是值本身(这是 pointer tagging optimization )。

关于data-structures - lisp 等链表的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912357/

相关文章:

assembly - QWORD 在 64 位机器上的大小是多少?

data-structures - AVL树最小节点

algorithm - flajolet martin 素描是如何工作的?

c++ - C++ 中的 Lisp/Scheme DSEL

lambda - (code) 应该是一个 lambda 表达式……我到底错过了什么?

linux - 当使用物理和逻辑内核的差异号时,在哪里可以找到英特尔处理器(比如 skylake)的 ipc(或 cpi)值?

python - 是否可以将所有相同的术语加入同一个 pandas 数据框列?

java - 在java中删除整个BST

lisp - 是否有通用的 lisp 包命名约定?

performance - CPU访问是否与网卡不对称