9

是否存在具有 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 之类的东西。

4

4 回答 4

6

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

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

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

例如,参见可移植层 CFFI(Common Foreign Function Interface),关于指针的章节。CFFI 工作在几个 Common Lisp 实现之上。

于 2013-08-15T12:05:42.283 回答
6

你可能想看看 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 程序中的所有顶级表单都在编译时进行评估,这使用户可以额外控制编译器对程序的部分评估。

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

于 2013-08-16T16:24:12.887 回答
4

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

介绍

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

Movitz:Common Lisp x86 开发平台

于 2013-08-16T06:23:08.823 回答
3

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

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

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

于 2013-08-15T22:08:47.293 回答