.NETからWolfram言語を呼び出す

はじめに

Wolfram言語から.NETを呼び出す」では,.NET/Link を使ってWolfram言語から.NETに呼出しをかけることができるようにし,既存および将来の.NETのクラスすべての機能性を含むようにWolfram言語環境を拡張するということについて触れた.このチュートリアルでは,Wolfram言語カーネルを計算エンジンとして使う.NETプログラムを書く手段として,逆の方向に .NET/Link を使う方法を示す.

.NET/Link は,プログラム間でデータやコマンドを送信するWolfram ResearchのプロトコルであるWolfram Symbolic Transfer Protocol (WSTP)を使用する..NET/Link プログラミングの概念とテクニックの多くは,WSTPのC言語APIのプログラミング用のものと同じである..NET/Link のドキュメントは,WSTPを使う.NETプログラムを書くために知っていなければならないことすべてについての百科事典的な概要を意図したものではない.プログラマーは,WSTPプログラミングについての一般的なドキュメントにも少し頼る必要があるかも知れない.そのチュートリアルは,このドキュメントと同じように2つの大きなセクションに分けられている.皆さんはその第2部を読まれるとよい..NET/Link が提供する関数の多くは,C言語と全く同じかほとんど同じものである.WSTPは,MathLink という名前であったので,.NET/Link のクラスとインターフェースの中には,そのレガシー名が使われているものもある.

ある時点で,少なくとも「Wolfram言語から.NETを呼び出す」にざっと目を通されるとよい..NETの「フロントエンド」は,Wolfram言語コードから.NETメソッドを呼び出して,ノートブックフロントエンドからカーネルを実行するときにプログラマーが使う引数として.NET オブジェクトを渡すために使用することができる.これは.NETとWolfram言語の間に大変高レベルのインターフェースを持つことができるようにする.WSTPプログラムをCで書くときは,文字列および整数といった単純なものを渡したり返したりすることについて考えなくてはならない..NET/Link では,.NETオブジェクトを.NETとWolfram言語との間で渡したり受け取ったりすることができる.

以下のセクションは,.NET/Link プログラミングのトピックについての概要を提供するにすぎない..NET/Link の主要なクラスごとの参照はAPIドキュメントに載っている.また例題プログラムも参考にするとよい.

このテキストを読んでいるとき,あるいは.NETもしくはWolfram言語でプログラミングをしているときには,.NET/Link のソースコードはすべて提供されていることを思い出されたい.あるものをどうやって動かすのか(あるいはどうして動かないのか)を見たい場合はいつでも直接ソースコードをチェックすることができる.

WSTP

Wolfram Symbolic Transfer Protocol (WSTP)は,プログラム間の交信を行うためのプラットフォームに依存しないプロトコルである.もっと具体的に言うと,これはWolfram言語の式を送ったり受け取ったりするための手段である.WSTPはノートブックフロントエンドとカーネルがお互いに交信し合える手段である.またこれはWolfram言語と他のプログラムあるいは言語をリンクする数多くの商用あるいはフリーウェアのアプリケーションやユーティリティでも使用されている.C言語関数のライブラリとして実装されている..NET/Link は,WSTPの機能を.NET にもっと簡単に使用できて,しかも生のCレベルのAPIよりももっと強力な方法で導入する.

主要な .NET/Link のインターフェースとクラスの概要

はじめに

.NET/Link クラスライブラリは,ユーザのコードを変更しないでも将来最大限に拡張できることを意図したオブジェクト指向のスタイルで書かれている.これには,インターフェースと実装の間のはっきりした分離が必要で,クラスではなくインターフェースを通して主要なリンクの機能性を公開することによって遂行される.これらのインターフェースを実装する具体的なクラスの名前は,プログラマーにとっては知る必要がなく,興味もないことであるので,ほとんど挙げられていない.むしろ,インターフェースの型の1つに属するオブジェクトを使うのである.直接インスタンスを作成することは決してないので,実際のクラスが何であるかを知る必要はない.その代りに,「ファクトリーメソッド」を使ってリンククラスのインスタンスを作成する.このことは,先を読み進むにつれて明らかになる.

このセクションでは,主要なインターフェースとクラスの概要が挙げられている.詳細については,後で触れる.さらに,.NET/Link APIドキュメントにクラスライブラリの完全ドキュメントがある.これらのクラスとインターフェースのほとんどはWolfram.NETLinkのネームスペースにあり,その他のものはWolfram.NETLink.UIにある.

IMathLinkとIKernelLink

ここで知っておかなければならない2つの最も重要なリンクインターフェースはIMathLinkおよびIKernelLinkである.IMathLinkインターフェースは基本的に.NETへのWSTP C APIのポートである.メソッド名のほとんどは,ベテランのWSTPプログラマーには馴染み深いものである.IKernelLinkIMathLinkを拡張し,リンクの向こう側がWolfram言語カーネル(メソッドWaitForAnswer()がその例で,これはリンクの向こう側が定義された一連のパケットで応えることを想定する)である場合にだけ意味がある重要で高レベルの便宜メソッドをいくつか加える.

基本的にIMathLinkインターフェースは,リンクの向こう側にどのプログラムがあるかということについて何も想定しなくてもリンクに実行できる操作すべてを含んでいる.IKernelLinkは,向こう側にあるのはWolfram言語カーネルであるという想定を加える.

ほとんどのプログラマーはもっぱらIKernelLinkだけを使って作業するので,これが最も重要なインターフェースである.もちろんIKernelLinkIMathLinkを拡張するので,IKernelLinkオブジェクトに使用するメソッドの多くは,IMathLinkインターフェースで宣言され,ドキュメント化される.

IMathLinkを実装するクラスで最も重要なものは,NativeLinkであり,これは直接Wolfram ResearchのWSTPライブラリに呼出しをかけるのでこのように呼ばれる.将来,ネイティブメソッドに依存しない他のクラス(例えばネットワーク間で交信するために.NETリモーティングを使うクラス)も加えられる可能性がある.上でも述べたように,自分のコードにリンククラス名をタイプしなくてはならなくなるようなことは決してないので,プログラマーはこれらのクラスが何であるかということを心配する必要はない.

MathLinkFactory

MathLinkFactoryはリンクオブジェクトを作成するために使うクラスである.これは,さまざまな引数列を取る静的メソッドであるCreateMathLink()CreateKernelLink()CreateLoopbackLink()を含む.これらはWSOpenをCプログラムで呼び出すのと同等である.

MathLinkException

MathLinkExceptionは,IMathLinkおよびIKernelLinkのメソッドの多くによって投げられる例外クラスである. .NET/Link APIは,WSTP C APIのように関数の戻り値を使う代りに,エラーを示すために例外を使用する.Cでは,以下のように戻り値をチェックするコードを書く.

.NET/Link では,tryブロックの呼出しをでラップしてMathLinkExceptionを捕まえることができる.

Expr

Exprクラスは.NETでWolfram言語式の直接表記を提供する.Exprは,式の構造についての情報を提供し,要素を抽出できるようにする多くのメソッドを持っている.これらのメソッドは,Wolfram言語プログラマーには馴染み深い名前や動作を持っている.Length()Part()NumberQ()VectorQ()Take()Delete()等がその例である.リンクから読み込むときに,入ってくる式の構造やプロパティを知るために低レベルのIMathLinkインターフェースメソッドを使う代りに,GetExpr()を使ってリンクからの式全体をただ読み込んでからExprメソッドを使ってそれを調べたり分解したりすることができる.リンクに書き出すためには,Exprオブジェクトを最も重要なIKernelLinkメソッドのいくつかの引数として使うことができる.

MathKernel

MathKernelは,Wolfram言語とインタラクトするための大変高レベルのインターフェースを提供する非可視の要素である.これはプロパティを通して高度に設定可能であるので,特に可視のプログラミング環境で使用することを意図したものである.計算にWolfram言語を使用する.NETプログラムの型の多くにとって,IKernelLinkインターフェースは理想的な機能を提供する.しかし,ある型のプログラムについては,MathKernelオブジェクトの方がもっと使いやすいとプログラマーは感じるかも知れない.これは,計算の結果を捕らえるだけでなく,メッセージ,Printの出力,グラフィックスのいずれかを計算の副作用として生成したいプログラムに特に言えることである.

MathPictureBox

MathPictureBoxクラスはWolfram言語のグラフィックスとタイプセット式を表示する簡単な方法を提供する.このクラスはしばしばWolfram言語コードから使われるが,.NETプログラムでも同じぐらい役に立つものである.

サンプルプログラム

.NET/Link の配布にはWolfram言語を起動して計算を行う簡単なテクニックを示すSimpleLinkのサンプルプログラムが含まれている.コードはC#とVisual Basic .NETの両方で使用できるようになっている.

プログラムを構築,配備する

.NET/Link アセンブリ

.NET/Link アセンブリファイルはWolfram.NETLink.dllで,これは<Wolfram dir>\SystemFiles\Links\NETLinkディレクトリの中にある..NET/Link を使う.NETプログラムをコンパイルするときは,このファイルへの参照を加える必要がある.前のバージョンの .NET/Link では,このアセンブリは.NETグローバルアセンブリキャッシュ (GAC) の中にWolframシステムインストーラによって置かれた.しかし .NET/Link 1.2からは,Wolfram.NETLink.dllアセンブリはもはや強く指定されていないので,GACに置くことができない.このため .NET/Link を使う.NETプログラムは,このアセンブリのコピーをそのアプリケーションディレクトリ(つまりその .exeファイルのすぐ隣に)置く必要がある.もう1つの方法として,.NETが強く指定されていないアセンブリをどのようにして探るかについての標準規則に従って,Wolfram.NETLink.dllアセンブリをアプリケーションディレクトリのサブディレクトリに置くこともできる.

Wolfram.NETLink.dllが強く指定されていないという事実から起る結果は,アプリケーションのコピーをアップデートされたバージョンに置き換えることができ,アップデートされたバージョンがアプリケーションを再コンパイルしなくても使えるようになるということである.それに対して,.NETの強く指定されたアセンブリは,厳しくバージョン化されているので,プログラムが特定のバージョンのアセンブリに対してコンパイルされると,プログラムはまさしくそのバージョンでしか実行することができない.もちろんこの厳しいバージョン化は.NETの利点として売り込まれており,特定の状況においては好都合であることもあるが,さまざまな技術的な理由から,Wolfram.NETLink.dllが強く指定されていることは望ましくない.

コマンドラインからコンパイルする

.NET Framework SDKには,C#およびVisual Basic .NETを含めたいくつかの.NET言語用のコマンドラインコンパイラが含まれている.Visual Studio .NETを購入しなくても,これらの無料ツールを使うことができ,Visual Studio .NETを持っている場合でも,簡単なプログラムを構築するのにこのツールを使ってみるとよいかも知れない.

コマンドラインコンパイラでは,いくつかのDOS環境変数が正しく設定されていることが必要であるので,.NET Framework SDKにはこれらの変数をDOSセッションで実行できるsdkvars.batと呼ばれるバッチファイルが含まれている.Visual Studio .NETを所有していて,コマンドラインツールを使用したい場合には,WindowsのスタートメニューでMicrosoft Visual Studioの.NET/Visual Studio .NET Tools/Visual Studio .NET Command Prompt項目を使い,すべての必要な設定と一緒にDOSセッションを起動する.

Wolfram.NETLink.dllのコピーをコンパイルする前にビルドディレクトリに置くと便利である.そうしないと,このアセンブリへの完全パスをコンパイラコマンドライン上に含める必要と,そのコピーをいずれにしてもプログラムのディレクトリに置く必要があるからである.以下の例では,Wolfram.NETLink.dllファイルを<Mathematica dir>\SystemFiles\Links\NETLinkからビルドを行っているディレクトリにコピーした(移動したのではない!)ことを想定している.これはC#プログラム用のサンプルコマンドである.

これはVisual Basic .NETで上に匹敵する例である.

上のいずれかのコマンドを使うと,MyProgram.exeファイルが現行ディレクトリに作成される.このプログラムを実行するためには,その横にWolfram.NETLink.dllのコピーを置く必要がある.

Visual Studio .NETを使う

.NET/Link を使うプログラムは,そのプロジェクトの設定でWolfram.NETLink.dllアセンブリへの参照を持っていることが必要である.アセンブリに参照を加えるためには,ProjectメニューからAdd Referenceを選択する.Wolframシステムインストーラは必要な設定を行って,Wolfram.NETLink.dllアセンブリがAdd Referenceのダイアログボックスに表示されるようにする.これは.NETタブでは .NET/Link 1.3としてリストされている.何らかの理由からそこに現れない場合は,単にBrowseボタンを使ってファイルを手動で見付ける(<Mathematica dir>\SystemFiles\Links\NETLinkディレクトリの中に,あるいはもしコピーを別のところに置いたのであればおそらくもっと便利な場所にあるはずである)とよい.

Visual Studio .NETがプログラムを構築するとき,それは自動的にWolfram.NETLink.dllのコピーを.exeファイルの横に並べて出力ディレクトリに置く.プログラムは,Wolfram.NETLink.dllのコピーが横にないと実行されないので,プログラムを別の場所に配備したり,他のユーザに配布したりする場合には,Wolfram.NETLink.dllファイルもそれと一緒に付けておく必要がある.

プログラムを配備する

.NET/Link を使用する.NETプログラムを構築して,他の人に配布したい場合は,Wolfram.NETLink.dllアセンブリのコピーをアプリケーションの.exeファイルの横に含める必要がある.もう1つの方法としては,強く指定されていないアセンブリを.NETがどのようにして探すかということについての標準規則に従って,Wolfram.NETLink.dllをアプリケーションディレクトリのサブディレクトリに置くこともできる.