[SikiLanguage] [式鬼言語航海日誌]
2008-08-16
2008/08/16_231644ということで昨日の続きを……というよりも今日の第二回ですね。
「さっそくかね。で、何やるんだい?」
まずは基本的なデータ構造のCellについて簡単に。
式鬼言語では、何でもかんでもCellで構成されています。CellとCellの繋がりでプログラムが構築されていますし、操作の単位もCellが単位になります。コマンドもCell、データもCell。式鬼言語を動かすバーチャルマシンもCell。
「高々一つの構造体でそんなところまで表現できるんかね?」
いえいえ、もちろん実装言語(この場合C++)によるカスタマイズを柔軟に受けられるようにしています。実際にはコアとなる部分の多くがC++での操作ですので、まあ、ある意味誤魔化しですね。さすがにポール・グレアムのArcみたいにプリミティブを追求するところまでは行きません。
「プリミティブを追求するのも魅力的だけどな」
それもそうですが。まあ、それは将来の楽しみにしておきましょう。
まずは実際のCellの構造です。こんな構成になっています。
- Cell
- List: 双頭の列(キュー)
- Link: Cellを検索するマップ
- キーとなるCellから値となるCellを検索するマップ
- 高速にアクセス可能なレジスタ
- Master: 委譲するCellを管理
- Core: 実装言語とのインターフェイス
- コマンドとして実行した時の処理内容
- Cell毎の実装言語のデータ
- 実装言語の単語データ --> Cellの変換テーブル(ArchiveとしてCell全体で共有)
- その他実装言語からCellにアクセスするための各種テーブル(ArchiveとしてCell全体で共有)
「スタックして使用できるListと、辞書として使用できるLinkと……ちょっとしたForthマシンだね、こりゃ」
ええ、Forthマシンを各Cellに押し込んだ感じですね。ただ、通常Forthマシンはデータスタックとリターンスタックの2つを持っていますが、Cellには一つのListしかありません。ですので、式鬼言語のバーチャルマシンはいくつかのCellを組み合せて構成することとしました。最初は各Cellに複数のスタックを押し込んでいたのですが、柔軟性とかカスタマイズ性なんかを考えると各Cellに一つのListの構成の方が良かったんですよ。Cellの構造も簡素になりますし。
バーチャルマシンの話はちょっとややこしいので詳細は後ほど。
「そうすると、Cellはバーチャルマシンを作るのに必要そうな部分に絞り込んで定義した、つうことかね?」
まあ、そんなところですね。バーチャルマシンに必要な構成を考えたら便利そうな機能が一通り揃ったのでそれにした、という所ですか。レジスタはマップで代用可能なのですが、さすがにプログラムの駆動に係わる部分は負荷がかからないようにしたいので、とりあえずはレジスタありとしました。
「あとは……Coreは?」
Coreは……ここが最大の誤魔化しですね。Cell自体は統一された構造で全て同じように扱うことができます。しかし、先ほども言いましたが式鬼言語の場合はコマンドもCellで表現します。何もかも同じだとコマンドの動作も同じになりますので、とてもじゃないですがプログラムなんてできません。
「まあ当然だわな」
ですので、Cellの多様性の部分……汚ない部分も含めて一切合切をCoreの部分に押し込んで固めました。ついでなので実装言語のデータを活用する場合もここに押し込むことにしました。また、式鬼言語のプログラムソースのパースも実装言語側で行いますので、プログラムソース中の単語をCellに変換するのもCoreの一部(ArchiveというCell共通のオブジェクト)の仕事です。
極端な話、CellはCoreを通じて実装言語にプログラムを処理させるためのディスパッチャに過ぎないとも言えますね。
「ふうん。まあ、それを言い始めたら世の中のプログラム言語のほとんどがそうなるから、それはそれでいいんじゃないかね」
そういってもらえると助かりますね。
最後に残ったMasterはちょっと異質で、プロトタイプ指向(インスタンス指向)言語で良く使われる委譲を管理します。これについては別途まとめます。
で、このCellが互いに連携することでプログラムを実行します。次回は式鬼言語の駆動(バーチャルマシン)についてお話しします。
「数ヶ月後とかは無しだよ」
制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)