【问题标题】:Representation of linked list such as in lisplisp等链表的表示
【发布时间】:2012-06-06 10:24:21
【问题描述】:

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

【问题讨论】:

    标签: data-structures lisp computer-architecture


    【解决方案1】:

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

    考虑 Haskell 中的链表类型:

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

    给定的列表可以写成:

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

    或更简洁:

    [1,2,3,4,5]

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

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

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

    【讨论】:

      【解决方案2】:

      对于有关 Lisp 的此类哲学问题,最鼓舞人心的来源之一是Anatomy of Lisp。即使现在有点过时了。阅读它(嗯,很多年前)对我来说是一种启发,不仅是关于 Lisp,而且是关于一般的编程。另一本关于 Lisp 实现的优秀书籍是Lisp in Small Pieces。如果你认真学习 Lisp 内部,这两个对你有很大帮助。

      【讨论】:

        【解决方案3】:

        视情况而定。如果您遇到真正的问题,最好使用 Stackoverflow。

        “LISP”是一个庞大的语言家族和数百种不同的实现。

        各种实现链表的方式都已经尝试过了。

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

        相关文献可以在这里找到,例如:http://library.readscheme.org/page8.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 2011-05-16
          • 2010-09-24
          相关资源
          最近更新 更多