知脈

メタ循環評価器

meta-circular evaluatormetacircular

メタ循環評価器——言語を言語自身で記述することの意味

「Lispで書かれたLispインタープリタ」——これがメタ循環評価器(metacircular evaluator)の本質だ。プログラミング言語の評価器(インタープリタ)を、その言語自身で書くことができる。この自己参照的な構造は、言語の意味論とコンピューテーションの本質について深い洞察を与える。

SICP『計算機プログラムの構造と解釈』の第4章

SICPの第4章は、Schemeで書かれたSchemeインタープリタを段階的に構築していく。最初に基本的な評価器(式を受け取り、値を返す`eval`関数)を作り、次に環境(変数の束縛を管理するデータ構造)を追加し、最後に特殊形式・クロージャ・継続などを実装する。

これがメタ循環(metacircular)と呼ばれるのは、「評価」の定義が「評価」に依存しているからだ——Schemeの`eval`をSchemeで定義するとき、その定義の中にSchemeの評価規則が使われている。循環に見えるが、最終的にはベースとなる言語(Schemeのネイティブ実装)によって解消される。

重要なのは、この構築過程が「プログラムとデータの同等性」を露わにすることだ。Lispでは、プログラム(コード)はリスト(データ構造)として表現される。`(+ 1 2)` はデータとしてのリストでもあり、プログラムとしての式でもある。メタ循環評価器を書くことで、この「コードはデータだ」という事実が体感として理解できる。

フォン・ノイマン・アーキテクチャとの接続

フォン・ノイマン・アーキテクチャの革命も「プログラムはデータだ」だった。プログラムをメモリに格納し、CPUがそれを読んで実行する——これはコードとデータの同等性の物理的実装だ。

メタ循環評価器はその論理的な純化だ。言語を記述するのに別の言語ではなく言語自身を使う。これがチューリング完全な言語の特徴だ——自分自身の評価器を書ける言語は、ある意味で「自己を知る」言語だ。

自己参照の哲学的意味

メタ循環評価器は自己参照(self-reference)の具体例だ。「この文章は偽だ(嘘つきのパラドックス)」——自己参照はパラドックスを生む。しかしプログラミングにおける自己参照は生産的だ——自分自身を評価する評価器を書くことで、言語の意味論を明確化できる。

グールの『ゲーデル、エッシャー、バッハ』はこの自己参照のテーマを文学・音楽・数学・コンピュータサイエンスに渡って展開した(SICPとは別の文脈だが深く共鳴する)。ゲーデルの不完全性定理も「数学は自分自身を証明できない命題を含む」という自己参照の論理から来る。

実践的意味——言語の拡張

メタ循環評価器を学ぶ実践的価値は、「言語は固定されたものではない」という認識だ。評価器を持つということは、言語の意味論を変更できるということだ。SICPの後半では、通常のLisp評価器を変更して「遅延評価(lazy evaluation)」や「非決定性計算」を実装する方法が示される。

これが示す哲学は、プログラミング言語は「使うもの」ではなく「作るもの」だということだ。使っている言語の制限を感じたとき、評価器を変えることで言語自体を変えられる——これがLisp文化が生んだ「言語は拡張可能であるべき」という思想の基盤だ。

フォン・ノイマン・アーキテクチャ抽象化とあわせて読むことで、コンピュータ科学の基礎が体系的に見えてくる。パラダイム(クーン)との比較では、プログラミングパラダイムの転換がどれだけ根本的か——評価器レベルでの変更——がわかる。

概念ネットワーク

線の太さは共通する本の数を表しています。ノードをクリックすると概念ページに移動します。

この概念を扱う本(1冊)

計算機プログラムの構造と解釈
計算機プログラムの構造と解釈

ハロルド・エイブルソン、ジェラルド・サスマン

90%

Lispで書いたLispインタープリタという自己参照的構造の究極形