IDL Virtual Machine (VM) は無償の IDLプログラムの実行環境である。有償のライセンスを必要としないので、ライセンスを持たない環境へのプログラムの配布時や、ライセンスの契約数を抑えたいときに便利である。
IDL Virtual Machineには次のような制限がある。
既存のプログラムをIDL Virtual Machineで動かす際によく問題になるのがEXECUTE関数とIDL_IDLBridgeオブジェクトの制限である。
sample という名前のプロシージャ (PRO sample
) を含むソースコード sample.pro
から SAVE ファイルを作成する。
.FULL_RESET_SESSION
.COMPILE sample
RESOLVE_ALL
SAVE, /ROUTINES, FILENAME='sample.sav'
詳細はVirtual Machine ApplicationsとCreating SAVE Files of Program Filesを参照。
IDL 8.0、8.2、8.3 でそれぞれSAVEファイルの前方互換性が失われたため、それ以降のバージョンのIDLでコンパイルされたSAVEファイルは、それよりも古いバージョンのIDLやIDL VMで利用することはできない(逆は可能)。詳細はCreating SAVE Files of Program Filesを参照。
lmgr(/vm)
は Virtual Machine で実行されている時に 1 を、Runtime または通常のIDL環境のときに 0 を返す。
lmgr(/runtime)
は Virtual Machine または Runtime で実行されている時に1 を、通常のIDL環境のときに 0 を返す。
EXECUTE関数は、実行時に文字列をIDLのステートメントとして解釈し実行する関数である。他の言語のevalに相当する。困ったことに、IDL Virtual Machineでの実行を想定していない古いプログラムでは頻繁に使われている。
EXECUTE関数は、変数名をプログラム内で動的に生成するのによく使われていた。SCOPE_VARFETCH関数を用いて書きかえられるかもしれない。SCOPE_VARFETCH関数は左辺値としても利用可能。
EXECUTE関数が構造体の名前やタグ名を動的に生成するのに使われている場合は、CREATE_STRUCT関数で書きかえられるかもしれない。
以上の理由でEXECUTE関数が使われている場合は、プログラムのデータ構造自体を見直したほうが手っ取り早いこともある。ハッシュを使うとか。
EXECUTE関数が例外処理機構として使われる場合は、CATCHプロシージャを用いて書きかえられるかもしれない。
EXECUTE関数が単に関数、メソッド、プロシージャを呼び出しているだけの場合は、CALL_FUNCTION関数、CALL_METHOD関数、CALL_PROCEDUREプロシージャ、COMPILE_CODE関数を用いて書きかえられるかもしれない。
IDL_IDLBridgeは子プロセスを生成するオブジェクトで、非同期処理や並列処理に用いられる。IDL_IDLBridgeを用いたプログラムをIDL Virtual Machineに移植するにあたっては、子プロセスで行っていた作業をすべて親プロセスで同期的に処理するよう書きかえるしかない(当然、アプリケーションの操作性は悪くなる)。
IDLの実行環境を持っていない場合には、まずHow do I download the IDL Virtual Machine?に従ってIDL VM環境を入手する。Full VersionのIDLがインストールされている場合には、別途インストールする必要はない。
SAVEファイルをIDL Virtual Machine modeで実行するには、Linux/mac では idl -vm=sample.sav
、Windows ではSAVEファイルをダブルクリックするか idlrt -vm=sample.sav
とする(注: 有効なライセンスを持つIDLがインストールされている環境でSAVEファイルをダブルクリックすると、そのライセンスが用いられ、Runtime modeで起動する)。詳細はStarting a Virtual Machine Applicationを参照。