OCamlのソースをScalaに移植する為のノウハウ(1)

計画

ここのところ、OCaml製の MinCamlScala に移植しています。

リポジトリ: http://github.com/hsk/mincamlj/tree/

結構規模が大きいので、(約 2000 行とはいえ圧縮されているので大きいんです)
闇雲に作業をしているとモチベーションが続きません。
こういう場合は何らかの計画があるとモチベーションが継続出来ます。

ということに気がついてから、計画を立てました。

1.だいたいの構文をOCamlからScalaに書き換える。
 コンパイルは通らなくてもよいのでとにかく全部書き換えてしまいます。
 大きな力仕事はさっさと片付けてしまうわけです。
2.とにかく、コンパイルを通す。
 バグがあろうがなかろうが、とにかく、コンパイルを通します。
3.全体のプログラムが動くようになったら、バグを潰していく。

現状は2のコンパイルを通す段階で80%完了しています。

OCamlからScalaに移植する際の工夫や困った点がいくつかあるのでメモしておきます。

モジュール

OCamlの場合はファイル名.mlが1つのモジュールになります。
例えばmain.ml内で定義された関数fはMain.f、id.ml内で宣言された型tはId.tとして外部から参照出来ます。
また、Open IdとするとIdモジュール内の名前のIdを省略することが出来ます。

同じようなことをScalaですると移植が楽になります。
Scalaの場合はすべてのソースファイルのpackage は mincamlとしました。
その上で、モジュールに対応する物はobjectとして記述します。たとえば、Id.tを宣言したい場合は

// id.scala
package mincaml;
object Id {
  abstract class T
}

のように記述します。
また、OcamlのOpenに対応する方法はオブジェクトの継承を用いました。

// x86Asm.scala
package mincaml;
class X86Asm {
...
}
object X86Asm extends X86Asm{}
// Virtual.scala
package mincaml;
object Virtual extends X86Asm {
...
}

とするわけです。これでファイル構成は変えず、大きなデータの構造を変えることなく書き換えが可能になります。