Common Lisp 编译代码并将其加载到映像中的机制



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

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

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

也许这澄清了事情: 谷歌网上论坛

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

(你好(

你的代码将被执行,你运行的代码将被编译,并且 未解释。在 SBCL 中,您不需要先显式编译, 因为您键入或加载到 SBCL 中的所有代码都是动态编译的。在 事实上,SBCL中没有口译员。在其他 Lisp 系统中,你可以 需要显式编译才能编译代码。

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

最新更新