2

最近我一直在阅读现代操作系统如何加载可执行程序并为它们分配内存。不幸的是,我只有一本俄语的计算机科学书籍作为参考,所以,如果我错了,请纠正我,但现代操作系统似乎在可执行程序中有不同的部分用于数据和实际的处理器命令。此外,不可能将控制权交给数据部分,即不能将命令存储在那里。也无法更改可执行 ( text) 部分中的处理器命令。

因此,问题是:现代编译的 CL(SBCL,Clozure-CL)是如何做到的?据我所知,它会创建已编译的 FASL 文件,然后加载它们。但是在编译文件时会创建可见的 FASL 文件。评估函数形式时会发生什么?其次,CL 如何加载它们(在机器/操作系统命令级别)以便为它们分配正确的内存?此外,必须以某种方式卸载旧代码。

PS。当然,这对于解释型语言来说不是问题。对于 JIT 编译器来说,事情变得更加复杂。

4

1 回答 1

1

也许这可以澄清一些事情:Google Groups

与 C 不同,您不需要编译程序,然后执行它们。相反,您正在 lisp 环境中工作。如上所述将文件加载到 sbcl 后,您只需键入

(你好)

你的代码将被执行,你运行的代码是编译的,而不是解释的。在 SBCL 中,您不需要先显式编译,因为您键入或加载到 sbcl 中的所有代码都是即时编译的。事实上,sbcl 中没有解释器。在其他 lisp 系统中,您可能需要显式编译才能编译代码。

fasl 文件本身不可执行,必须与 sbcl 一起使用。

于 2018-07-20T14:33:25.553 回答