2004年02月16日 森川靖大
gtdata ライブラリは独自のオブジェクト指向スタイルで記述されています。
クラスは構造型として表現されます。
メソッドはサブルーチンで、 名前の衝突を避けるために総称宣言されています。
動的多相性はスーパークラスをサブクラス構造型へのポインタ群をまとめた構造型とすることで実現しています。
実例を示しましょう。
データアクセスをするには必ず変数を開かなくてはなりません。 変数を開くというのをFortran ではどう書くかというと、 たとえば
use gt4f90io type(GT_VARIABLE):: var type(VSTRING):: filename ... filename = "gtool.nc" call Open(var, filename)
のようになります。ある gtool 変数というのは type(GT_VARIABLE) 型の (Fortran の) 変数であらわされます。これを Open というサブルーチンに突っ込むと、変数が開かれるわけです。ではこの Open の実体はどこにあるかというと、gtdata_generic モジュールにその手がかりが書かれています。
! 一部省略があります interface open subroutine GTVarOpen(var, url, writable, err) type(GT_VARIABLE), intent(inout):: var type(VSTRING), intent(in):: url logical, intent(in), optional:: writable logical, intent(out), optional:: err end subroutine subroutine GTVarOpenByDimOrd(dimvar, var, dimord, ount_compact, err) type(GT_VARIABLE), intent(inout):: dimvar type(GT_VARIABLE), intent(in):: var integer, intent(in):: dimord logical, intent(in), optional:: count_compact logical, intent(out), optional:: err end subroutine end interface
ここで open というインターフェイスは GTVarOpen と GTVarOpenByDimOrd という2つのサブルーチンが提供するのであるといっています。上の例をコンパイルすると、単に Open と書いてあるところでコンパイラが引数リストに合う GTVarOpen を選択してくれるのです。GTVarOpen については別に書いたのでそちらを見てくださいね。
Fortran 90 言語では Open のような interface 文に書かれている名前を総称名、GTVarOpen などのような本当の名前を個別名といいます。引数の型の違うサブルーチンは同じ総称名を持つことができます。同様に、引数の型の違う関数は同じ総称名を持つことができます。gt4f90io ではこの総称名というメカニズムを使って多数のサブルーチンや引数を整理しています。
動的多相性をポインタで実現するアイデアは V.K.Decyk et al. (1998) から得たものです。これによって gtgraph 層はすべて GT_DEVICE と GT_OBJECT の操作であるかのように利用できますし、gtdata 層はすべて GT_VARIABLE の操作であるかのように利用できます。