前面咱們用 CLISP
寫了一個代碼超簡短的字符遊戲, 不過每次運行時都須要經過 Common Lisp
來加載, 本文介紹一種能夠把 Common Lisp
代碼編譯爲可執行文件的方法: 用 ECL
把 Common Lisp
程序編譯爲可執行文件.面試
這裏稍微介紹一下 ECL
-Embedded Common Lisp
, 也就是嵌入式 Common Lisp
, 它採用了一種不一樣於其餘 Common Lisp
實現的內部處理, 具體說就是把 Common Lisp
代碼翻譯爲標準 C
代碼, 而後調用系統上的 gcc
進行編譯. 因此使用 ECL
的前提是安裝好 gcc
編譯器.函數
正由於 ECL
的這種內部處理機制, 因此只要是符合 ANSI Common Lisp
標準的代碼均可以由 ECL
編譯爲可執行文件.oop
並且由於調用了 gcc
進行實際的編譯連接, 因此生成的可執行文件體積很是小.學習
compile-file
, 用於把 Common Lisp
源代碼編譯爲 .fas
文件;c:build-program
, 用於調用 gcc
生成可執行文件;c::*delete-files*
, 用於設置是否刪除中間文件.假設要編譯的文件爲 c11-cn.lisp
, 咱們的編譯構建命令以下:ui
(setf c::*delete-files* nil) (compile-file "c11-cn.lisp" :system-p t) (c:build-program "c11-cn" :lisp-files '("c11-cn.o")) (quit)
就以以前咱們的那個字符遊戲經過 Land of Lisp 中的超簡短字符遊戲例程學習 loop 和 format爲例, 把它編譯爲可執行文件, 在 OSX
系統上執行上述命令後, 會生成可執行文件 c11-cn
, 以下:.net
Air:ecl admin$ ls -al c11-* -rwxr-xr-x 1 admin staff 16004 12 19 01:30 c11-cn -rw-r--r-- 1 admin staff 7898 12 19 01:30 c11-cn.c -rw-r--r-- 1 admin staff 1011 12 19 01:30 c11-cn.data -rw-r--r-- 1 admin staff 527 12 19 01:30 c11-cn.eclh -rw-r--r-- 1 admin staff 2389 12 19 01:28 c11-cn.lisp -rw-r--r-- 1 admin staff 33652 12 19 01:30 c11-cn.o Air:ecl admin$
看看執行的效果:翻譯
Air:ecl admin$ ./c11-cn | | | | | | | A A | | A | | | | | | A | | @ | | A A | | A A | | | | A | | | | | | A | qwe/asd/zxc 用來移動, (t)eleport-瞬移, (l)eave-離開:
能夠看到, 可執行文件很是小, 僅僅 16k
, 跟其餘 Common Lisp
實現動輒生成幾十M
的可執行文件相比, ECL
生成的十幾K
可執行文件簡直就是小到極點了(固然小了, 由於原本就是用 gcc
生成的).code
可是該有的功能一點也不缺, 並且還具有跨平臺的優點.orm
在樹莓派的 Raspbian
系統下進行編譯的命令是同樣的, 不過可執行文件要稍微大一些, 48k
, 以下:blog
pi@rpi ~/code-staff/ecl $ ls -al c11-* -rwxr-xr-x 1 pi pi 48564 Dec 19 00:01 c11-cn -rw-r--r-- 1 pi pi 7184 Dec 19 00:01 c11-cn.c -rw-r--r-- 1 pi pi 990 Dec 19 00:01 c11-cn.data -rw-r--r-- 1 pi pi 527 Dec 19 00:01 c11-cn.eclh -rw-r--r-- 1 pi pi 2386 Dec 19 00:01 c11-cn.lisp -rw-r--r-- 1 pi pi 130 Dec 18 17:22 c11-cn-make.lisp -rw-r--r-- 1 pi pi 36344 Dec 19 00:01 c11-cn.o -rw-r--r-- 1 pi pi 114 Dec 18 21:01 c11-make.lisp pi@rpi ~/code-staff/ecl $ ./c11-cn | | | | | A| | A | | | | A | | A A | | | | @ A | | A | | A | | | | A | | A | | | | | qwe/asd/zxc 用來移動, (t)eleport-瞬移, (l)eave-離開:
在 WINDOWS
下編譯應該是同樣的, 不過須要預先安裝好 gcc
, 暫時沒試驗, 後面試驗了再補充.