是否有人可以概述LISP中的链接列表如何在计算机的内存中表示?计算机是否使用cpu寄存器来保存指针列表的头部和其余部分,或者是堆使用的是什么?
答案 0 :(得分:4)
这在很大程度上取决于所使用的特定编译器和语言运行时。但是,通常,类似Lisp的语言中的数据结构是堆分配的单元,其中包含指向其邻居的指针。当函数对数据进行操作时,它们会被加载到硬件寄存器中。
考虑Haskell中的链表类型:
data [a] = [] | a : [a]
给定列表可能写为:
1:(2:(3:(4:(5:[]))))
或更简洁:
[1,2,3,4,5]
这表示为以下形式的堆分配对象:
其中箭头表示指针; (:)
表示“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