没有垃圾收集器的Lisp用于低级编程

时间:2013-08-15 08:55:00

标签: garbage-collection lisp

是否有Lisp的方言有Lisp语义和C语言的低级操作?类似于检索任意内存地址(虚拟或物理内存)并使用它执行某些操作;指向硬件设备的指针...

例如:

(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。从长远来看,我想编写一个简单的OS来学习,但是在Lisp中。我将在C中编写一个用于初步理解,但如果我只能用C编写,我怎么能确定并说我理解如何实现操作系统?我想我只是真正理解如何实现操作系统,如果我能用C语言以外的其他语言编写它来确保。

我不想为操作系统编写类似C core的内容,而为其他所有内容编写Lisp。

4 个答案:

答案 0 :(得分:5)

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

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

您只需要执行一些Lisp实现并阅读手册。这些都记录在案。

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

答案 1 :(得分:4)

您可能有兴趣了解一个旧项目:

  

简介

     

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

Movitz: a Common Lisp x86 development platform

答案 2 :(得分:4)

您可能需要查看PreScheme:

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

  

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

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

答案 3 :(得分:3)

您可以使用低杠杆内容和API来创建或更改现有的Lisp语言,无需内核或用户空间即可运行LISP,并将其交叉编译为未链接到任何内容的blob(静态)。 SBCL可以通过外来CL实现进行自举,甚至交叉编译自己,所以如果你想要CL我会开始阅读有关SBCL以及操作系统设计的代码和文章。

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

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