はじめに

現代のコンピュータシステムのほとんどでは,コードを収集してライブラリにする方法が提供されている.これらのライブラリは,アプリケーションが構築されたときではなく,実行時にアプリケーションにロードできる場合は,ダイナミックであると言われる.アプリケーションが実行し始めてからのロードが可能であると,機能を追加するのに便利である.多くのプラグインアーキテクチャが,このようにロードされたダイナミックライブラリから構築されている.

Wolfram LibraryLink を使うと,ダイナミックライブラリをWolfram言語カーネルに直接ロードすることが可能となり,ライブラリの関数が Matheatica から即座に呼び出せるようになる.整数,実数,パックアレー,文字列等のCのようなデータ型だけでなく,任意のWolfram言語式も交換できる.さらにエラーを送り,Wolfram言語にコールバックするような便利な関数もある.

Wolfram LibraryからWolfram言語にLibraryFunctionLoadで関数がロードできる.

In[1]:=
Click for copyable input
Out[1]=

LibraryFunctionに整数の引数を与えて呼び出すことができる.結果も整数である.

In[2]:=
Click for copyable input
Out[2]=

表やその他のWolfram言語プログラミング構造の中で関数を使うことができる.

In[3]:=
Click for copyable input
Out[3]=

整数でない入力で関数を呼び出すと,エラーが生じ,入力がそのまま返される.

In[4]:=
Click for copyable input
Out[4]=

Wolfram Libraryを作る方法の一つに,それをCまたはC++で書き,C開発ツールを使うというものがある.以下に関数のソースを示す(Cコードの詳細は「Libraryの構成とライフサイクル」で説明されている).

DLLEXPORT int demo_I_I(WolframLibraryData libData, 
                mint Argc, MArgument *Args, MArgument Res) {
    mint I0;
    mint I1;
    I0 = MArgument_getInteger(Args[0]);
    I1 = I0 + 1;
    MArgument_setInteger(Res, I1);
    return 0;
}

機械整数以外にも,種々の形式を渡すことができる.

機械整数機械実数
機械複素数パックアレー
文字列一般式

Wolfram Library関数の代替方法

Wolfram Libraryから関数を直接ロードすることには,数々の利点と欠点がある.このセクションでは利点と欠点について見直し,代替方法について述べる.

Wolfram言語

代替方法の一つは,Wolfram言語を使うというものである.つまり,Wolfram言語プログラミングの通常の方法でコードを書くということである.以下に利点と欠点をまとめる.

  • Wolfram言語コードは素早く書け,実行するプラットフォーム用にコンパイルする必要がない.
  • Wolfram言語コードは使われていないメモリを自動的に集める.
  • Wolfram言語コードはセーフモードで実行される.プログラマーのエラーによってC関数がクラッシュするようにWolfram言語プログラムがクラッシュすることはない.
  • DLL関数は場合によってはWolfram言語で書かれたものより速いことがある.コア関数をDLLで書くことは,アプリケーションのパフォーマンスを改善する一つの方法である.もちろんアプリケーションが行列の操作等の多くのコア関数を呼び出す場合は,このような関数はWolfram言語ではすでに高度に最適化されている.
  • 他のライブラリとインタラクトしたい場合は,DLLから呼び出した方が便利で効率的であることがある.

WSTPアプリケーション

別の方法に,Wolfram Symbolic Transfer Protocol (WSTPを使うというものがある.つまり,Cプログラムとしてコードを書き,WSTPプログラミングインターフェースを使ってWolfram言語に接続するということである.以下に利点と欠点をまとめる.

  • WSTPアプリケーションは一般に別のプロセスとして実行されるので,WSTPプログラムがクラッシュしてもWolfram言語には影響しない.
  • WSTPインターフェースにより,Wolfram言語式はすべてアプリケーションから読み書きできるようになる.しかし,WSTPを使えばDLL関数とも通信できる.したがって,これは利点でも欠点でもない.
  • WSTPインターフェースではWolfram言語とWSTPアプリケーションを異なるマシンで,異なるシステム上でも実行することが可能である.
  • ライブラリ関数を呼び出す際のオーバヘッドがWSTPインターフェースを使った場合より格段に低い.
  • ライブラリ関数から受け取る,またはライブラリ関数に渡す引数はデータを共有することができるので,メモリ消費と大量のデータをコピーするための時間が節減できる.
  • Wolfram言語はWSTPアプリケーションの結果を待っているときは,ユーザインターフェース操作等に必要な割り込み型計算に使用することができる.ライブラリ関数の実行中にこれを行うのは,ライブラリの作者にとって容易ではない.
  • ホストのWolfram言語プロセスが実行を停止すると,ライブラリ関数も停止する.WSTPアプリケーションの場合は,Wolfram言語が停止したときに停止しないという保証はない.
  • WSTPでは32ビットおよび64ビットのアプリケーションが接続できる.ライブラリは実行中のWolframシステムに対応するバイナリでなければならない.