2012-06-14 142 views
13

因爲我對人工智能感興趣,所以最近我決定給Lisp一個嘗試。 我用common lisp編譯器sbcl編譯了basic application之後,我發現生成的二進制文件非常大(大約43MB)。 我對此感興趣。這是(common)lisp的常見問題,這種行爲的技術背景是什麼?Lisp二進制大小

回答

27

有普通Lisp實現幾個不同的架構:

  • 解釋
  • 字節碼引擎(CLISP是一個例子),通過C編譯器
  • 彙編(ECL是一個例子)
  • 本地代碼編譯器(SBCL,LispWorks,Clozure CL)

通常,解釋器和字節碼e引擎使用最小的內存量。因此CLISP非常小。 SBCL OTOH生成相對較大的本地代碼。

其次,有幾種不同的方法來創建應用

  1. 保存圖像
  2. 節能優化圖像
  3. 編譯爲C代碼

再加上一些更喜歡編譯爲DLL。

SBCL基本上是1.它轉儲包含數據和代碼的內存,幷包含運行時。因此,您在運行系統(文檔,源代碼鏈接,參數列表,符號名稱,調試信息,編譯器本身等)中所擁有的一切將被轉儲到image + runtime中。此外,SBCL生成的本機代碼很大,運行時內存中可能有很多代碼信息,並且SBCL包含了它自己的所有功能(包括編譯器)。

在開發過程中,人們經常使用這些未優化的應用程序或圖像(使用外部運行時)來工作(節省時間)以節省加載代碼和數據的時間。我自己使用了大於100MB的圖片。

LispWorks例如做1和2.它有一個交付過程,您可以選擇性地刪除東西(如文檔,編譯器,源參考等一些功能)。這也使用了一個樹形搖動器,它可以刪除未使用的功能。

優化的圖像也可能意味着把它寫在一些壓縮方式和解壓它啓動起來。 SBCL允許這個例子。

變體3在過去已完成,但目前尚未使用(除了某些專用工具和應用程序之外)。 Thinlisp,Stella,CycL等都是這樣的交付工具。在過去,還有一個商業供應商提供這樣的工具(但這不再存在,IIRC的最後一個擁有者是Oracle)。更新:實際上是mocl,這是iOS和Android最新的Common Lisp應用程序生成器。它需要Common Lisp的一大部分,並將其編譯到小型的獨立移動應用程序。例如,在iOS上,它爲Apple提供的C編譯器生成緊湊的C代碼。

+0

謝謝你,那正是我在尋找的! –

+5

ECL編譯爲C並通過使用共享庫生成相當小的可執行文件,但它在很多方面受到限制。 –

+3

ECL將字節碼編譯器/解釋器和編譯器通過C編譯器編譯爲本地代碼。 ECL通常比SBCL和CCL慢,但產生非常小的二進制文件。我不確定@SamuelEdwinWard的意思是由於限制(除了速度較慢) - 它相當完整,並且具有許多功能。你能詳細解釋一下嗎? –