Mathematica のソフトウェア工学

Mathematica は,今日までに開発されたソフトウェアシステムの中で最も複雑なもののひとつだろう.これはC/C++,Java,Mathematica の各言語で書かれた数百万行のソースコードから構築されている.

Mathematica のC言語コードは,特殊なメモリ管理およびオブジェクト指向の機能を備えたカスタマイズされたC言語で記述されている.また,Mathematica のコードは,ShareDumpSaveの機能が使われ最適化が図られている.

Mathematica カーネルを構成している各コード部の比率は次の通りである.言語処理とシステム機能30%,数値解析機能20%,記号代数機能20%,そして,グラフィックスとカーネル出力機能に30%のコード量が使われている.

コードのほとんどはアルゴリズムを記述したもので,非常に緻密なものである.中には単純な手続きやテーブルの参照操作をもとにしたコードもあるが,それらは主に高レベルの Mathematica 言語で直接記述されている.

1パーセントに満たない小さな部分を除き,カーネルのソースコードはコンピュータシステムに依存しない形で記述されている.

しかし,フロントエンドはそうはいかない.各コンピュータシステムに適したユーザインターフェース環境を提供しなければいけない.このため,コンピュータシステムごとに特別なコードが必要になる.フロントエンドのソースコードはC++ 言語で書かれており,その規模は,約70万行におよび,内20万行は式の表示に関するものである.また,5万〜10万行のコードはユーザインターフェースの環境を提供するためにある.

Mathematica はクライアント・サーバ形式の計算環境も提供している.具体的には,外部プログラムとの連結を行う MathLink を介すことによって,フロントエンドとカーネルの接続を達成している.MathLink はTCP/IPを基盤とするものや共有メモリを使ったものを含め,複数のトランスポート層をサポートする.

フロントエンドとカーネルは3つの独立した MathLink 接続を介して接続される.1つはユーザが開始する評価に使われる.2つ目はフロントエンドでDynamic式の値を解くために使われる.3つ目はカーネルがフロントエンドに,無効にしなければならないDynamicオブジェクトを知らせるために使われる.

Mathematica カーネルのCコード部分は一体性と一貫性を兼ね備えている.これらの機能は,カーネルの各部分における別の部分との相互通信を,Mathematica の式の交換を行うということを基本にすることで達成している.

このように,ソースコードのレベルで Mathematica システムは機能別に独立したモジュール構成になっている.構成上は独立しているが,処理上は,モジュール間で関数の呼出し合いが行われるため相互依存の形を取っている.事実,数値解析的な関数が代数計算アルゴリズムを呼び出したり,グラフィックス関連のコードで,一見全く関連がないような数学アルゴリズムが使われたりすることがよくある.

1986年に開発が始まって以来,Mathematica のコーディング作業に費やされた労力は,ほぼ約千人の開発者が1年間通しで費やす時間に匹敵する.さらに,プログラムのテストや動作確認にもそれ以上の労力が注ぎ込まれている.

Mathematica のバージョンが更新されるにつれ,コードの内容は大きく変貌している.カーネルのコードは,バージョン1で15万行だったのが,バージョン2では35万行になり,さらに,バージョン3では60万行,バージョン4では80万行,バージョン5では約150万行,バージョン6では250万行の大きさになっている.これまでの更新作業で加えられた変更により,バージョン6のコードはバージョン1とは似ても似つかないものになっている.後者が前者に占める割合は,数パーセントにしか満たない.

コードの詳細は変わっても,ユーザインターフェースの設計指針はいずれのバージョンでも変わってはいない.機能面においていろいろ強化されはしたが,Mathematica バージョン1で作成したプログラムは,そのほとんどが何も変更なしにバージョン6でも実行することができる.

New to Mathematica? Find your learning path »
Have a question? Ask support »