SBCLでスタンドアロンプログラム

需要あるかどうかはおいといて
standalone executablesをSBCLで作るには、sb-ext:save-lisp-and-dieを使います。

Hello Worldするとこんな感じ

(defun main ()
  (format t "Hello, World!"))
(sb-ext:save-lisp-and-die "cl-bin" :executable t :toplevel 'main)

これを保存(sample.lisp)して、

$ sbcl --script sample.lisp

とすれば、cl-binという実行可能ファイルが得られます。
これを実行すれば


$ ./cl-bin
Hello, World!

簡単ですね。

だがしかし

  /home/toshi/sample:
  合計 28328
  drwxrwxr-x.  2 toshi toshi     4096 2010-05-07 19:46 .
  drwx------. 97 toshi toshi     4096 2010-05-07 19:42 ..
  -rwxrwxr-x.  1 toshi toshi     4887 2010-05-07 19:43 a.out
  -rwxr-xr-x.  1 toshi toshi 28971036 2010-05-07 19:46 cl-bin
  -rw-rw-r--.  1 toshi toshi       75 2010-05-07 19:43 hello.c
  -rw-rw-r--.  1 toshi toshi      110 2010-05-07 19:46 sample.lisp


ファイルサイズでけえwww
28Mてw
CのHello, Worldプログラム(a.out)は4.8Kなのに。


Lispのプログラムとは、定義やデータをロードした、ある状態を指します。
つまりLispの実行可能ファイルとは、その状態のイメージをまるっとダンプしたものである、というわけ。
だからこんなにでかい。。。でかすぎだろ。。。