Interactive Data Language

**Interactive Data Language** (**IDL**) は、科学技術計算でよく使われるデータ分析用プログラミング言語である。

なおインタフェース記述言語 (Interface Definition Language) もIDLと略記されるが、全く関係ない。本記事ではInteractive Data Languageの意味でIDLという略称を使用するものとする。

## 概要
IDLはベクトル化された数値を扱う対話型の言語であり、大量のデータを対話的に処理するのに使うのが一般的である（例えば画像処理など）。構文はFORTRANに近く、一部C言語に似ている。

IDL はVAX/VMSのFORTRANから発祥しており、構文にもその痕跡がある。
 x = findgen(100)/10
 y = sin(x)/x
 plot,x,y
ここで、findgen という関数は浮動小数点数の1次元の配列を返すもので、その値は0から始まる整数の列と同じである。

上の例で2行目はベクトル化された処理を行っており、1行目で生成された100要素の配列全体を処理している。これは汎用の配列プログラミング言語（APLやJ）と似ている。この例ではゼロ除算も含まれている（x の先頭の要素が0であるため）。その場合IDLは算術オーバフローを通知するが、配列 y の対応する箇所（先頭）には NaN を格納して処理を続行する。NaN は3行目の plot コマンドで描画する際には無視される。

他の多くの配列プログラミング言語と同様、IDLのベクトル操作は非常に高速だが（高度に最適化されたFORTRANやC言語のループに匹敵する）、配列の各要素に個別に処理をすると非常に遅くなる。従ってIDLを使うなら、大量のデータにベクトル処理を施す場合が適している。

## 歴史
IDLの元となったバージョンは1970年、コロラド大学ボルダー校の大気宇宙物理学研究所 (LASP) が開発した。LASP のデビッド・スターンは科学者が自分でプログラミングして仮説を検証したりアプリケーションを修正できるようにするプロジェクトに関わっていた。スターンが開発した最初のソフトウェア Rufus が後のIDLにつながっていった。Rufus はPDP-12で動作する単純なベクトル計算器であった。Rufus をPDP-8に移植したのが Mars Mariner Spectrum Editor (MMED) である。MMED は LASP の科学者らがマリナー7号とマリナー9号のデータを解析するのに使った。その後、スターンは SOL という言語を書いた。これもPDP-8上で動作する。Rufus や MMED が電卓的だったのに対して、SOL は FORTRAN 風の構文の本格的プログラミング言語になっていた。SOL には配列処理機能だけでなく、簡単なグラフィック機能もあった。

1977年、スターンは LASP を離れ、Research Systems Inc. (RSI) を設立した。RSIの最初の製品はPDP-11向けのIDLであった。この時点でIDLがサポートしていたグラフィックスは、使える端末が限られていた（テクトロニクス製やラスターグラフィック端末）。RSIはこの最初のIDLのライセンスを1979年にNASAのゴダード宇宙飛行センターとボール・エアロスペースに売却した。2年後、RSIは最初のVAX/VMS版IDLをリリースした。これは VAX-11 MACRO と FORTRAN で書かれていた。VAX の仮想記憶と32ビットのアドレス空間を生かした製品である。アメリカ大気研究センター (NCAR)、ミシガン大学、コロラド大学ボルダー校、アメリカ海軍調査研究所などがこのバージョンからIDLを使い始めた。

1987年、RSIはUNIX向けIDLの開発に取り掛かり、VAX版をそのまま移植するのではなく、完全にC言語で書き換える必要が生じた。スターンと Ali Bahrami がSun-3向けにIDLを書き直したが、同時に言語の仕様も改良した。その後、IDLは拡張と各種プラットフォームへの移植がなされ、Linux、Microsoft Windows（1992年）、Mac OS（1994年）などでも動作するようになっていった。

1992年、IDLにウィジェットが追加され、イベント駆動型のグラフィカルユーザインタフェースのプログラミングができるようになった。1997年、Webサーバ上で動作する ION (IDL On the Net) が商用リリースされた。IDLで書かれたアプリケーション ENVI は1994年にリリースされた（リモートセンシングにおけるマルチスペクトル画像やハイパースペクトル画像の処理ソフト）。ENVI を開発したのは Better Solutions Consulting, LLC で、2000年10月、RSIと同時にコダックが ENVI の権利を買収した。それ以前、RSIはBSCとのライセンス契約に基づいて ENVI の販売・マーケティング・サポートを行っていた。1997年には、IDL に限定的なオブジェクト指向機能を追加している。

IDL は宇宙開発関連で広く採用されている。欧州宇宙機関はジオットが撮影したハレー彗星の画像をほぼ全てIDLで処理した。ハッブル宇宙望遠鏡の主鏡の不具合を調整する際にもIDLが活用されている。1995年、スペースシャトルの乗組員がノートパソコンにIDLをインストールして携行し、紫外線放射の研究に使用した。また、STEREOの SECCHI の収集データの分析にもIDLが使われている。

RSI は2004年3月、ITTの完全子会社となった。2006年5月15日、RSI は ITT Visual Information Solutions に改称された。さらに2011年10月31日に、分社化の結果、Exelis Visual Information Solutionsとなった。

## 特徴
* 動的型付け
* 単一の名前空間
* 元々はシングルスレッドだったが、現在はマルチスレッド機能を持つ。
* 関数の引数は参照渡し。ただし、後述する問題がある。
* キーワードと呼ばれる名前付きパラメータがあり、参照渡しで渡される。サブルーチンコールの入れ子における名前付きパラメータの継承が可能。
* 変数を事前に宣言する必要がない。ただし、ルーチン間で共有する広域変数を宣言するCOMMONブロックがある。
* 基本的なオブジェクト指向プログラミングが可能で、Smalltalkにやや似ている。ポインタやオブジェクトは1つのヒープ領域で実装している。IDL 8.0 でガベージコレクションがサポートされた。
* コンパイラはPコードマシンのコードを生成する。
* 大きな配列からデータを抜き出すインデックス範囲指定方法を持つ。
* 整数には各種サイズがあり、浮動小数点数も単精度と倍精度があり、複素数型もある。
* 文字列型、配列、ハッシュテーブル、リスト、各種データ型を格納できるレコード構造などの複合データ型もある。

## 問題
IDLは対話的に利用する場合は便利だが、大規模なプログラムを構築するのが難しい。名前空間が単一である点も問題だが、オブジェクト指向機能を使えば問題を若干緩和できる。配列の配列（ジャグ配列）を作れないといった問題もある。

配列は参照渡しされ、サブルーチンで生成した配列を返すことが可能だが、渡す前に配列のコピーをして配列範囲から変数が溢れないようにしている。これは驚き最小の原則に反している。

出自が実用本位であるため、様々な過去のしがらみが残っており、プログラマがそれに個別に対処しなければならない。例えば、配列のインデックス指定とサブルーチン呼び出しは括弧も含めて全く同じ見た目にできる。この曖昧さと全ての変数やサブルーチンの名前空間が単一であることから、新たに変数やサブルーチンを追加する際は、名前が衝突しないかを毎回調べる必要がある。このため、配列のインデックス指定には角括弧を使うようにしているプログラマが多い。同様の配慮はコンパイラディレクティブを使う際にも必要となる。

IDLを開発したRSIは、他の環境とのデータ互換を防ぐ明示的措置をとっている。IDLがセーブするデータファイルのフォーマットは単純なタグ付きデータ構造であり、その詳細は非公式に公表されているhttp://cow.physics.wisc.edu/~craigm/idl/savefmt.pdf。しかし、そこには次のような文言がある。「IDLのセーブ/リストアファイルはIDLプログラムの公表されていない独自情報である。従って、このファイルのリバースエンジニアリングはIDLのエンドユーザーライセンス契約に違反する可能性がある。…RSI以外が提供するソフトウェアがこのファイルの読み書きをする場合、RSIとのライセンス契約が必要である。…」

## 例
以下のグラフィックスは、IDLを使って生成されている（画像リンク先をたどっていくとソースコードがある）。


画像:Random-data-plus-trend-r2.png|傾向のある無作為データ（傾向推定参照）
画像:Epica 18 plot.png|EPICAとボストークコアの比較（氷床コア参照）


## 参考文献

*

## 関連項目
* 数値解析ソフトウェア
* IRAF

## 外部リンク
*IDLの製品ページ

*NASA GSFC IDL Online Help
*Coyote's Guide to IDL Programming
*FL (Fawlty language) web page IDL互換。オープンソースではないがフリーウェア
*GDL - GNU Data Language GNU版IDL