Lisp二进制大小

时间:2012-06-14 15:09:09

标签: lisp common-lisp

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

1 个答案:

答案 0 :(得分:28)

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

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

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

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

  1. 保存图片
  2. 保存优化图片
  3. 编译为C代码
  4. 还有一些更像是编译DLL。

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

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

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

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

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