荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Version (Who makes history and why), 信区: Program
标  题:  Ken Thompson 的经典 C 程序
发信站: 荔园晨风BBS站 (Tue Mar 25 18:28:47 2003), 站内信件

大师就是大师, 不是吹的

Ken 在大学里的时候没有游戏玩, 自己给自己题目编程序找乐
最喜欢的一个是, 编写一个能够输出自身源程序的程序,
并且跟人家比赛, 谁编的代码最短.

这有点像蠕虫病毒吧. 但是大家一般概念上的会自我复制的程序
仅仅是复制自己的二进制文件,这个相对来说比较简单. 而要
完整地输出自己的源程序, 难度就比较大了.

当然那时还没有C语言, Ken 是用 Fortran 编的.
后来在获图灵奖的演说中, Ken 用 C 语言演示了这个程序.

这个程序代码真的是有大师风范,
就像那些剑道高手到了一定境界,不用剑,用树枝就能当剑使.
主程序只有几行:

char s[]={
        '\t',
        '0',
        '\n',
        '}',
        ';',
        '\n',
        '\n',
        'm',
        'a',
        'i',
        'n',
        '(',
        ')',
        '\n',
        '{',
        '\n',
        '\t',
        'i',
        'n',
        't',
        ' ',
        'i',
        ';',
        '\n',
        '\n',
        '\t',
        'p',
        'r',
        'i',
        'n',
        't',
        'f',
        '(',
        '"',
        'c',
        'h',
        'a',
        'r',
        ' ',
        's',
        '[',
        ']',
        '=',
        '{',
        '\\',
        'n',
        '"',
        ')',
        ';',
        '\n',
        '\t',
        'f',
        'o',
        'r',
        '(',
        'i',
        '=',
        '0',
        ';',
        ' ',
        's',
        '[',
        'i',
        ']',
        ';',
        ' ',
        'i',
        '+',
        '+',
        ')',
        '\n',
        '\t',
        '\t',
        'p',
        'r',
        'i',
        'n',
        't',
        'f',
        '(',
        '"',
        '\\',
        't',
        '%',
        'd',
        ',',
        '\\',
        'n',
        '"',
        ',',
        's',
        '[',
        'i',
        ']',
        ')',
        ';',
        '\n',
        '\t',
        'p',
        'r',
        'i',
        'n',
        't',
        'f',
        '(',
        '"',
        '%',
        's',
        '"',
        ',',
        's',
        ')',
        ';',
        '\n',
        '}',
        '\n',
        0
};

main()
{
        int i;

        printf("char s[]={\n");
        for(i=0; s[i]; i++)
                printf("\t%d,\n",s[i]);
        printf("%s",s);
}

这个程序本身不是严格地符合要求的,因为输出时字符数组
里的元素是显示为数字的, 但是用输出内容作为正式程序
的源程序, 那么就是严格符合要求的了.

以下是输出:

char s[]={
        9,
        48,
        10,
        125,
        59,
        10,
        10,
        109,
        97,
        105,
        110,
        40,
        41,
        10,
        123,
        10,
        9,
        105,
        110,
        116,
        32,
        105,
        59,
        10,
        10,
        9,
        112,
        114,
        105,
        110,
        116,
        102,
        40,
        34,
        99,
        104,
        97,
        114,
        32,
        115,
        91,
        93,
        61,
        123,
        92,
        110,
        34,
        41,
        59,
        10,
        9,
        102,
        111,
        114,
        40,
        105,
        61,
        48,
        59,
        32,
        115,
        91,
        105,
        93,
        59,
        32,
        105,
        43,
        43,
        41,
        10,
        9,
        9,
        112,
        114,
        105,
        110,
        116,
        102,
        40,
        34,
        92,
        116,
        37,
        100,
        44,
        92,
        110,
        34,
        44,
        115,
        91,
        105,
        93,
        41,
        59,
        10,
        9,
        112,
        114,
        105,
        110,
        116,
        102,
        40,
        34,
        37,
        115,
        34,
        44,
        115,
        41,
        59,
        10,
        125,
        10,
        0
};

main()
{
        int i;

        printf("char s[]={\n");
        for(i=0; s[i]; i++)
                printf("\t%d,\n",s[i]);
        printf("%s",s);
}

        115,
        41,
        59,
        10,
        125,
        10,
        0
};

main()
{
        int i;

        printf("char s[]={\n");
        for(i=0; s[i]; i++)
                printf("\t%d,\n",s[i]);
        printf("%s",s);
}

--
                      *
          *                                  *
                          *             *
                      no more to say
                  ★     just wish you   ★
                            good luck

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.50]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店