表示链接列表,例如在lisp中

时间:2012-06-06 10:24:21

标签: data-structures lisp computer-architecture

是否有人可以概述LISP中的链接列表如何在计算机的内存中表示?计算机是否使用cpu寄存器来保存指针列表的头部和其余部分,或者是堆使用的是什么?

3 个答案:

答案 0 :(得分:4)

这在很大程度上取决于所使用的特定编译器和语言运行时。但是,通常,类似Lisp的语言中的数据结构是堆分配的单元,其中包含指向其邻居的指针。当函数对数据进行操作时,它们会被加载到硬件寄存器中。

考虑Haskell中的链表类型:

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

给定列表可能写为:

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

或更简洁:

[1,2,3,4,5]

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

enter image description here

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

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

答案 1 :(得分:3)

对于关于Lisp的这些哲学问题,最令人鼓舞的来源之一是Anatomy of Lisp。即使它现在有点过时了。阅读它(好多年前)对我来说是一个启示,不仅仅是关于Lisp,而是关于编程。关于Lisp实现的另一本优秀书是Lisp in Small Pieces。如果你认真学习Lisp内部,那么这两个将对你有所帮助。

答案 2 :(得分:2)

取决于。如果您遇到真正的问题,Stackoverflow最好。

'LISP'是一大类语言和数百种不同的实现。

已经尝试了各种实现链表的方法。

有关于Lisp实现的书籍,有许多小型和大型开源Lisp实现可供研究。

相关文献可在此处找到:http://library.readscheme.org/page8.html