用ECL編譯字符遊戲的跨平臺(Linux/OSX/WINDOWS)可執行文件

用ECL編譯字符遊戲的跨平臺(Linux/OSX/WINDOWS)可執行文件

說明

前面咱們用 CLISP 寫了一個代碼超簡短的字符遊戲, 不過每次運行時都須要經過 Common Lisp 來加載, 本文介紹一種能夠把 Common Lisp 代碼編譯爲可執行文件的方法: 用 ECLCommon 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, 暫時沒試驗, 後面試驗了再補充.

相關文章
相關標籤/搜索