たまたま 矢吹 太朗 の 「自分のコードを出力するプログラム」 というページをみつけたのをきっかけに,プログラムと Web ページの自己増殖 (自己再生産または自己複製) について書いてみたいとおもいます. 矢吹のページではいろいろいなプログラミング言語による自己増殖プログラムが紹介されています. Basic (ベーシック) によるものが一番みじかいのですが,あとで書くようにいささか疑問もあります. 私は 1997 年に 「Web ページとプログラムの自己再生産」 という Web ページを書きました. ここでは Web ページの完全または不完全な複製をためせるようになっています.
私が書いたページは ACM SIGPLAN Notices にのせた論文と,シンポジウムで発表したその日本語訳に対応するものです. 論文を読んでもすぐには自己増殖をためすことができないので,論文に URL を書いておいて,そこをアクセスすると例がためせるようにするはずでした. Web ブラウザをつかって Web ページを完全に複製したり,不完全に複製したりすることを実際にためしてみることができるというわけです. たとえば,
というボタン 1 個だけが表示されたページでそのボタンをクリックすると,あたらしいページが生成されておなじボタンが表示される (完全に複製される) というページがあります. また,おなじボタンが表示されていて,クリックするとそれが に変化し (不完全に複製され),もう一度クリックすると にもどるというページもあります. ところが,私の Web サイトはクラッカーのためにダメにされ,URL は変えざるをえなくなりました. しかし,それでも検索エンジンをつかえば,みつけるのは容易なはずです.このサイトではいろいろな Web ページを紹介しています. そのなかには Netscape Navigator (ネットスケープ・ナビゲーター) Ver. 3 ~ 4 でしか動作しないものもあります. これらはいまやためすのが困難になってしまいました. しかしともかく,これらにおいては Web ページの内容が JavaScript (ジャバスクリプト) プログラムもふくめて再生産されます. これらの Web ブラウザでは,(仕様はあきらかにされていないとおもわれますが) JavaScript によってあたらしい Web ページをつくるときに,そのページのなかに JavaScript プログラムを書くと,もとの Web ページにあった JavaScript プログラムのかわりにそれがつかわれるようになります. したがって,Web ページがかきかえられるごとに,プログラムのふるまいもかえることができます. (上記の “+” が “-” にかわる例では,もとのプログラムにおいては “+” とかかれていた部分が “-” にかきかえられるわけです.)
これに対して,現在の Web ブラウザでも動作するものは,JavaScript プログラムの再生産をともないません. JavaScript のプログラムをかきかえても意図したとおりに動作しないからです. そのかわり,これらのプログラムにおいては JavaScript のプログラムを再生産される Web ページからはきりはなしています (くわしくは,上記のページから自己再生産されるページをアクセスして,みてください).
一方,上記の矢吹のページは Mathematica (マテマティカ), Lisp (リスプ) をはじめ,いろいろなプログラミング言語による自己増殖プログラムを紹介しています. そのなかで一番みじかいのはつぎのような Basic によるプログラムです.
10 LIST
これを実行すれば,たしかに同一のプログラムが再生産されるでしょう. しかし,通常,自己増殖プログラムはこんなにみじかく記述することはできません. こんなにみじかく記述できるのは,LIST 命令に自己参照機能があるからです. つまり,LIST 命令はプログラム (= 自己) を印刷する命令だから,自己再生産されるわけです. これは問題をすりかえてしまっているようにおもえます. とはいえ,この Web ページでは他のプログラムのほうをみるべきであって,この Basic プログラムのことばかり書くのはあまり適切でなかったかもしれません.