[Japanese version] | [English version] |
ここでは,Web ページがふくんでいる JavaScript プログラムをつかって その Web ページとまったく同一またはほとんど同一の Web ページを生成・ 表示する方法と,この方法のもとになっているプログラムの自己再生産 (自己印刷) について説明します.また,その応用として階層型メニューなどを とりあげます.一部の例は JavaScript プログラムの再生産を必要とするので, その機能をそなえている Netscape Navigator だけで動作し,Internet Explorer では動作しません (IE 6.0 ではほとんどの例は動作しません). また,Navigator 3.0 や 6.0 では一部の例だけ動作します. Opera 7.1 では,戻り (back) ボタンを使用しないかぎりは, すべてが意図したとおりにうごきます!
「いそがしくて,こんなながいページはよんでられない」という ひとのために,この方法でなにがやりたいのか,例をあげましょう. (このページにもどるには「戻る」というメニュー項目をつかってもだめで, 直接このページを指定して「ジャンプ」しなければならないので,ご注意!!)
なに?! 「ただの Dynamic HTML じゃない」 ですって? ちがうんです!!
このページのメイン・テーマは Web ページの自己再生産ですが,まず, そのもとになっているプログラムの自己再生産または自己印刷について説明します.
自己再生産するプログラムとは,そのプログラムを実行させると,その結果として その (ソース) プログラムと同一のプログラムを出力するプログラムのことです. たとえば,Marius (marius@digicash.com) がおくってくれたつぎの C プログラム は,自己再生産するプログラムです (このプログラムの原作者は不明です).
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34 );}
もちろん,Perl でもつくれます: 例 1, 例 2, 例 3. (これらはこのページの著者の作品.もっと Perl らしいプログラムにすれば, ずっとみじかく,かけます).
Pascal では,東大名誉教授の和田英一先生がかいたプログラムがありますが, ほかの例もふくめて,興味がある方は有澤先生の本 を参照してください.
プログラムをふくまない (参照しない) Web ページが自己再生産することは ありえませんが,Web ページはスクリプト言語のプログラムをふくむ (参照する) ことができるので,それをつかえば自己再生産の可能性があります. 残念ながら Microsoft の Visual Basic Script や JScript ではスクリプトをふくむページを出力することができないので,スクリプトの 再生産を必要とするタイプの自己再生産はできません.しかし,Netscape の JavaScript をつかえば, (JavaScript の言語仕様書や ハンドブック にはそれができるかどうか書いてありませんが) JavaScript のプログラムをふくむ Web ページを出力することができます.
上記の機能をつかって Web ページを自己再生産することができますが,その 基本である完全な再生産の例をしめします.下記のリンクをたどったときに 表示されるボタンをおすと,まったくおなじボタンが表示されます.
でも,完全におなじページが表示されたのでは,なにがおこったのか. わかりませんね :-)
そこで,すこしだけちがうページが表示される例をあげてみましょう. どの例も,表示されるボタンをマウスでクリックすることで動作します.
これらの例は,もちろん,実用をめざしたものではありません.ラジオボタンや チェックボックスがつかいたいのであれば,通常は HTML のフォームをつかった ほうがよいことはいうまでもありません.
完全な自己再生産はもののやくにはたちません.しかし,不完全な再生産は, Web ページのみかけを変容させる目的で,いろいろ,つかえる可能性があります. このページの最初にしめした 2 つの例はその一部です.
でも,このくらいのものは Dynamic HTML [MS 97] [NS 97] でも実現可能です.そのうちにそれらでは 実現できない例をかんがえたいとおもっています.
Web ページのみかけをかえられることももちろんおもしろいのですが,それ だけでなくて,Web ページを自己再生産することじたいがおもしろいわけです. これはフォン・ノイマンの「自己増殖オートマタ」にもつうじていて, 生命や人工生命をおもいおこさせます.
このページより詳細な情報がしりたければ,論文 [Kan 97a], [Kan 97b] を参照してください.