Common Lispコンパイラのテクニック
3914 ワード
ここ数日Common Lispを始め、興味深い問題に遭遇しました.CLは一般的に運行を説明しています.バイトコード(fasファイル)をコンパイルして生成できる実装もあります.私が使っている2つのCL実装はSBCLとCLISPで、前者は私が『実用Common Lispプログラミング』という本から見たもので、CLISPがSBCLに対しての特徴の一つはCLISPがLispをバイトコードファイルにコンパイルすることです(これはJavaと似ていて親しみやすい)が、マシンコードを直接コンパイルすることもできないので、アセンブリとC言語に執着している私の気持ちは非常に不快で、以前『Pythonコアプログラミング』で見た「sh-bang」を考えると、本当に通じる!次の例を見るとわかります.
(1)Lispファイル:test.lisp
(2)コンパイル及びその他:
(3)エディタでtest.fasを開いた後、最初の行に#!/usr/bin/clispを追加します.
(4)次にchmod u+x test.fasを実行する
(5)./test.fasを実行し、次のように出力します.
上記の例を実行する場合は、clispがインストールされていることを確認します.
私が言ったのはLispテクニックではありません.これは多くのShellがサポートしている特性にすぎません.最初の行に存在すれば!/XXX/XXXのようなコンテンツは、自動的にXXXを呼び出して以下の内容を説明するこの例では、/usr/bin/clispでtestを解釈する.lispのバイトコードファイルはclisp testを実行することに相当する.fas(でもなぜか、このように呼び出すのが気持ちがいい)、最後に溝を吐かなければなりません.「挿入コード」にはF#、Erlangがサポートされていますが、Lisp族言語はありません.Lispはあまりにも小さいのではないでしょうか.
(1)Lispファイル:test.lisp
1 (format t "hello,Common Lisp world!~%")
2 (defun sqr (n)
3 (* n n))
4 (format t "the square of ~a is ~a ~%" 5 (sqr 5))
(2)コンパイル及びその他:
1 $clisp -c test.lisp
2
3 #... ...
4
5 $vim test.fas
(3)エディタでtest.fasを開いた後、最初の行に#!/usr/bin/clispを追加します.
#!/usr/bin/clisp
(|SYSTEM|::|VERSION| '(20080430.))
#0Y_ #0Y |CHARSET|::|UTF-8|
#Y(#:|1 1 (FORMAT T "hello,Common Lisp world!~%")-1|
#18Y(00 00 00 00 00 00 00 00 20 01 DA 6B 01 33 01 15 19 01)
(#Y(#:|1 1 (FORMAT T "hello,Common Lisp world!~%")-1-1|
#19Y(00 00 00 00 01 00 00 00 21 17 DA AF 38 02 31 95 9E 19 03)
("hello,Common Lisp world!
")
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
|COMMON-LISP|::|*STANDARD-OUTPUT*|)
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
#Y(#:|2 3 (DEFUN SQR (N) ...)-2|
#20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01)
(|COMMON-LISP-USER|::|SQR| |SYSTEM|::|REMOVE-OLD-DEFINITIONS|
#Y(|COMMON-LISP-USER|::|SQR|
#17Y(00 00 00 00 01 00 00 00 26 02 AD AE 33 02 39 19 02) ()
(|COMMON-LISP|::|T| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|)
(|COMMON-LISP-USER|::|N|) |COMMON-LISP|::|NIL| 1))
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
#Y(#:|4 4 (FORMAT T "the square of ~a is ~a ~%" ...)-3|
#22Y(00 00 00 00 00 00 00 00 20 01 DA 6B 01 DC DC 6F 03 33 03 15 19 01)
(#Y(#:|4 4 (FORMAT T "the square of ~a is ~a ~%" ...)-3-1|
#39Y(00 00 00 00 03 00 00 00 21 19 DA B1 38 02 31 95 AF B1 31 90 DB B1
38 02 31 95 AE B1 31 90 DC B1 38 02 31 95 9E 19 05)
("the square of " " is " "
")
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
|COMMON-LISP|::|*STANDARD-OUTPUT*| 5. |COMMON-LISP-USER|::|SQR|)
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
(4)次にchmod u+x test.fasを実行する
(5)./test.fasを実行し、次のように出力します.
1 $ chmod u+x test.fas
2 $ ./test.fas
3 hello,Common Lisp world!
4 the square of 5 is 25
上記の例を実行する場合は、clispがインストールされていることを確認します.
私が言ったのはLispテクニックではありません.これは多くのShellがサポートしている特性にすぎません.最初の行に存在すれば!/XXX/XXXのようなコンテンツは、自動的にXXXを呼び出して以下の内容を説明するこの例では、/usr/bin/clispでtestを解釈する.lispのバイトコードファイルはclisp testを実行することに相当する.fas(でもなぜか、このように呼び出すのが気持ちがいい)、最後に溝を吐かなければなりません.「挿入コード」にはF#、Erlangがサポートされていますが、Lisp族言語はありません.Lispはあまりにも小さいのではないでしょうか.