【发布时间】:2015-02-23 21:40:01
【问题描述】:
虽然不是所有的 Common Lisp 实现都编译成机器代码,但其中一些实现了,包括 SBCL 和 CCL。
在 C/C++ 中,如果源文件不改变,C/C++ 编译器的二进制输出也不会改变,假设底层系统保持不变。
在 Common Lisp 编译器中,与 C/C++ 不同,编译不受用户直接控制。我的问题是,如果 Lisp 源文件没有改变,在什么情况下 CL 编译器会多次编译代码,为什么?如果可能,一个简单的说明性示例会有所帮助。
【问题讨论】:
-
编译器不编译文件。它编译代码。例如,您可以输入 REPL
(compile nil (list 'lambda (list 'x) (list '+ 'x 'x)))。根本不涉及任何文件。 -
@JoshuaTaylor 仍然可以将代码放入文件中,然后从那里编译。
-
当然可以(见我的回答),但在这种情况下,会从文件中读取一些代码,然后将编译后的内容写入另一个文件,然后再加载该文件。
-
@JoshuaTaylor 好的,如果问题足够不妥,那么删除它可能是个好主意。您对此有何看法?
-
我不一定认为这是一个不好的问题;错误的假设是我们过去都做过的事情,许多人对 Common Lisp 中的编译工作方式有一些误解。我认为这个问题及其答案可能对未来的人们有用。