Information Processing Language

Information Processing Language（IPL)とは、1956年ごろからランド研究所およびカーネギー工科大学にてアレン・ニューウェル、クリフ・ショー、ハーバート・サイモンが開発したプログラミング言語。ニューウェルは言語仕様設計と同時にアプリケーションのプログラミングも行い、ショーはシステムプログラミング、サイモンはアプリケーションのプログラマとしてもユーザーとしても活動した。
一般問題解決のための各種プログラミング要素を備えている。例えば、リスト、連想(association)、スキーマ（フレーム）、動的メモリ確保、データ型、再帰呼び出し、連想探索(associative retrieval)、引数としての関数、ストリーム、協調型マルチタスク（ノンプリエンプティブ・マルチタスクのこと）などである。IPLはアセンブリ言語のスタイルだったが、リスト処理の概念を開拓した。

**言語仕様**
IPLは次のような要素を持つ。
# シンボル群。全てのシンボルはアドレスおよび名前付きセルである。後の言語のシンボルとは異なり、シンボルは1文字とそれに続く番号で構成され、H1, A29, 9-7, 9-100 のように書かれる。
## セル名が1つの英文字で始まる場合、regional であり、絶対アドレスを表す。
## セル名が "9-" で始まる場合、local であり、単一のリスト内でのみ意味を持つ。あるリスト内の 9-1 は、別のリスト内の 9-1 とは別物である。
## 他のシンボル（例えば番号のみ）は internal である。
# セル群。リストはそれぞれ相互に参照を持つ複数のセルで構築される。セルにはいくつかのフィールドがある。
## P は3ビットのフィールドで、そのセルを命令として実行する際の命令コードとして使われる。セルがデータの場合は未使用である。
## Q は3値のフィールドで、そのセルが命令として使われる場合は間接参照に使われ、セルがデータの場合は未使用である。
## SYMB はそのセルの値として使われるシンボルである。
# プリミティブプロセス群。現代の言語ではプリミティブ関数と呼ばれるものである。
IPLの主要なデータ構造はリストだが、多くの言語でのリストよりも複雑な構造を持っている。リストは実行も可能な一連のリンクされたシンボルから成り、それに加えて description list と呼ばれる属性名と値が交互に並んだリストが付属する。IPLには属性名を指定して対応する値にアクセスしたり値を変更したりするプリミティブがある。description list には（9-1 のような形式の）ローカル名が与えられる。下表は、S4とS5というシンボルを持つL1というリストと、それに付属するA1という属性にV1という値が対応しA2という属性にV2という値が対応している9-1という description list を示している。LINKが0となっているのは、リストの終端を意味する。100や101といったセル名は自動的に生成された内部シンボルであり無意味である。これらのセルはメモリ上ばらばらに存在する。L1は唯一の regional なシンボルなので、特別な場所に置かれグローバルに参照可能である。
IPLはリストを操作できるアセンブリ言語である。特別な用途のレジスタとして使われるセルが存在する。例えばH1はプログラムカウンタである。H1のSYMBフィールドは現在の命令の名前となっている。しかし、H1はリストとして解釈される。H1のLINKフィールドは今風に言えばコールスタックのトップへのポインタである。例えば、サブルーチン呼び出しではH1のSYMBをそのスタックにプッシュする。
H2はフリーリストである。プロシージャがメモリを確保したい場合はH2からセルを獲得する。逆にプロシージャが完了したらメモリをH2に置く。関数に入る際、引数リストはH0にある。関数から抜ける際には結果をH0に置く。多くのプロシージャは成功か失敗かを示すブーリアン型の結果を返すが、それをH5に置く。W0-W9という10個のセルは一時格納場所としてどこからでも使える。それらのセルに値をセーブしリストアする際にはプロシージャは「道徳的に束縛されている」（CACMの論文での言葉）。
Pフィールドでは8種類の命令を表せる。サブルーチン呼び出し、SからH0へのプッシュ/ポップ、SにあるシンボルとSに付属しているリストの間でプッシュ/ポップ、Sへの値のコピー、条件分岐といった命令がある。ここで、Sは命令のターゲットを意味する。SはQ=0ならSUMBフィールドの値を意味し。Q=1ならSYMBに名前があるセル内のシンボル、Q=2ならSYMBに名前があるセル内のシンボルの示すセル内のシンボルを意味する。つまり、Qはセルの間接参照のレベルを示している。条件分岐以外の命令では、次に実行すべき命令はセルのLINKフィールドが示している。
IPLには約150の基本処理のライブラリがある。例えば次のような処理が実装されている。- シンボル同士が等しいかどうかの判定- リストの属性を探す、セットする、消去する。- リスト内の次のシンボルを求める。リストにシンボルを挿入する。リスト全体の消去、コピー。- 算術演算（シンボル名を対象とする）。- シンボルの操作。例えばシンボルが整数を表しているか否かの判定、シンボルをローカルなものにするなど。- I/O操作- 関数型言語のイテレータやフィルターに相当する "generator" がある。例えば数値のリストに対して個々のセルについて二乗を計算して新たなリストを作るといったことができる。

**歴史**
IPLの最初の利用例は、『プリンキピア・マテマティカ』（バートランド・ラッセルとアルフレッド・ノース・ホワイトヘッドの労作）の中の定理を計算によって証明するデモンストレーションであった。サイモンの自伝 Models of My Life によると、このアプリケーションは人手によるシミュレーションで最初に試されたという。彼の子供たちを演算装置に見立て、各人にプログラムの状態変数を保持するレジスタの役目をするカードを持たせたという。
IPL は開発者自身の初期の人工知能プログラムの実装に使われた。Logic Theorist（1956年）、GPS（1957年）、コンピュータチェスプログラム NSS（1958年）などである。
IPL にはいくつかのバージョンがある。IPL-I（実装されず）、IPL-II（1957年、JOHNNIAC向け）、IPL-III（実装はされた）、IPL-IV、IPL-V（1958年、IBM 650、IBM 704、IBM 7090など広く実装された）、IPL-VI が知られている。
しかし、この言語はすぐにLISPに取って代わられた。LISPはほぼ同等の機能を持ちながら文法が単純でガベージコレクション機能を備えていた。

**後のプログラミング言語への影響**
IPLは次のようなプログラミング言語機能を初めて導入した。- リスト操作 - ただし、リストの要素はアトムのみで、リストのリストは作れない。- 属性リスト - ただし、他のリストに付属させる形である。- 高階関数 - もともとアセンブリ言語なので、関数呼び出しの際にはそのアドレスを計算する。IPLはこのアセンブリ言語の特性を一般化した。- シンボルによる計算 - ただし、シンボルは「文字＋番号」という形式であり、普通の単語は使えない。- 仮想機械
これら機能の多くは一般化され、洗練されてLISPに導入された。そして、LISPから後続の様々なプログラミング言語にも受け継がれた。

**関連著作**
 Newell, A. and F.C. Shaw. "Programming the Logic Theory Machine." Feb. 1957.  Proceedings of the Western Joint Computer Conference, pp. 230-240.- Newell, Allen, and Fred M. Tonge. 1960. "An Introduction to Information Processing Language V." CACM 3(4): 205-211.- Newell, Allen. 1964. Information Processing Language-V Manual; Second Edition. Rand Corporation Allen Newell, Englewood Cliffs, NJ: Prentice-Hall.- Samuel, Arthur L.: Programming Computers to Play Games. In: Advances in Computers, Vol. 1, 1960, pp 165-192 (esp.: 171-175).

**脚注**

**参考文献**
  Allen Newell, ハーバート・サイモン著の伝記。全米科学アカデミー - IPLに関する短い記述を含む-  History of Programming Languages: IPL-  Information Processing Language, FOLDOC-  IPL documents from BitSavers.-  LISP prehistory - Summer 1956 through Summer 1958. influence of IPL on LISP.