名古屋大学 工学研究科 情報工学専攻 修士学位論文

「数値計算ライブラリのインターフェースに関する研究」(19932月提出)の要旨

神戸 隆行(20001月作成)


数値解析分野では伝統的に数多くのライブラリがFORTRANで書かれてきたが、FORTRANは古い言語でもあり、それで書かれたライブラリのプログラミング・インターフェースはあまり洗練されていなかった。例えば、ライブラリのサブルーチンには様々な意味合いの引数が雑然と並び、共有ブロックを利用すれば制約が多くモジュール化の障害になる。

このような状況を改善するのに型がどのように役立つかを確認することと、そのような型の導入が実行効率に悪影響を与えないことを確認するため、NUMPACという既存のFORTRANの数値計算ライブラリに対して強い型付けが可能な言語でそれらをラップするコードを作成した。インターフェースを記述する言語としては、強い型付けが可能な言語の中からC並みに実行効率が確保しやすく、処理系が普及しているC++を選んだ。

ライブラリ・ルーチンをラップする際には、そのルーチンが対象としている数学的な構造、特に代数的な構造に注目し、それをC++のクラスとして型定義することによって表現した。例えば、線形代数は行列のクラス群とベクトルのクラス間の代数的な演算としてまとめ、級数展開、級数の評価、数値積分、補間はすべて関数のクラス群の初期化と評価の部分にまとめた。

線形方程式の解法や、積分公式、級数展開など、僅かな適用条件の違い、算法の不安定性や悪条件の問題などでよく似た数学的対象について複数の異なるアルゴリズムやデータ構造が利用可能な場合は、潜在する数学的構造の差異を反映していると考えて一旦別々の型としてからそれらの要素を型のポリモルフィズムを利用して関連付けた。例えば、線型方程式の解法に関しては対称性や0要素の分布に基づいて行列をクラス分けした。言語に組み込みの関数型から解析的な関数型を分離した上で、数値積分アルゴリズムに関しては連続性の程度によって関数をクラス分けし、級数展開や補間に関してはサンプル点の与え方等によって関数をクラス分けした。また三角関数の周期性を表現しやすいアルゴリズムを利用にするためにラジアン・クラスを言語に組み込みの実数型から分離した。

こうして初期化時に決まる型の情報を利用して静的にライブラリ・ルーチンの選択することが可能になってライブラリ・ルーチンを呼び出す際のオーバーヘッドは抑えることができる一方で、ポリモルフィズムの効果によって初期化以外のライブラリ・ルーチンを呼び出す部分のコードは共通化できた。またクラス内に実装の詳細を隠蔽することによって利用する際の煩雑さが抑えられた(加えて論文では特に触れていないが、内部的に呼び出しているFORTRANコードと独立なものとすることもできている。)。

ポリモルフィズムの実現手法の選択にあたっても各手法の数学的な性質に配慮して適用を行った。例えば、総称(パラメタ付の型)は準同型の関係にある複数の型をまとめるために利用でき、包含(継承)は準同型の中でも特に部分構造の関係のある型をまとめるのに適している。型強制(暗黙の型変換)は要素単位の、多重定義は演算単位の写像を個別に定義して各型をアド・ホックに結び付けられる。総称や継承は強力だが適用可能な条件が厳しく利用可能な場面が限られる傾向があり、型強制や多重定義は適用条件が緩いものの定義が煩雑になり勝ちである。

このような性質を考え、以下のように実装を行った。総称は抽象的な関数型における定義域・値域や各型の演算精度の差異といったようなアルゴリズムとある程度独立した性質を持つ部分について利用した。包含は行列や関数のクラス分けを統合するために利用した。多重定義は上でも述べたような型に基づくアルゴリズムの選択と関連付けて利用した。型強制は数学的な対象に関する習慣的な同一視(簡単な例では実数としてのπの値とラジアン型のπを同一視できるなど)の表現に利用した。

このようにポリモルフィズムの実装手法の数学的な性質を考えることによって、数値解析ソフトウェアが取り扱う数学的対象と実装手法の間で整合性を保った設計が可能になった。

結論としては、代数構造や解析的な性質といった数学的構造をプログラミング言語の提供する型と関連付けることによってFORTRANで書かれた数値計算ライブラリの煩雑なインターフェースを整理し、理解しやすく、拡張しやすい数値解析向けのプログラミング・インターフェースを新たに構成することができた。一方、こうした型の導入は静的に解決可能な形で行うことができたので、実行時のオーバーヘッドは最小限に抑えられた。