258
8
章 不可能なプログラム
テープにおける行動をハイレベルで解釈しているにすぎないのです。
実際には、議論を呼ぶような言語機能を使わないよう、単純なRubyプログラムだけに制限すること
によって、こうした異論を完全に回避することができます。この章ではこれから先、標準入力から文字
列を読み、何らかの計算をし、それが完了したら標準出力に文字列を書く、というプログラムを書いて
いきます。入力文字列はチューリングマシンの最初のテープ内容とよく似ており、出力文字列は最終的
なテープ内容とよく似ています。
8.1.3
コードはデータである
プログラムには2 つの生命が宿っています。プログラムは特定のシステムを制御するための命令であ
るとともに、式の木構造、生の文字列、巨大な1つの数など、純粋なデータとして見なすこともできま
す。私たちプログラマにとって、こうした2面性は当然のこととされていますが、汎用コンピュータに
とって、プログラムがデータとして表現できることは極めて重要です。そのおかげで、他のプログラム
を入力として扱えるためです。そもそもソフトウェアをソフトウェアたらしめているのは、このコード
とデータの一体化に他なりません。
すでに私たちはデータとしてのプログラムを見てきました。万能チューリングマシンでは、別の
チューリングマシンの規則集が、文字のシーケンスとしてテープに書かれていることを期待していま
す。Lisp
†
やXSLTといった風変わりな同図像性(homoiconic)を備えたプログラミング言語の場合 ...