因爲我對人工智能感興趣,所以最近我決定給Lisp一個嘗試。 我用common lisp編譯器sbcl編譯了basic application之後,我發現生成的二進制文件非常大(大約43MB)。 我對此感興趣。這是(common)lisp的常見問題,這種行爲的技術背景是什麼?Lisp二進制大小
13
A
回答
27
有普通Lisp實現幾個不同的架構:
- 解釋
- 字節碼引擎(CLISP是一個例子),通過C編譯器
- 彙編(ECL是一個例子)
- 本地代碼編譯器(SBCL,LispWorks,Clozure CL)
通常,解釋器和字節碼e引擎使用最小的內存量。因此CLISP非常小。 SBCL OTOH生成相對較大的本地代碼。
其次,有幾種不同的方法來創建應用:
- 保存圖像
- 節能優化圖像
- 編譯爲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代碼。
相關問題
- 1. 減少Common Lisp二進制文件的大小
- 2. ARM二進制大小
- 3. 二進制文件大小
- 4. MinGW二進制3x大小與MSVC二進制
- 5. 與Clozure Common Lisp的編譯二進制
- 6. 確定直方圖二進制大小
- 7. 優化QT的二進制大小?
- 8. 調整圖像大小二進制
- 9. 十進制到二進制使用符號,指數,大小
- 10. 在大二進制矩陣中計算小二進制矩陣的外觀
- 11. One的二進制補碼8位有符號的大小,以二進制
- 12. 從二進制最大堆中刪除第二小元素
- 13. 大十六進制到二進制
- 14. 爲什麼上傳的二進制大小比實際大小要小得多?
- 15. 減小Snap二進制文件的大小?
- 16. 小數二進制減法
- 17. 巨大的二進制文件的大小,而LD鏈接
- 18. ocaml的4.01.0→4.02.1,二進制大小變大
- 19. 最大的平衡二進制子樹的大小
- 20. 在未知大小的數組上進行二進制搜索
- 21. RLMException - 「二進制太大」
- 22. 二進制大小限制的iPhone,iPad和Univercel應用
- 23. 二進制中最小的二進制補碼
- 24. 十進制到二進制(二進制)
- 25. 將十進制轉換爲符號和大小二進制形式
- 26. 如何在Common Lisp中創建二進制流(不是文件)?
- 27. 在Common Lisp中讀取外部程序的二進制輸出
- 28. Emacs Lisp - 如何通過HTTP傳輸二進制文件?
- 29. 減少iphone應用二進制大小的有用方法
- 30. 將numpy數組的大小寫入二進制文件
謝謝你,那正是我在尋找的! –
ECL編譯爲C並通過使用共享庫生成相當小的可執行文件,但它在很多方面受到限制。 –
ECL將字節碼編譯器/解釋器和編譯器通過C編譯器編譯爲本地代碼。 ECL通常比SBCL和CCL慢,但產生非常小的二進制文件。我不確定@SamuelEdwinWard的意思是由於限制(除了速度較慢) - 它相當完整,並且具有許多功能。你能詳細解釋一下嗎? –