由于我对人工智能很感兴趣,我最近决定尝试一下Lisp。在用常用的lisp编译器sbcl编译了一个非常大的basic application之后,我注意到生成的二进制文件非常大(大约43MB)。我对这其中的原因很感兴趣。这是(常见的) lisp的常见问题吗?这种行为的技术背景是什么?
发布于 2012-06-14 23:39:03
Common Lisp实现中有几种不同的体系结构:
通常,解释器和字节码引擎使用的内存最少。因此,CLISP非常小。SBCL OTOH生成相对较大的本机代码。
其次,有几种不同的方法来创建applications
再加上一些更像编译成DLL的东西。
SBCL基本上执行1.它转储包含数据和代码的内存,并包含运行时。因此,您在运行系统中拥有的所有内容(文档、源代码链接、参数列表、符号名称、调试信息、编译器本身,等等)将被转储到image+runtime中。此外,SBCL生成的本机代码很大,在运行时内存中可能有大量的代码信息,并且SBCL包含它自己的所有功能(包括编译器)。
在开发期间,人们经常使用(s/ed)这样的未优化的应用程序或映像(使用外部运行时),以节省加载代码和数据的时间。我自己也用过大于100MB的图片。
例如,LispWorks做了1和2。它有一个交付过程,在这个过程中,你可以有选择地删除一些东西(比如文档、一些功能,比如编译器、源代码引用等等)。这也使用了一个树振动器,它可以删除不使用的功能。
优化图像也可能意味着以某种压缩的方式编写它,并在启动时解压它。例如,SBCL允许这样做。
变体3是在过去完成的,但目前没有使用(除了在一些专门的工具和应用程序中)。Thinlisp,Stella,CycL,...就是这样的交付工具。在过去,也有这样的工具的商业供应商(但现在已经不存在了,IIRC是/曾经是Oracle的最后所有者)。更新:实际上,最近为iOS和安卓开发的Common Lisp应用生成器mocl做到了这一点。它使用Common Lisp的一个很大的子集,并将其编译成小型的独立移动应用程序。例如,在iOS上,它为苹果提供的C编译器生成紧凑的C代码。
https://stackoverflow.com/questions/11036070
复制相似问题