2005年11月11日

MinCaml 0.0.3から0.0.9の変化

MinCamlの現在のバージョンである0.0.9の、MinCaml読解ノートを作成したときのもの(バージョン0.0.3に相当するようだ)からの変化を整理した。字面や表現上の変更を除くと概ね以下の通り。

言語仕様の変更

  • let recが関数定義を一つだけに簡略化された。相互再帰する関数をandで並べて定義することはできなくなった。

但し入れ子にすれば相互に呼び合う関数を定義することはできる。test/even-odd.mlを参照。

内部仕様・動作の変更

  • 言語仕様の変更を反映し、構文木(Syntax.t)と中間コード(KNormal.t)でLetRecの保持する関数を一つに変更。
  • Syntax.tからNEq, Ltを削除。Eq, LENotの組み合わせで代替する。KNormal.tの表現に合わせたもの。
  • 字句解析器は負の数値リテラルを単項マイナスと非負数値の2つのトークンとして返すようになった。
  • 浮動小数点レジスタはSPARCで使える16個全てを利用するようになった(以前は何故か8個だけだった)。
  • 定数畳み込みで即値の伝播を浮動小数点数についても行うようになった(以前は忘れられていた)。(記述は追加されたがコメントアウトされている。意図して外していることを示すためと考えられるが、改訂した読解ノートでも指摘したように浮動小数点数でもこれを避ける理由はないように思われる。)

最後の二件は以前にMinCaml読解ノートでも指摘した点が修正されたもの。

尚、浮動小数点レジスタ個数の変更に付随してエンバグしている(実害はない)。sparcAsm.mlでのco_freg_tableの計算において、ループ回数が一回多い。

実装の変更

この二点が両バージョン間の実質的な改良点と言える。

  • レジスタ割り当てコードの簡素化。参照した変数がレジスタ上にない場合の処理を、命令直前にRestore(退避した変数をレジスタへのロードする命令)を挿入した命令列のレジスタ割り当てに変換することで、問題を変数への代入時のレジスタ割り当てのみに帰着させた。
  • 仮想マシンコード生成において、レコード(クロージャまたはタプル)の要素を一括してロードまたはストアするコードの生成方法が改善された。同等のコード(同一ではない)を出力しながらもロジックは単純になった。

regAlloc.mlでは関数のレジスタ割り当てを行うhからg_repeatに渡される引数がAns(Nop)からAns(Mov(a))に変更されているのだが、これの狙いはよくわからない。

このほか、理解しやすさを狙いレジスタ割り当ての処理を弱めたバリエーションが付属するようになった(regAlloc.{notarget-nospill,target-nospill,target-earlyspill,target-latespill}.ml)。


この記事へのトラックバック
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。