专栏首页Web行业观察你所不知道的“foo”和“bar”
原创

你所不知道的“foo”和“bar”

流传在文档间的程序员默契

“foo” 和“foobar”等单词经常会作为示例名称出现在各种程序和技术文档中。据统计,在各种计算机和通信技术文档中,大约有百分之七的文档出现了这些词语。可是这些文件都没有为它们给出合适的解释。虽然这不是个大问题,但对于初学者,尤其是母语非英语的人来说,这些单词往往会带来不小的迷惑。

“foo” 一词最早出现在一些二战前的漫画和卡通作品中。在关于消防队员的漫画“Smokey Stover”中,作者Bill Holman大量的使用了“foo”一词。这部漫画连载于1930至1952年,在其中,“foo”这个词经常出现在汽车车牌上和一些没有意义的对话中, 例如:“He who foos last foos best”或 “Many smoke but foo men chew”等。根据作者自己介绍,“foo”是根据某种中国的小雕像底部的文字得来的。这听起来很有道理,因为中国的雕像往往都会刻上祝福的文字,而 “foo”可能是“福”的音译。不过英文文法能接纳Holman的“foo”这个编造的单词,也是受了犹太语中“feh”和英文中“fooey”及 “fool”的影响。

在随后的二战中,因为英美士兵经常 用俚语和粗话交流,“foo”一词就被更广泛的传开了。人们把被雷达追踪到的神秘飞行物称为“foo战机”(“foo fighter”),就是后来所谓的UFO。而当英国士兵回防时,往往也会刻下“foo到此一游”(“Foo was here.”)的字眼。

而关于“foobar”,也可以追溯到二战时期军队中的粗话缩写“FUBAR”。“FUBAR”的含义是用到烂再大修(Fucked Up Beyond All Repair),后来演变成了“foobar”。

信手拈来的"哑变量"

其实我们可以把“foo”理解成张三李四, 或者"某某",但真正了解“foo”及“foobar”等词的含义,还是能使我们更好的理解英文文档,避免产生不必要的歧义。

  术语 foobar , foo , bar , baz 和 qux 经常在计算机编程或计算机相关的文档中被用作 占位符 的名字。当变量,函数,或命令本身不太重要的时候, foobar , foo , bar ,baz 和 qux 就被用来充当这些实体的名字,这样做的目的仅仅是阐述一个概念,说明一个想法。这些术语本身相对于使用的场景来说没有任何意义。Foobar经常被单独使用;而当需要多个实体举例的时候,foo,bar,和baz则经常被按顺序使用。

在计算机程序设计与计算机技术的相关文档中,术语foobar是一个常见的无名氏化名,常被作为“伪变量”使用。 从技术上讲,“foobar”很可能在1960年代至1970年代初通过迪吉多的系统手册传播开来。另一种说法是,“foobar”可能来源于电子学中反转的foo信号;这是因为如果一个数字信号是低电平有效,那么在信号标记上方一般会标有一根水平横线,而横线的英文即为“bar”。在《新黑客辞典》中,还提到“foo”可能早于“FUBAR”出现

Hello World 雅俗共赏与时代的变迁

早期还有巴克斯范式(Backus Regular)也是用于规范文档的术语, 但是童年的NFC其中包括了句子间的 `foo' 、 `bar' 或 `foobar' 等变数没有任何恰当的解释或定义. 我们这一代很少在用test123, 你懂得:抖个机灵:Hello World!貌似图灵系的数据 喜欢用 foo+bar! 所以现在的foobar都被拆开来了.

所以说helloworld是用于输出的测试文本, foo和bar就是两个常用的变量名, 这又让我想起了两个常见的对象引用: Bob和Alice(亲切吧,这两个咚咚也曾经迷惑过我!)总之foo和bar作为曾经的教科书常客给我们留下了很多童年回忆, 也给与了我们最珍贵的礼物---程序员的默契与开发者的规范---这才是最值得品味的.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何优雅的从Array中删除一个元素

    从JavaScript数组中删除元素是开发人员经常遇到的常见编程范例。与许多JavaScript一样,这并不像它应该的那么简单。

    Jean
  • 3D引擎中LOD技术的理论基础

    虚幻引擎中细节优化相关的技术有 level of details 和 level streaming 两种,他们的共同点在于:当相机视角靠近某一片区域时,那里的...

    Jean
  • 用“双射”的思想解决排列组合问题

    “双射”(bijective)其实是个比较土味的数学名词,因为在关系代数中我们更喜欢称它为“一一映射”。关系代数是研究集合之间“映射关系”的数学分支,然后集合的...

    Jean
  • Python中的@staticmethod和@classmethod的区别

    使用classmethods时,对象实例的类作为第一个参数而不是隐式传递self。

    BigYoung小站
  • R中的管道操作符%>%

    管道是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。管道%>% 来自于magrittr 包。因为tidyverse 中的包会自动加载%>%,所以一...

    生信编程日常
  • python expect

    py3study
  • VC和GCC成员函数指针实现的研究(二)

    调用的时候主要看(c.*vptr2)()的代码。因为(c.vptr1)()生成的和单继承一样。而由于它们最终都转向vcall,所以vptr2的时候调整了虚表指针...

    owent
  • 在js中关于同名变量和函数的地位争夺问题

    其实,在浏览器解析js代码的过程中,会有一个预编译的过程,遇到function 函数定义的部分,会先将该部分的代码提前,所以我们在第一个console.log(...

    Theone67
  • python classmethod和

       这两个装饰器是Python自带的,虽然一直都知道装饰器是怎么用的,但是确实不知道何时去使用它们,今天看到某人用到了,又看了一遍,才有所收货.

    py3study
  • [887]python中@classmethod和@staticmethod

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用@staticmethod或@classmethod,就可以不需要实例化,**直接类名.方...

    周小董

扫码关注云+社区

领取腾讯云代金券