学习NodeJS的时候,一定会用到其包管理器npm。npm的字面意思是node package manager,实际的含义也是这样,但是npm真正的英文名却是“npm is not an acronym”,意思是“npm不是一个缩写”,所以如果要问npm是什么单词的缩写,那么回答就是“‘npm是不是一个缩写’的缩写”。
这种计算机科学中的“饶舌”现象叫作递归缩写。
递归缩写(Recursive acronym)即递归首字缩写,是一种在全称中递归引用它自己的缩写。
在计算机领域,使用递归缩写是黑客社区中的一个较早的传统,后来又有一些牛人把自己开发的产品或者技术使用了这种方式来命名,不得不说,牛人们不仅技术牛,开起玩笑来也是充满了geek气息。
最早的递归缩写命名的实例应该是1977年或1978年出现的TINT编辑器,其命名为“TINT Is Not TECO”(TINT不是文字编辑器和修正器),它是一个MagicSix的编辑器。这又启发了麻省理工大学的两个Lisp Machine 编辑器的命名,一个叫做 EINE (“EINE Is Not Emacs“,EINE不是 Emacs),另一个是 ZWEI (“ZWEI Was EINE Initially”,ZWEI一开始是EINE)。熟悉Linux的童鞋一定对GNU不陌生, Richard Stallman的 GNU (GNU’s not UNIX,GNU不是UNIX)同样也是如此的幽默。如npm、GNU一样,许多递归缩写包括否定语,通常用来指出这个缩写指代的事物 a 不是与另一个事物 b 相类似(但事实上,这个事物 a 通常与 b 非常相似甚至是 b 的衍生品)。
还有一些有趣的例子:
Linux:Linux Is Not UniX,这就有点像GNU了,但是是否属实就有待考证了。
PHP:原名Personal Home Page,刚开始是Rasmus Lerdorf为了维护个人网页而开发的,后来功能强大了,改名为PHP: Hypertext Preprocessor,相应地含义也变成了超文本预处理器。
RPM:RPM Package Manager,原名是Red Hat Package Manager,一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。与Dpkg类似。
Wine:Wine Is Not an Emulator,是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,Mac OSX 及 BSD 等)上运行 Windows 应用的兼容层。关于Wine的真正含义,有人对“Wine Is Not an Emulator”的说法表示质疑,认为”非模拟器“的解释不过是一种娱乐性的说法,Wine的真实意思应当是是Windows Environment的缩写,即WinE。
PNG:PNG’s Not GIF,一种图像文件存储格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG的名称来源于“可移植网络图形格式(Portable Network Graphic Format,PNG)”,
EMACS — EMACS Makes A Computer Slow,其自我调侃的意味就太明显了,大概也是对自己集成的强大的功能洋洋得意吧。
了解这些东西,一方面在学习困倦的时候稍稍调节一下,另一方面也是体会计算机大牛们那种geek幽默,枯燥的计算机世界需要程序员们去创造快乐。
原文链接:编程语言中那些有趣的命名