Lisp二进制大小

Ole*_*ger 14 lisp common-lisp

由于我对人工智能感兴趣,我最近决定试试Lisp.在使用常见的lisp编译器sbcl编译一个非常基本的应用程序后,我注意到生成的二进制文件非常大(大约43MB).我对此感兴趣.这是(常见的)lisp的常见问题,这种行为的技术背景是什么?

Rai*_*wig 28

Common Lisp实现中有几种不同的体系结构:

  • 翻译员
  • 字节码引擎(CLISP就是一个例子)
  • 通过C编译器编译(ECL就是一个例子)
  • 本机代码编译器(SBCL,LispWorks,Clozure CL)

通常,Interpreter和字节码引擎使用最少的内存.CLISP因此非常小.SBCL OTOH生成相对较大的本机代码.

其次,有几种不同的方法来创建应用程序:

  1. 保存图像
  2. 保存优化的图像
  3. 编译为C代码

还有一些更像是编译DLL.

SBCL基本上做1.它转储包含数据和代码的内存并包含运行时.因此,您在运行系统中的所有内容(文档,源代码链接,参数列表,符号名称,调试信息,编译器本身......)都将被转储到映像+运行时.另外,SBCL生成的本机代码很大,运行时内存中可能存在大量代码信息,而SBCL包含其自身的所有功能(包括编译器).

在开发期间,经常使用这种未经优化的应用程序或图像(使用外部运行时)来工作(s/ed)以节省加载代码和数据的时间.我自己用的是大于100MB的图像.

LispWorks例如做1和2.它有一个交付过程,你可以选择性地删除东西(比如文档,编译器,源代码引用等一些功能).这也使用了树形振动器,它可以删除未使用的功能.

优化图像也可能意味着以某种压缩方式编写图像并在启动时对其进行解压缩.例如,SBCL允许这样做.

变体3过去已经完成,但目前尚未使用(除了一些专业工具和应用程序).Thinlisp,Stella,CycL,......就是这样的送货工具.在过去,还有一个商业供应商用于这样的工具(但这不再存在,IIRC的最后一个所有者是Oracle).更新:实际上是mocl,最近用于iOS和Android的Common Lisp应用程序生成器.它需要一大部分Common Lisp并将其编译为小型独立移动应用程序.例如,在iOS上,它为Apple提供的C编译器生成紧凑的C代码.

  • ECL编译为C并使用共享库生成相当小的可执行文件,但它在很多方面受到限制. (5认同)
  • ECL具有字节码编译器/解释器以及通过C编译器编译到本机代码.ECL通常比SBCL和CCL慢,但产生非常小的二进制文件.我不确定@SamuelEdwinWard的限制是什么意思(除了事实它更慢) - 它相当完整并且具有许多功能.你能详细说明一下吗? (3认同)