ソースプログラムAを書いて、それをコンパイルして実行可能なプログラムBができあがる。プログラムBを実行したら、画面上の表示内容がAそのものになっている。

そういうソースプログラムAを自己印刷プログラムという。英語ではQuineという。

自己印刷プログラムはふつう、入力を使わない。入力ファイルを画面表示するだけなら簡単に作れるから。

C言語で作られている自己印刷プログラムに以下のようなもの2つがよく知られている。

main(a){printf(a,34,a="main(a){printf(a,34,a=0`,34);}",34);}

 

char*f="char*f=0`;main(){printf(f,34,f,34,10);} ";main(){printf(f,34,f,34,10);}

以下のものは多少長いが、いろいろ応用利きそう。

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プログラムを見つけようとはりきったこともあります。

とわざわざ紹介してある。

Comments are closed.

Post Navigation