【问题标题】:Lisp without a Garbage Collector for low level programming没有垃圾收集器的 Lisp 用于低级编程
【发布时间】:2013-08-15 08:54:59
【问题描述】:

是否存在具有 Lisp 语义和 C 低级操作的 Lisp 方言?诸如检索任意内存地址(虚拟内存或物理内存)并对其进行处理;指向硬件设备的指针...

例如:

(defvar a '(1 2 3 4)) ;; I have a list
(defvar b (cdr a)) ;; b is the cdr of a. But I want b to
                   ;;  actually refer to the tail of a
(setf b '(4 5 6)) ;; b now has new value, but a remains unchanged

我想要的是用 Lisp 来表达底层的问题。例如,在裸机上运行 Lisp 时如何控制单个字节和位?在 C 语言中,我可以获得一个指针并执行指针运算以指向内存空间(虚拟或物理)中我想要的任何位置。指针也可以指向设备和硬件设计者定义的任意地址。

我为什么需要这个?好吧,我想学习如何在低级编程中使用 Lisp。从长远来看,我想写一个简单的操作系统来学习,但是在 Lisp 中。我也会用 C 写一个来初步理解,但如果我只能用 C 写,我怎么能确定并说我理解如何实现一个操作系统?我想只有当我能用 C 以外的其他语言编写操作系统时,我才能真正理解如何实现操作系统。

我不想为操作系统编写诸如 C 核心之类的东西,而为其他一切编写诸如 Lisp 之类的东西。

【问题讨论】:

  • 不确定你在问什么。 GC 和低级内存操作可以共存。大多数 Common Lisp 实现都可以做到这一点。请参阅相应手册中有关 FFI 的章节。另请参阅 ECL 等可以轻松嵌入到 C 程序中的实现。
  • @RainerJoswig 我编辑了问题以使其清楚。除了依赖 C 和主机操作系统进行低级操作,还有其他解决方案吗?

标签: garbage-collection lisp


【解决方案1】:

正如我在评论中提到的,大多数 Lisp 实现都可以做到这一点。 Common Lisp 已经具备各种位计算功能。所有实现都提供低级操作的接口。

您可以在 Lisp 中编写 Web 服务器、编译器、窗口管理器等。许多 Lisp 系统都是用 Lisp 编写的,因此需要原语来写入/读取内存。

您只需要进行一些 Lisp 实现并阅读手册即可。都记录在案了。

例如参见可移植层 CFFI(通用外部函数接口),pointers 的章节。 CFFI 工作在几个 Common Lisp 实现之上。

【讨论】:

    【解决方案2】:

    你可能想看看 PreScheme:

    http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.3.4031

    Pre-Scheme 是 Scheme 的一种静态类型方言,它为程序员提供了 C 的效率和低级机器访问,同时保留了 Scheme 的许多理想特性。 PreScheme 编译器利用类型推断、部分求值以及 Scheme 和 Lisp 编译器技术将 Scheme 的有问题的特性(例如闭包)编译成 C 代码,而不会产生显着的运行时开销。在 Pre-Scheme 程序中使用这些功能仅限于那些可以编译成有效代码的情况。类型重构是使用修改后的 Hindley/Milner 算法完成的,该算法允许重载用户定义的函数。 Pre-Scheme 程序中的所有顶级表单都在编译时进行评估,这使用户可以额外控制编译器对程序的部分评估。 Pre-Scheme 已实现并用于编写字节码解释器和相关的支持代码,以实现完整的 Scheme 实现

    我认为 Scheme48 在其实现中仍然使用 PreScheme:http://s48.org/

    【讨论】:

      【解决方案3】:

      您可能有兴趣查看一个旧项目:

      简介

      Movitz 系统渴望成为 ANSI Common Lisp 的实现 它以“金属”上无处不在的 x86 PC 架构为目标。那 是,在没有任何操作系统或其他形式的软件的情况下运行 环境。 Movitz 是一个操作系统的开发平台 内核、嵌入式和单一用途的应用程序。有可以 可能是构建了几个完全不同的操作系统 使用 Movitz。

      Movitz: a Common Lisp x86 development platform

      【讨论】:

        【解决方案4】:

        您可以使用低级别的东西和 API 创建或更改现有的 Lisp 语言,您需要在没有内核或用户空间的情况下运行 LISP,并将其交叉编译为不链接到任何东西(静态)的 blob。 SBCL 可以用外来的 CL 实现引导,甚至可以交叉编译,所以如果你想要 CL,我会开始阅读关于 SBCL 以及操作系统设计的代码和文章。

        你如何从那里去取决于你想要它成为什么。理论上,运行中的 LISP 可以拥有所有资源,您可以在其中制作所有应用程序和支持。你甚至为你的操作系统的最低级别有一个垃圾收集器:)

        您最终需要一种方法来使通用应用程序和设备驱动程序易于移植。这样你就可以在别人的努力下航行。想象一下,如果您需要从头开始编写自己的浏览器或 nvidia 驱动程序..

        【讨论】:

        • 谢谢。我想我需要有自己的实现,而不依赖于主机操作系统和引导 SBCL。目前,我对操作系统的了解主要是Linux。我的目标是用 Lisp 编写一个简单的操作系统,让 CL 在裸机上发生;我稍后会处理遗留的东西。不过还有很长的路要走。
        • @Amumu 我的私人项目正在将我的(工作)LISP interpreter for Brainf*ck 更改为编译和词法范围,而不是解释和动态范围。我认为你的项目可能更复杂,我估计我会用几年的时间来获得一些自我托管的东西。
        猜你喜欢
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        相关资源
        最近更新 更多