言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Id 言語の出来るまで

イアンのやつ

よく大島さんの日記 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 の時になぜか存在する C ソースコードは、make newboot により stage2 の物をコピーして作成します。ということは、本当に最初に存在すべき Id 言語のソースコードはどこから来たのかという謎に行き着くわけですが、まさに自 分で靴紐を引き上げて空を飛ぶ如し謎めいた出自なわけです。

pepsi

噂では、Id 言語によってさらに C 言語を介さない jolt という新たな言語が実装されていて、 それは example/jolt ディレクトリにあって、さらにそれは VPU という VM のすごい奴で動くらしいのですが、どうもこれについては存在意義や開発方法が良くわからないので省略します。き っと既に大島さんが日記のどこかに(英語で)書いていると思います。