PicoLispというLisp処理系があるのですがちゃんと触ったことがなかったので、本記事ではまずビルドをしてみました。
PicoLispとは
PicoLispはAlexander Burger氏によって開発されたLisp処理系です。シンプルかつ軽量、クリーンさを奨励し、簡潔なコードが特徴1のようです。また設計目標として「シンプルであること」「制限がないこと」「動的であること」「実践的であること」があったようです2。で組込みのデータベースエンジンやGUIライブラリも標準で含まれており、実用指向でもあるようです。英語版Wikipediaのページによると1988年から存在するようで、同ページにあるLisp処理系年代表に拠ればChez Scheme、Emacs Lisp、AutoLISPと同じ時期に生まれた、わりと古くからあるLisp処理系のようです。2016年からPilBox (PicoLisp Box)というPicoLispでAndriodアプリを開発するプロジェクトがスタートしたりと、まだまだ発展しつづけているようです。あとGitHubのorganizationを眺めていたらLLVM版PicoLispのプロトタイプとかありました。
ビルドする
x86-64アーキテクチャのGNU/Linuxを仮定して話を進めます。ubuntuにおけるbuild-essential相当のパッケージは導入しておいてください。
ソースをもってくる
まずはダウンロードページ https://software-lab.de/down.html から最新のソースコードを手に入れましょう。本記事執筆時点ではpicoLisp-20.6.tgzが最新でした。tar xf picoLisp-20.6.tgz
で展開してできたディレクトリpicoLisp
に移動しましょう。
ブートストラップに必要なファイルを持ってくる
次に、おそらくVMのコアであると思われる、各64ビットアーキテクチャ向けのアセンブリのソースコードを取得します。https://software-lab.de/x86-64.linux.tgz をwgetして、picoLisp
ディレクトリ内で展開します。
ちなみに展開して出てくるアセンブリ言語のファイルは、PicoLisp自身を用いて生成されているようでした。そして見直すと処理系のソースコードのほとんどがPicoLispで書かれているので、セルフホストを達成しているのですね。ひえー。
ビルドする
src64
ディレクトリに64ビット環境用のソースコードがあるので、これをmake
でビルドします。
これで完了です。ちょっと簡単すぎたかすごく簡単ですね。
起動してみる
ビルドが済んでいれば、picoLispディレクトリにあるpil
コマンドで起動できるようになります。ここでは文法などには踏み込みませんが、以下のようにするとHello Worldできます。
picoLisp$ ./pil
: (print "hello")
"hello"-> "hello"
余談、あるいは今後?
PicoLisp自体は「仮想機械の最小かつ有用なアーキテクチャは何か?」という問いに対する答えとして、プログラミング言語設計の研究を行ったその成果物だそうです3。リファレンスマニュアルにはPicoLispの下にある仮想機械のアーキテクチャについて詳しくドキュメントされているのですが、PicoLispのVMが直接扱えるデータ型は3つ(数値、シンボル、そしてリスト)しかないようです。そしてそれらの3つはVMのもっとも基本的なデータである「セル」(それぞれ64bitのcar部とcdr部のペア)で構成されます。これだけでもおもしろそうなのですが、リファレンスマニュアルではこれらのことについてデータ型のビット表現を例示しながら説明されるので、読むだけで汗が滲んできます。このあたりを掘り下げていきたいところですね。
そしてどうもPicoLisp、ラムダ式がないようです。Wikipediaをいま眺めていたら「クオートされた関数 (quoted function)」なるものがあるのでラムダ式がいらないようです。よくわからないので調べたら"Even small details make a difference!"なるドキュメントをみつけました。quote
の挙動がふつうのLispとは異なるようです。これも気になりますね。
しかもコルーチンもあるんかーい。