|
2.13.5 補足:MathLinkプログラムの移植性
MathLinkの Mathematica側はすべてのコンピュータシステムで全く変更なしで動く.しかし,コン ピュータシステムによって外部プログラムに違いがあるのは避けることができない.
コンピュータシステムが異なると実行可能なバイナリも異なる.そのため,Install["prog"]を呼び出す場合,prog がそれを利用しようとするコンピュータ上で実行可能であることを確認する必要がある.

異なるコンピュータシステムにプログラムをインストールする
Mathematicaは,もしprogが通常のファイルであれば, Install["prog"]は単にそのファイルの実行を試みる. progがディレクトリであったらMathematicaはそのディレクトリ中の名前が$SystemIDに一致するサブディレクトリを探し,そのサブディレクトリ中のprogの名前のファイルの実行を試みる.

外部プログラムをコンパイルする代表的なUnixコマンド
外部プログラムの実行可能なバイナリがコンピュータシステムによって異なるとはいっても,Cで書いたソースコードは本質的に同じという場合がある.
しかし,Cのソースコードの移植性を高めるためには,気を付けるべき点もある.
まずはじめに,標準Cには含まれない機能,特殊なシステムで提供されているCのランタイムライブラリなどは利用すべきではない.さらに,セグメント化した,もしくは,その他の特殊なメモリモデルを扱うことを避けるようにすべきである.
インクルードファイル mathlink.hでは, MathLinkライブラリのすべての関数について標準Cのプロトタイプ宣言がなされている.もし使用するコンパイラがプロトタイプをサポートしていないのなら, #include "mathlink.h"の前に#define MLPROTOTYPES 0の指示子を与えることでプロトタイプ宣言を無視することができる.しかし,プロトタイプがサポートされていると,コンパイラは MathLinkライブラリ中の関数が適切な引数を与えられて呼び出されているかどうかを常にチェックすることができる.

C特有の型を扱う MathLink関数
コンピュータシステムとコンパイラによっては,C言語のintが longと同義のものがある.しかし,標準C言語では同様に int が shortと同義語であることも許している. MathLinkライブラリ関数を移植性を保って呼び出すには,ライブラリが使っているのと同じ型で利用することが重要である.
いったん MathLinkライブラリ関数にデータを渡すと,異なるコンピュータの異なるデータ表現にかかわる問題をライブラリ関数がすべて面倒をみてくれる.例えば, MathLinkはビッグエンディアンのマシンとリトルエンディアンのマシンとでデータを送受信する際,バイトを自動的にスワップしたり,できる限り精度を落とさないよう,浮動小数点数のフォーマットを変換したりする.

一般的な文字列を処理する
字列は通常のASCII文字だけからなることが普通である. しかし, Mathematicaではすべての種類の特殊文字を含む文字列を扱うことができる.それらの文字は 2.8.8で説明した文字コードUnicodeでMathematica中で表現されている.
C言語の char *文字列中のひとつひとつの文字は,通常8ビットで保持できる文字である.しかし,文字コードUnicodeでは16ビット全部を使う. 結果として, MLPutUnicodeString()と MLGetUnicodeString()ではunsigned short型の整数配列を用いて文字列を表現する.
もし,プログラムに特殊文字を扱う必要がなかったら,MLPutByteString()とMLGetByteString()を使うことが便利だろう.それらの関数はすべての文字を直接8ビット文字コードで表現する.Mathematicaから特殊文字が送信されてきたら, MLGetByteString()はそれらを指定した固定のコードに変換する.

移植可能な MathLinkプログラムを書くための注意点
Unixモデルに立脚したCのランタイムライブラリをもつコンピュータシステムやコンパイラであれば, MathLinkプログラムのメインプログラムとして,MLMain(argc, argv)を呼ぶだけの main(argc, argv)があれば問題ない.
しかし,コンピュータシステムやコンパイラによっては違った形式のメインプログラムが必要になるものもある.main()中で MLMain()を呼ぶ前に必要な初期化を行うことも可能である.しかし, MLMain()を呼んだあとはMathematicaにつながったリンクが閉じられるまで,Mathematicaからのリクエストに応答するという無限ループに入ってしまうため,コントロールは戻ってはこない.
|