プログラミング言語マスターへの道


LISP

LISとは、1960 年代初期にジョン・マッカーシー氏によって発表された関数型プログラミング言語です。FortranとCOBOL に続く、現代でも使われている最古のプログラミング言語の 1 つと考えられるでしょう。当初は人工知能の開発を中心に LISP のコミュニティが形成されていましたが、人工知能ブームが去り、パーソナルコンピュータの時代が到来すると共にその影を落としていきました。1970年代中ごろには、LISPベースでプログラミングに必要な言語機能を極限まで抽象化したschemeが発生し、こちらも現在の主流の一つになっています。LISPは現在でも広く使われている年代物の言語の一つです。

もっとLISP

現代でも、LISPを研究するための教育用LISPシステムと、GNUのLISPコンパイラなどが存在していますが、最も有名なのは Emacs に搭載されているLispでしょう。これは、Emacs Lispと呼ばれ、テキストエディタの機能拡張を行うためのスクリプトとして利用されています。
もうひとつ、実用されている有名なLISPとしてはSchemeが挙げられます。Scheme言語はLISP方言の関数型プログラミング言語で、LISP系言語の中でも最も簡素な仕様を持つことから人気です。
どちらにしても、現代ではWindows系の開発者よりも、UNIX系の開発者に馴染みのある言語と言えるのではないでしょうか。

LISPのメリット

開発の第一線ではあまり利用されていないLISPを開発者が学習する最大のメリットは、関数型言語を体験することです。近年はC言語を中心とした手続き型と手続き型をベースにしたJavaなどのオブジェクト指向型言語が中心となっています。
そんな中、LISPの関数型プログラミングは新しい刺激となるに違いありません。EmacsLispやScheme 言語など、LISPには数多くの方言が存在し、誕生当時から比べると多くの類似システムが開発され、それぞれが LISP 継承しながら独自の言語仕様を策定していました。
80年代後半から、LISPの統一した言語仕様を策定する作業が開始され、1994年にANSI がCommon Lispを定義しています。
そのため、最も標準的なLISPといえば、現代ではANSICommonLispだと考えられます。ただし、近年もオブジェクト指向機能を追加した国際標準のISLISP等も策定されており、今後の主流はISLISPとなる可能性が高いのではないでしょうか。

LISPの特徴

LISPは比較的容易に実装できるため、非常に多くの方言が存在します。関数型言語に分類されますが、ほとんどのLISP方言は、変数への束縛だけでなく、代入やデータ構造の破壊的操作も可能という、手続き型言語の特徴もあります。

LISPの歴史

ジョン・マッカーシー
ジョン・マッカーシーによるLISPの着想は1956年夏の「Dartmouth summer research project on artificial intelligence」(人工知能についてのダートマス大学夏季研究プロジェクト)にさかのぼります。H. Gelernter、J. R. Hansen、C. L. GerberichがIBM 704上のFORTRANでリスト操作をおこなうサブルーチンのパッケージとして1958年にFLPL(FORTRAN list processing language)を実装しました。
プログラミング言語としてのLISPは1958年の秋に実装が始まりました。データ構造のS式やその関数は、実装するコンピュータに依存しないよう設計しました。当初のLISPは、ソースの式を、その式の値を計算する機械語のプログラムに変換する、コンパイラとして実装されました。1960年に論文「Recursive functions of symbolic expressions and their computation by machine, Part I」(記号表現の再帰的関数とそれらを用いた機械計算、第一部)をACMの学会誌「Communications of the ACM」(コミュニケーションズ・オブ・ジ・ACM)に発表します。LISPで書かれたLISPインタプリタ(w:Meta-circular evaluator)であるところのevalについて、マッカーシーはその概略を論文では示しています。
しかし実装可能であるとは考えていませんでした。マッカーシーのもとで大学院生であったスティーブ・ラッセルは論文を読んで、evalを機械語に変換したコードを実装してみせ、マッカーシーを驚かせました。そうしてLISPインタプリタが生まれました。
evalの実現
evalの実現は、チューリングマシンにおける万能チューリングマシンに相当します。(当初LISPプログラムの表現法としていた)M式を、LISP自身が扱うデータ構造に変換したS式は、万能チューリングマシンの入力(テープの初期状態)として与えられるチューリングマシンの記述に相当します。
マッカーシーはLISPプログラムのS式による表現を、evalを考えるための論文の中だけのものと考えていて、実際のプログラムをS式で書くようになるとは考えていませんでした。
当初のLISP
LISPは当初IBM 704上で実装されましたが、その計算機のレジスタを構成する部分の名前が、LISPの基本操作car(content of adress part of register)、cdr(content of decrement part of register)の由来となりました。ほとんどのLISPの方言において、carとcdrはそれぞれlistの最初の要素と、最初の要素以外を返す関数の名前となっています。
その表現力と柔軟性によって、LISPは人工知能のコミュニティで人気を持つようになりました。しかし、その実行には大量のメモリ空間を必要とし、ガベージコレクションを行う必要があるという弱点も持っています。この結果、LISPは貧弱なハードウェア上では実行が困難でした。
1970年代のLISP
1970年代には、増加するユーザコミュニティと寛大な政府の資金提供によって、LISPプログラムの実行に特化したLISPマシンが開発されました。LISPは実装の容易さゆえに非常に多くの方言を生みました。
マクロを用いれば文法構造それ自体を拡張できるので、ある意味では利用者ごとに方言があるとさえいって良いかもしれません。大きく分けてMACLISP系とInterlisp系の二つの主流が存在し、後のLISP方言に影響を与えています。
1980年代からのLISP
1980年代と1990年代には、たくさんのLISP方言を一つの言語に統合しようという努力がなされました。その結果として設計された新しい言語Common Lispは基本的にそれらの方言のスーパーセットであり、それらを置き換えることになりました。1994年にANSIはCommonLispの標準仕様「ANSI X3.226-1994 情報技術プログラミング言語 Common LISP」を出版しました。しかし、このときまでには、全盛期に比べるとLISPの市場は小さくなっていきました。