読者です 読者をやめる 読者になる 読者になる

[Haskell] 関数型言語 Gofer のソースを読み始めた

Real World Haskell―実戦で学ぶ関数型言語プログラミング
私も 過去に 入門Haskell―はじめて学ぶ関数型言語ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門 を読んでいるのですが、どうも Haskellという言語が腑に落ちません。
なぜだろうと考えると、Haskellは非常に抽象的だし、処理の仕組みに遅延評価、マッチング、型推論・・・などなどの不思議なもの満載です ^^;





私はブラックボックスをそのまま理解して使うというのが苦手で、やはり処理系がどうやってその言語をコンパイルしたりインタープリットしているかが解らないとどうも安心できないようです。

以前どこかで、Real World Haskell―実戦で学ぶ関数型言語プログラミングの訳者でもあるHaskell仙人の山下さんが Gofer というHaskellに似た小さな処理系(インタプリター)の言語があって、ソースが読めるよと言われていた(雑誌に書かれていたのかな?)で 論文ソースコード をダウンロードして読んで見ることにしました。

論文は英語で50ページ以上あります、しかも私は英語が苦手なのです ^^;
ただし論文は処理系の説明で、ソースコードと対応しているので、まず、論文で説明している コードを読んでから論文を読むことにしました。

ソースコードを読む環境を作る

GoferのソースコードC言語で書かれていて *.[chy] 全てで約 2万7千行あります。効率良く読むには関数の関係とかが簡単にたぐれるツールがあった方が良いと思い検索したところ ソースコードを快適に読むための GNU GLOBAL 入門 (前編) を発見したので早速使ってみました。 htags コマンドで関数にリンクの張られたHTMLが生成できるので、これを使って読むことにしました。

4章 Storage management

今日は、4章 Storage managementを読みました。処理系を下支えする処理系の中で必要なデータ構造を管理する部分です。
Goferの処理系(インタプリター)内にはたくさんのデータ構造があります。
例えば、TextはLispRubyのシンボル的なものや、Type Constructorsは型やデータの宣言、CellはLispでお馴染みのセルなど・・・
それぞれのデータ構造は構造体(struct)で定義され、実体は構造体の配列です。また、名前(Text)による参照を高速化する為のHashテーブルなども持っています。当然 Cell にはガーベッジコレクション機能があります。

Cellは リストの実現よりも、 pair で Gofer内の定数、コードなどとして使っています。この場合 fst(=car)にタグが入り snd(=cdr)に値が入ります。

それぞれのデータは整数値で一意に特定できるようになっています。Rubyのオブジェクトidと似た感じです。またデータに割り付いてない範囲の値を Small Integerとして使っているのも 多くのLispRubyと同じです。

また、ファイルからGoferのコード(スクリプト)を読み込んだり、読み込んだものをファイル単位で捨てる(各種データ構造も解放する)ことが出来るようになっています、その為に Moduleがあります。



たぶん、つづく。。。