イアンのやつ
よく大島さんの日記 id:squeaker に出てくる「イアンのやつ」について書きます。「イアンのやつ」とは、今の所コンセプトとしての coke 言語の暫定的実装である idc および jolt コマンドの事らしく、http://piumarta.com/pepsi/ からダウンロード出来ます。最新版は、linux, mac, windows + cygwin どれでもコンパイル出来るのですが、色々依存があってややこしいのでバイナリをダウンロードして / 以下に展開するのがお薦めです。バイナリにはサンプルが含まれていないので、とちみちソースも落としておいた方が良いです。
idc コマンド
インストールすると idc コマンドが使えるようになります。idc とは、Smalltalk のような文法の Id 言語のプログラムをコンパイルする物で、例えばこんな雰囲気のソースコードです(idst-5.7/examples/hw/hw.c)。
{ import: st80 } [ 'Hello, world' putln. ]
コンパイルするには次のようにします。
$ idc hw.st
すると実行ファイル hw が出来るので、実行すると Hello, world と表示されます。
idc のソースコード生成
idc は、実際には Id 言語でかかれたソースコードから C プログラムを作成する変換器です。次のようにすると実際の挙動がわかります。-g で詳しく表示、-k で C ソースコードを残す、-g でデバッグシンボル付きです。
$ idc -v -k -g hw.st + /usr/local/lib/idc/i686-pc-linux-gnu/idc1 -I/usr/local/lib/idc/i686-pc-linux-gnu/ -I. -m hw.st -o hw.c + cc -I/usr/local/lib/idc/i686-pc-linux-gnu//include -g -Wall -Wreturn-type -Werror -D_GNU_SOURCE=1 -I/usr/local/lib/idc/i686-pc-linux-gnu/ -g hw.c -o hw -export-dynamic /usr/local/lib/idc/i686-pc-linux-gnu/libid.o /usr/local/lib/idc/i686-pc-linux-gnu/gc.a -ldl -lm + true hw.c
idc の実体はシェルスクリプトで、idc1 によって C ソースコードを生成し、cc に渡している事がわかります。ためしに生成された hw.c をのぞいてみると、いかにも機械が書いたソースコー ドだと感じられる事でしょう。また、この三行目の通りにやると、C ソースコードをコンパイル する事が出来ます。
idc の出来るまで
途中 C 言語を経由するわけですが、idc も Id 言語自体で書かれています。と言うか C 言語を 経由しないと僕のパソコンでコンパイル出来ないわけですが、そのプロセスは次のようになって います。
- make boot
- make stage1
- make stage2
ここまででコンパイルのプロセスは完了です。make boot の時になぜか存在する C ソースコードは、make newboot により stage2 の物をコピーして作成します。ということは、本当に最初に存在すべき Id 言語のソースコードはどこから来たのかという謎に行き着くわけですが、まさに自 分で靴紐を引き上げて空を飛ぶ如し謎めいた出自なわけです。