Garbage collection 不带垃圾收集器的Lisp,用于低级编程

Garbage collection 不带垃圾收集器的Lisp,用于低级编程,garbage-collection,lisp,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

是否有一种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。从长远来看,我想用Lisp编写一个简单的操作系统来学习。为了初步理解,我也会用C写一个,但如果我只能用C写,我怎么能确定并说我了解如何实现操作系统呢?我想只有当我能用C以外的语言编写操作系统以确保安全时,我才能真正理解如何实现操作系统


我不想在操作系统中编写C核心,在其他方面编写Lisp。

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

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

您只需要使用一些Lisp实现并阅读手册。都有文件记录


例如,请参阅关于的章节中的可移植层CFFI(通用外部功能接口)。CFFI可以在几种常见的Lisp实现之上工作。

您可以创建或更改一种现有的Lisp语言,使用底层的东西和API来运行Lisp,而不使用内核或用户区,并将其交叉编译为一个不与任何东西链接(静态)的blob。SBCL可以通过一个外来的CL实现引导,甚至可以交叉编译自己,所以如果你想要CL,我会开始阅读关于SBCL的代码和文章以及操作系统设计

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


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

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

导言

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


您可能需要了解预切面:

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


我认为Scheme48在其实现中仍然使用了预切面:

不确定您在问什么。GC和低级内存操作可以共存。大多数常见的Lisp实现都可以做到这一点。参见相关手册中有关外国金融机构的章节。另请参见ECL之类的实现,它可以很容易地嵌入到C程序中。@RainerJoswig我对问题进行了编辑,以澄清问题。除了依赖C和主机操作系统进行低级操作之外,还有其他解决方案吗?谢谢。我认为我需要有自己的实现,而不依赖于主机操作系统和引导SBCL。目前,我对操作系统的了解主要是Linux。我的目标是用Lisp编写一个简单的操作系统,让CL在裸机上运行;我以后会处理遗留的东西。还有很长的路要走。@Amumu我的私人项目正在将我的(工作)更改为一个编译的、词汇范围的项目,而不是一个解释的、动态范围的项目。我认为你的项目可能更复杂,我估计我会用几年的时间来获得一些自我托管的东西。