前面咱们用 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
, 暂时没试验, 后面试验了再补充.