Sunday, September 19, 2010

那些与彩蛋有关的事情

原文发表于「桃源」: http://linux.cuit.edu.cn/?p=1006

前几天@liancheng同学在Twitter上传说中GCC有一个关于#pragma的彩蛋, 大致是说Stallman同学对#pragma很有意见, 因此在GCC中埋了一个彩蛋, 只要发现#pragma就会蹦出俄罗斯方块. 这个很有意思的八卦让我想要一探究竟, 经过一番查找, 这个彩蛋的确是存在的, 不过不是蹦出俄罗斯方块, 根据Wikipedia上一篇文章的介绍, GCC会试图依次启动Hack, Rogue, 以及Emacs中的Towers of Hanoi (汉诺塔), Hack和Rogue都曾经在「桃源」的另一篇文章[经典游戏推荐: NetHack]中提及. 不过这个彩蛋现在已经不存在了, Stallman同学曾经在接受采访时谈到 (请在采访稿中搜索"Easter eggs"), 这个彩蛋其实是针对C标准开的一个玩笑, 后来由于某种原因被移除. 幸运的是, GCC的古老代码依然存在, 下面是从GCC 1.21中提取出来的"遗体":
/* This was a fun hack, but #pragma seems to start to be useful.
   By failing to recognize it, we pass it through unchanged to cc1.  */

/*
 * the behavior of the #pragma directive is implementation defined.
 * this implementation defines it as follows.
 */
do_pragma ()
{
  close (0);
  if (open ("/dev/tty", O_RDONLY) != 0)
    goto nope;
  close (1);
  if (open ("/dev/tty", O_WRONLY) != 1)
    goto nope;
  execl ("/usr/games/hack", "#pragma", 0);
  execl ("/usr/games/rogue", "#pragma", 0);
  execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
  execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
nope:
  fatal ("You are in a maze of twisty compiler features, all different");
}

关于#pragma彩蛋的故事结束了, 但彩蛋本身就像一个充满魔力的物体, 一直是Geek间津津乐道的话题. Linux中的彩蛋不胜枚举, LinuxTOY有一篇文章大概介绍了其中的一小部分. 还有著名的Google Reader中的Konami Code彩蛋. xkcd的命令行版unixkcd更是隐藏了大量彩蛋, 其中就包括Konami Code. 还有一个颇有意思的彩蛋, 在Emacs中按下"M-x butterfly C-M-c"即可, 这个彩蛋的由来是因为xkcd上曾经有一篇漫画 (这篇漫画很有趣, 推荐大家看看, Linux程序员定会泪牛满面, lol) 虚构了Emacs中有这么一个彩蛋, 于是开发Emacs的那群家伙就真的在Emacs 23.1中加入了这个彩蛋...

彩蛋是程序员创造的独一无二的标志, 也许是为了好玩, 也许是为了吐槽, 也许是为了方便调试, 总之彩蛋给这个世界带来了一个值得纪念的回忆. 如果你还知道什么有趣或者有意义的彩蛋, 欢迎分享, :)

For LaN