ソースプログラムAを書いて、それをコンパイルして実行可能なプログラムBができあがる。プログラムBを実行したら、画面上の表示内容がAそのものになっている。
そういうソースプログラムAを自己印刷プログラムという。英語ではQuineという。
自己印刷プログラムはふつう、入力を使わない。入力ファイルを画面表示するだけなら簡単に作れるから。
C言語で作られている自己印刷プログラムに以下のようなもの2つがよく知られている。
1 |
main(a){printf(a,34,a="main(a){printf(a,34,a=0`,34);}",34);} |
1 |
char*f="char*f=0`;main(){printf(f,34,f,34,10);} ";main(){printf(f,34,f,34,10);} |
以下のものは多少長いが、いろいろ応用利きそう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
char*lines[]={ "char*lines[]={", "0` ", "0};", "main(){", "int idx;", "puts(lines[0]);", "for(idx=0;lines[idx]!=0;idx++){", "printf(lines[1],34,lines[idx],34,',',10);", "}", "puts(lines[2]);", "for(idx=3;lines[idx]!=0;idx++){", "puts(lines[idx]);", "}", "}", 0}; main(){ int idx; puts(lines[0]); for(idx=0;lines[idx]!=0;idx++){ printf(lines[1],34,lines[idx],34,',',10); } puts(lines[2]); for(idx=3;lines[idx]!=0;idx++){ puts(lines[idx]); } } |
自分自身を表示する。哲学的な要素が含まれ、なかなか奥深い。
1974年度のチューリング賞を受賞したクヌースの受賞講演「芸術としてのプログラミング」にも、
数年前、Stanford大学の学生たちは、自分自身を印刷する最短のFORTRANプログラムを見つけようとはりきったこともあります。
とわざわざ紹介してある。