天竺に到達
西遊記のお話の中で孫悟空たちは天竺を目指して旅を続けました。ありがたいお経を手に入れる長い旅でした。私のLispの理想郷を目指した旅もver5.0で目標を達したように思います。記念に書き残しておこうと思います。
並列
私は主に前東北大学教授の伊藤先生のPaiLispを参考にしました。Lisp世界ではかなり早い段階で並列計算が試みられていました。英語圏の掲示板で当時のことを尋ねてみました。CM-1と*Lispのこと。InterLisp-Dのこと。当時において先進的な試みがなされていました。私はこれに感銘を受けました。Lispは技術において最先端を走っていたのです。
並列にはヒューイットによるアクタ理論があります。これはその後Elixirに採用されています。私はアクタ理論ではなく、PaiLispに見られるような親プロセスが子プロセスに計算を分割して、統合するタイプのモデルを選択しました。複数のプロセスが相互に通信をすることとなると複雑になり私の手には負えそうもありませんでした。そして私の興味は粒度の大きい計算を分割して高速化することにありました。
古典的な (plet forms body) (pcall fun x0 x1 .. xn) という並列構文をスタート地点としました。並列計算を当初マルチスレッド方式として取り組みました。さらにマルチプロセス方式、分散並列へと発展させました。それぞれの方式ごとに (mt-let ...) (mp-let ...) (dp-let ...) と命名してISLisp処理系の拡張機能として実装しました。
並列は現代において主要な題材だと思います。CPUは微細化の限界に達してマルチコア化に進んでいます。ゲーム用パソコンですと20コアのマシン販売されています。こういったハードを活かせたら面白いと思います。いずれは量子コンピューターの時代が到来することでしょう。しかし、それはまだまだ先のことなりそうです。並列計算、まだまだ面白い題材だと思います。
モジュール
ISLispはその基本部分をとりまとてISOに採用されました。コンセンサスを得ることが難しかったパッケージやモジュールは取り込まれませんでした。これは幸いだったかもしれません。Common-Lispのパッケージシステムは今となっては古臭いです。私はモダンなElixirのモジュールを参考にして(defmodule ...)を設計、実装しました。単純な仕組みです。
私が想定している使い方は学校における計算実験でした。単純で簡単に覚えられる仕組みの方が適しています。ISLispが産業用に使われることは今のところまあ、考えられません。簡単な仕組みで十分だと思っています。
インタプリタとコンパイラ
私の処理系はインタプリタとコンパイラを持っています。インタプリタは遅いです。私はインタプリタは動作確認、デバッグのためのものだと割り切っています。遅くて構わないのでデバッグ機能に力を入れました。プリントデバッグで済ますLisperもいるらしいのですが、これは私には信じられません。対話的なデバッグがLispの良さです。できるだけのデバッグ機能を入れました。インタプリタにおいてはエラーチェックも徹底してやりました。ISLisp規格はエラー処理も明確に規定されています。一方でコンパイラはエラーチェックは手抜きです。しかし、静的な解析によるエラーチェックはしっかりやっています。また、型推論器を装備しています。Lispはもともと動的型付けの言語設計ですから完全に型推論を行うことはできません。それでもできるだけエラーや警告でコンパイル時に検出できるようにしました。コードの最適化は末尾再帰最適化はしていますが、それ以外はGCCのコンパイラに委ねています。
知的なおもちゃ
私にとってLispは知的なおもちゃです。中西正和先生のLispの本に出合って以来、Lispは私の良き教師、友人です。Z80のような非力なパソコンでも動いていました。現在では高性能なCPUを搭載したパソコンは安価に手に入ります。メモリもギガバイトという広大なメモリ空間を使うことができます。CPUはマルチコアが普通です。20世紀の頃のスーパーコンピューターやLispマシンを軽々と凌駕しています。これを利用すればますます楽しいLisp遊びができるこでしょう。
一休み
この10年ほどLisp、Prolog、Schemeの処理系作りに没頭してきました。私は目標を達成しました。Lisp処理系の機能拡張はこれで終わりです。ソフトウェアにバグはつきものです。バグ潰しのメンテナンスだけをしつつ、このプロジェクトはひとまずの完成です。エレキギターを追求したり、プラモデルを作ってノンビリとしようと思っています。
Easy-ISLisp
このLisp処理系はOSSです。BSD2ライセンスで公開しています。ご自由にお使いください。
https://github.com/sasagawa888/eisl
それでは素敵なLISPライフを!