在源代码示例中使用“ foo”和“ bar”的历史是什么?


60

为什么许多代码示例(尤其是教程)经常使用名称“ Foo”和“ Bar”?这几乎是一个标准。

例如:

void foo(char* bar) {
  printf("%s", bar);
}

2
fmsf的帖子似乎都没有受到RichB的欺凌的保护。

是的,他喜欢改变我写的内容,我开始认为他很着迷

4
“为什么是foo bar?” 标题不是很好,恕我直言
Jeff Atwood

1
我添加了正确词源的答案(这是第二次世界大战第二代美国陆军语术语中最流行的一种)和我的出处。

这是一个模因-可以交流的想法。这是它自己的理由。
Mike Dunlavey

Answers:


65

Foobar来自美国陆军第二次世界大战的首字母缩写词FUBAR,“超越一切认可的F-ed up”。这些术语的整个系列在北非和西西里战役(1942-43)中得到了广泛使用。里克·阿特金森(Rick Atkinson)出色的战斗日:1943-1944年,在西西里岛和意大利的战争中列出了这些清单。例如,JANFU是“联合陆军海军F Up”,例如1943年7月11日的事件,当时赫斯基行动 的入侵舰队击落了23架载有伞兵的陆军空军C-47运输机以加固滩头。

更新:Wikipedia 列出了相关的首字母缩略词,其中包括Atkinson列出的一些原始的第二次世界大战。

任何程序员都将理解使用foobar命名变量的动机。从一开始它们就肯定是C / UNIX文化的一部分,正如@Walter Mitty指出的那样,它们早于它。

更新(10/5/2009):这是阿特金森的描述:

他们无处不在的“平民性”使他们对军事热情存有戒心。海军预备队前往西西里岛的中尉约翰·梅森·布朗(John Mason Brown)写道:“我们不是充满斗篷和剑风的浪漫主义者。” “上一场战争距离那太近了。” 军事生活激起了他们的讽刺敏感性和怀疑态度。捕获士兵期望值降低的一个粗略缩写词-SNAFU,“状况正常,全都搞砸了”-已扩展为GI犬儒主义的词汇:SUSFU(状况不变,仍然搞砸了);FUMTU(比平时更糟);JANFU(陆军-海军联合部队);JAAFU(英美联合研究);FUAFUP(性交并适当性交);和FUBAR(出乎意料地搞砸了)[Atkinson,p。3。36]。

更新(2011年11月23日):@Hugo 列出了许多非军事先例。


3
加上词源:“ FUBAR可能受到德语单词furchtbar的影响,意思很糟。它的发音很柔和,很可能在第二次世界大战期间进行了过渡”
Mark

4
@Mark,德国维基百科(de.wikipedia.org/wiki/Fubar)表示,这可能是假名。它还指向一些先例,例如华纳兄弟(Warner Brother)1938年的漫画《达菲医生》中的“ SILENCE IS FOO”标志。

4
@吉姆·弗兰斯(Jim Ferrans):虽然FUBAR可能影响了将“ bar”与“ foo”一起使用,但有力的证据表明,“ foo”本身早于第二次世界大战之前,正如您的评论所指,至少可以追溯到1930年代。在您的答案正文中最好提及这一点。
丹尼尔·普赖登

是的,foo肯定早于第二次世界大战。实际上,我发现了麻省理工学院1938年出版的一篇文章,告诉我们这是多么普遍:“当然,“ foo!”在我们的语言中具有明确的定位,并且可能是不可替代的,尽管我们担心过度目前所使用的药物很可能会导致其早期消失(可惜是黑暗的)。” 在同一份报纸上,请参阅我的答案以及1937年的参考文献:programmers.stackexchange.com/questions/69788/…–
Hugo

59

我认为这是fubar的语音发音。

代表:

  • F * cked
  • 超越
  • 所有
  • 修理

18
维修或认可; P

10
需要礼貌时经常使用“污损”。

30
修理?罗..识别
哈森

6
这是“认可”。请在此处查看里克·阿特金森(Rick Atkinson)的战斗日的报价:stackoverflow.com/questions/262271/…–

7
请注意,有充分的证据(请参阅RFC 3092,术语表和此处的其他答案)表明,“ foo”在1930年代曾被用作占位符,但在第二次世界大战前FUBAR成为军事lang语之前就已使用。
丹尼尔·普里登

41

新黑客词典对此有一个非常不错的入门-我认为这是对这种比维基百科的东西更好的资源:

元语法变量/n./

示例中使用的名称,应理解为代表正在讨论的任何事物,或正在讨论的一类事物的任何随机成员。foo这个词就是典型的例子。为了避免造成混乱,黑客从不(也几乎从未)将“ foo”或类似它的词用作任何事物的永久名称。在文件名中,一个常见的约定是任何以元语法变量名开头的文件名都是临时文件,可以随时删除。

在某种程度上,一个人偏爱的元语法变量的列表是一种文化特征。它们既发生在系列中(用于相关的变量或对象组),又以单例形式出现。以下是一些常见的签名:

foo,bar,baz,quux,quuux,quuuux ...:
MIT / Stanford用法,现在随处可见(在很大程度上感谢此词典的早期版本!)。在麻省理工学院(但不在斯坦福大学),巴兹在1970年代和80年代停产了一段时间。该序列的最近常见突变是在quux之前插入qux。

bazola,ztesch:
斯坦福(从70年代中期开始)。

foo,bar,thud,grunt:
该系列在CMU上很流行。其他与CMU相关的变量包括gorp。

foo,bar,fum:
据报道该系列在XEROX PARC中很常见。

弗雷德(Fred),巴尼(Barney):
请参阅弗雷德(Fred)条目。这些往往是英国主义。

Corge,grault,flarp:
在罗格斯大学和GOSMACS黑客中颇受欢迎。

zxc,spqr,wombat:
剑桥大学(英格兰)。

shme
Berkeley,GeoWorks,Ingres。发音为/ shme /,带有简短的/ e /。

浮潜
布朗大学,1970年代初期。

foo,bar,
芬兰赫尔辛基工业大学

吹牛,摇晃
新西兰。

toto,titi,tata,tutu
法国。

皮波诺,冥王星,paperino
意大利。Pippo / pee'po /和Paperino / pa-per-ee'-no /是Goofy和Donald Duck的意大利语名称。

aap,noot,mies
荷兰。这些是孩子用来学习在荷兰拼写板上拼写的第一个单词。

在所有这些中,只有'foo'和'bar'是通用的(并且baz几乎是通用的)。复合foobar和`foobaz'也享有非常广泛的货币。

一些术语也被用作元句法名称。例如,叫和咕and。另请参阅英联邦Hackish,以了解在大不列颠及英联邦中发现的许多元句法变量。


不得不说,我来自新西兰,我从未听说过“ blarg”或“ wibble”。

那是一个相当不错的。太复杂了,谢谢老兄。
塔里克

天哪,我的QL帐户是qux。震惊...

@Colin-我更改了指向其他站点的链接,因为现有站点处于脱机状态。
从这里开始,2010年

我从MIT 1964年的一篇论文中找到了关于LISP的其他有趣的元语法变量(当然也有foo):chi /波士顿纽约/菠菜黄油牛排/ foo缸毛刺/ poot toop / toot toot / isthisatrivialexcercise / ploop flot top / snap爆裂声/一二三/平面子脱粒机。请参阅我的答案以获取更多信息:programmers.stackexchange.com/questions/69788/…–
Hugo

25

维基百科给出了元句法变量的定义

在计算机科学中,程序员使用元语法变量来描述占位符名称或别名,通常用于表示所讨论的主题或所讨论的事物的任意成员的别名。使用元语法变量有助于使程序员免于创建逻辑命名的变量,这在创建或讲授算法示例时通常很有用。单词foo是主要示例。
术语“元句法变量”主要在非正式文献中找到。有时也用作元变量的同义词。
任何不违反语言规则的符号或词都可以用作元语法变量,但通常使用废话。在其他领域中也使用相同的概念,这些领域用诸如示意图变量之类的术语表示(请参阅逻辑形式)。
通过数学类推:元语法变量是一个单词,它是其他单词的变量,就像在代数字母中用作数字变量一样。

本文还提供了不同编程语言中此类变量的常见示例:

C
在下面的C编程语言示例中,函数名称foo和变量名称bar都是元语法变量。以//开头的行是注释。

// The function named foo
int foo(void)
{
   // Declare the variable bar and set the value to 1
   int bar = 1;

   return bar;
}

蟒蛇

垃圾邮件,火腿和鸡蛋是Python编程语言中使用的主要元语法变量。[5] 这是该语言的缩写Monty Python对著名喜剧素描Spam的引用。[6] 在下面的示例中,垃圾邮件,火腿和鸡蛋是元语法变量,以#开头的行是注释。

# Define a function named spam
def spam():

    # define the variable ham
    ham = "Hello World!"

    #define the variable eggs
    eggs = 1

    return

红宝石

在以下示例中,baz,foo和bar是元语法变量,以#开头的行是注释。

# Declare the variable foo and set equal to 1
foo = 1

# Declare the variable bar and set equal to 2
bar = 2

# Declare the method (function) named baz, which prints the text 'Hello world'
def baz
   puts 'Hello world'
end

19

这是维基百科的答案:

术语foobar,foo,bar和baz是计算机编程或计算机相关文档中常用的占位符名称(也称为元语法变量)。它们通常用于表示未知值,通常在描述了解未知值目的但其精确值是任意且不重要的场景时使用。这些术语可用于表示复杂系统或概念的任何部分,包括数据,变量,函数和命令。单词本身在这种用法中没有意义,仅是逻辑表示,非常类似于代数中使用的字母x和y。Foobar通常单独使用。当需要多个实体时,通常按此顺序使用foo,bar和baz。

Foo作为一种新词而进入英语,并且被许多人认为是元语法变量的典范示例。[Citation needed]它广泛用于计算机编程示例(有时表示为“仅一次”)和伪代码。埃里克·雷蒙德(Eric S. Raymond)称其为“重要的黑客行为”,与k夫和cru夫并列。[1]

http://en.wikipedia.org/wiki/Foo

从RFC 3092:

当与“ bar”结合使用时,通常可以追溯到第二次世界大战时代的陆军语首字母缩写词FUBAR(“ Fucked Up Beyond All Repair”,后来被修改为foobar)。Jargon File [JARGON]的早期版本将这一更改解释为战后的低俗化,但现在看来FUBAR本身是“ foo”的派生词,也许受到德国“ furchtbar”(可怕)的影响-“ foobar”可能实际上是原始形式。

因为,看起来“ foo”一词本身在战前就具有漫画和漫画的历史。在1938年由罗伯特·克兰佩特(Robert Clampett)执导的华纳兄弟动画片中,“达菲文档”(Daffy Duck)的早期版本举着标语,上面写着“沉默就是愚蠢!”。

http://www.faqs.org/rfcs/rfc3092.html


6
或者您可以承认它来自fubar ='“ f”超出了所有人的
视线

4
@Jonathan Fingland:不,不是。(实际上,“ foo”可能早于“ foobar”和“ FUBAR”。)请参阅RFC 3092和“ foo”的术语表条目。
丹尼尔·普赖登

@Daniel,出色的参考。添加
乔纳森·芬德兰

19

tl; dr

  • MIT和DEC广泛使用“ Foo”和“ bar”作为元语法变量,最早的参考文献是1964年以来在LISP和PDP-1和MAC项目上的工作。

  • 其中许多人都在麻省理工学院的技术模型铁路俱乐部中,我们在1959年发现了“ foo”在技术界的首次使用记录(并在1958年出现了变体)。

  • “ foo”和“ bar”(甚至“ baz”)在流行文化中都是众所周知的,尤其是从Smokey Stover和Pogo漫画中,许多TMRC成员都会阅读。

  • 同样,军事上的FUBAR似乎也为他们的知名度做出了贡献。


在20世纪初期,在流行文化中已经很好地证明了将孤独的“ foo”用作废话,军事上的FUBAR也是如此。(一些背景知识: FOLDOC FOLDOC 术语表 术语表 Wikipedia RFC3092


好的,让我们找到一些参考。

停止按!发布此答案后,我在1938年1 14日星期五的The Tech(《麻省理工学院最古老,最大的报纸和网络上出版的第一家报纸》)第LVII卷中找到了有关“ foo”的完美文章。第57号,三分价格:

论自由主义

懒人认为,对自由主义的支持已经被其误导的支持者推倒了,因此,他一贯坚持反对滥用它的立场。可能是没有像以前的foo这样的foo,而我们就是这样,但是无论如何,foo和他的钱是聚会。(来自看台的声音-“别傻了!”)

作为专有名词,“ foo!” 在我们的语言中具有明确的位置,并且可能是无法替代的,尽管我们担心它当前受到的过度使用很可能会导致其陷入早期(甚至是黑暗)的遗忘中。我们之所以这样说是因为正确使用该词可能会导致以下令人高兴的事件。

这是斯莱特教授在6-120室举行的8.50热力学讲座。教授遮盖了黑板的前侧,放下了操纵升降机构的手柄,同时转向全班继续他的讨论。前面板缓慢而庄重地抬起自身,露出后面板,然后在该面板上写下大写的“ FOO”符号!

一年前的Tech报纸1937年 9 写给编辑的信:

到火车到达车站时,新手们已经充满了披披Omicron(通常称为Foo)的荣耀的故事,以至于它们很容易被捕食。

...

我并不是说我失去了我的前四个儿子,而是因为Ophin Omicron的大兄弟会和环球兄弟会,但我确实希望至少要提前警告我的第五个儿子我的孩子。

希望你的,

愤慨的五个母亲。

该技术在十二月1938年

总的思想趋势最好从选票结尾处的言论中得到解释。一票说:“我不认为我从事的是Pulver的事,”而另一票则只是加了句“ Foo”。


首次有记载“富”在技术圈里大概是1959年的TMRC语言字典

FOO:神圣的音节(FOO MANI PADME HUM);仅在受到启发与神交流时才讲。我们的首要义务是保持Foo Counters的运转。

这些在FOLDOC中进行了解释。字典的编译器Pete Samson在2005年说过:

在TMRC上使用这个词比我来那儿早。foo计数器可能只是随机闪烁的灯光,或者可能是输入模糊的真实计数器。

从1996年的行话档案4.0.0开始

此词典的早期版本将“ baz”衍生为斯坦福大学对bar的腐败。但是,Pete Samson(TMRC词典的编译器)报告说,当他于1958年加入TMRC时,它已经是最新的。他说:“它来自“ Pogo”。鳄鱼人Albert烦恼或愤怒时,会大喊“ Bazz Fazz!”。或“ Rowrbazzle!” 据说,俱乐部的布置模仿了新英格兰的罗弗福克郡和巴瑟克斯郡(Rowrbazzle与(诺福克/萨福克/米德尔塞克斯/埃塞克斯)交织在一起。

在TMRC词典的前一年,1958年的MIT Voo Doo Gazette(“ MIT 教务长办公室的幽默补充”)(PDF)在John Banzhaf(一名电气工程专业的学生)的“墨菲和菲纳格尔法则”中提到了Foocom。 :

在Foocom和Anarcom的共同资助下,进一步的研究将法律扩展到了所有领域,并普遍适用:如果有任何问题,它将成为现实!

此外1964年的MIT VOO斗(PDF)引用TMRC用法:

是! 我想成为即时成功的客户。给我学位:...

  • FOO柜台

  • 富贞


但是,请记住,这个问题与代码示例有关,因此让我们找到在代码中发布的“ foo”,“ bar”和“ foobar”。

因此,Jargon File 4.4.7说“ foobar”:

最初可能是由Digital Equipment Corporation(DEC)在DECsystem手册中通过1960年代和1970年代初传播的;经证实的目击事件可以追溯到1972年。

我可以找到的第一个参考文献是1964年 2 ,但由Information International,Inc. 在1963年6月编写了《编程语言LISP:其操作和应用》,作者包括Timothy P. Hart和Michael Levin:

因此,由于“ FOO”是其本身的名称,因此“ COMITRIN”将以完全相同的方式对待“ FOO”和“(FOO)”。

还包括其他元语法变量,例如:FOO CROCK GLITCH / POOT TOOR / ON YOU / SNAP CRACKLE POP / XYZ

我期望这与1964年1 的MIT Project MAC 的AIM-064或Timothy P. Hart和Michael Levin的LISP练习中的“ foo”的下一个引用相同:

汽车[(((FOO。CROCK)。毛刺)]

它共享许多其他的元语法变量,例如:CHI /纽约州波士顿/菠菜黄油牛排/ FOO CROCK GLITCH /盆栽/盆栽/ ISTHISATRIVIALEXCERCISE / PLOOP FLOT TOP / SNAP CRACKLE POP /一二三/平面子阈值

对于“ foo”和“ bar”两者,我可以找到的最早参考文献是1966年6 的MIT Project MAC 的AIM-098或Peter Samson的PDP-6 LISP

像PRIN1一样,EXPLODE插入斜线,因此(EXPLODE(QUOTE FOO / BAR))PRIN1为(FOO // / BAR)或PRINC为(FOO / BAR)。


一些更多的回忆。

@Walter Mitty于2008年在此站点上回顾:

我将有关Foo Bar的行话文件放在第二位。我至少可以追溯到1963年,序列号为2的PDP-1位于麻省理工学院26号楼的二楼。在那里使用了Foo和Foo Bar,并于1964年之后在MAC项目的PDP-6会议室中使用。

John V. Everett在1996年回顾:

当我于1966年加入DEC时,foobar已经被普遍用作一次性文件名。我相信fubar成为foobar,因为PDP-6支持六个字符名称,尽管我一直认为该术语是从MIT迁移到DEC的。那时,DEC有许多MIT类型,其中有些曾与7090/7094 CTSS一起使用。由于709x也是36位计算机,因此foobar可能已被用作此处的通用文件名。

Foo和bar也通常用作文件扩展名。由于当前的文本编辑器在输入文件上进行操作并生成输出文件,因此通常需要从.foo文件编辑为.bar文件,然后再返回。

使用TECO编辑时,通常使用foo来填充缓冲区。精确填充一个磁盘块的文本字符串为IFOO $ HXA127GA $$。我使用的几乎所有PDP-6 / 10程序员都使用相同的命令字符串。

丹尼尔·PB·史密斯Daniel PB Smith)在1998年:

迪克·格鲁恩(Dick Gruen)在他的宿舍里有一个设备,通常由B电池,电阻器,电容器和NE-2氖管组成,他称之为“ foo计数器”。大约在1964年左右。

罗伯特·舒尔登弗赖Robert Schuldenfrei)在1996年:

使用FOO和BAR作为变量名的示例至少可以追溯到1964年和IBM7070。这可能也更旧了,但这是我第一次看到的地方。这是在汇编程序中。什么是FORTRAN整数等值?IFOO和IBAR?

保罗·W·韦塞尔布拉特Paul M.Wexelblat)在1992年:

最早的PDP-1汇编器使用两个字符作为符号(18位计算机),程序员总是留下一些单词作为补丁空间来解决问题。(跳到修补空间,执行新代码,然后跳回)。该空间通常称为FU:代表Fxxx Up,即您固定Fxxx Ups的地方。说话时被称为FU空间。后来的汇编程序(例如MIDAS允许使用三个char标签,因此FU变成了FOO,并且正如所有PDP-1程序员都会告诉您的那样,这是FOO空间。

布鲁斯·雷诺兹(1996):

在FOO(FU)BAR的IBM端是将BAR端用作基址寄存器。在1970年代中期,CICS程序员不得不担心各种xxxBAR ...我认为其中之一是FRACTBAR ...

这是1955年的IBM“ BAR”


其他早期参考资料:


我一直无法找到RFC3092和其他地方所建议的对foo bar的引用作为“倒置的foo信号”。

这是一些甚至更早的F00,但我认为它们是巧合/误报:


13

使用“ foo”和“ bar”之类的词使您专注于概念,而不是根据已知术语掌握的内容。例如:

public abstract class Animal
{
    public abstract void speak();
}

public class Cat 
    extends Animal
{
    public abstract void speak()
    {
        System.out.println("meow");
    }
}

public class Dog
    extends Animal
{
    public abstract void speak()
    {
        System.out.println("bark");
    }
}

上面的代码可让您依靠现实世界的知识。

如果您要解释一个概念,其中重要的部分不是正在执行的操作(例如,打印喵声或树皮),而是在如何完成操作上,那么请删除您熟悉的帮助部分:

public abstract class Foo
{
    public abstract void star();
}

public class Bar
    extends Foo
{
    public abstract void star()
    {
        System.out.println("A");
    }
}

public class Car
    extends Foo
{
    public abstract void star()
    {
        System.out.println("b");
    }
}

现在,您必须专注于实际发生的事情,您不再能够猜测即将发生的事情。

因此,简短的版本是foo,bar等用于强调概念,在这些概念中,内容实际上并不重要,但思想确实重要。


啊,真正的答案!
尼克

1
是的,但是为什么要特别选择Foo和Bar?为什么不请Lorum和Ipsum?

en.wikipedia.org/wiki/Foo可能是准确的……

@TofuBeer是的,它们是“元语法变量”。@masher看到了我的答案,其中包含了大量关于为什么Foo和Bar而不是Lorem和Ipsum的参考。programmers.stackexchange.com/questions/69788/...事实上,有一些已经使用多年不同metasyntactic变量的负荷,并在不同的地方。
雨果

7

http://en.wikipedia.org/wiki/Foobar

在技​​术上,这个词最初可能是由Digital Equipment Corporation在1960年代和1970年代初期通过系统手册传播的。另一个可能性是foobar从电子设备演变为foo信号倒置。这是因为如果数字信号为低电平有效(因此负电压或零电压条件表示“ 1”),则通常在信号标签上放置一个水平条。术语文件说明foo可能早于FUBAR


这并不能解释为什么

在1964年以后的LISP,PDP-1和MAC项目上,我从MIT和DEC(都在马萨诸塞州)找到了很多有关“ foo”和“ bar”的参考文献。这是一个好主意,但我找不到对“倒置foo信号”的任何引用。这里更多:programmers.stackexchange.com/questions/69788/...
雨果

7

从行话文件http://www.catb.org/jargon/html/F/foo.html

foo:/ foo /

  1. j 厌恶的期限。
  2. [非常常见]非常普遍地用作绝对名称的样本名称,尤其是。程序和文件(尤其是临时文件)。
  3. 首先是语法示例中使用的元语法变量的标准列表。另请参见bar,baz,qux,quux,garply,waldo,fred,plugh,xyzzy,thud。

bar:/ bar /,n。

  1. [非常常见]第二个元语法变量,在foo之后和baz之前。“假设我们有两个功能:FOO和BAR。FOO打电话给BAR。...”
  2. 通常附加到foo以产生foobar。


4

我将有关Foo Bar的行话文件放在第二位。

我至少可以追溯到1963年,序列号为2的PDP-1位于麻省理工学院26号楼的二楼。在那里使用了Foo和Foo Bar,并于1964年之后在MAC项目的PDP-6会议室中使用。


+1是见证Foo Bar最早的用途之一:) Foo和Foo Bar在这里实际使用了多少?
雨果

雨果

2

据我所知,富来自foob​​ar的这是“FUBAR”的改变,军事抓phraase是代表“ F ***以外 ED ü p b eyond 一个 LL [R ecognition。”

再说一次,可能还有其他来源。

http://en.wikipedia.org/wiki/Foo


0

Foo和Bar(也称为FUBAR ...超越所有识别功能的F ***)刚刚用作类,属性,方法名称等内容的标准通用名称。

基本上,这种想法是在传递您的代码时没有太多可能会脱离代码工作方式的无关信息(即,我们无需知道您的函数名为AddUser即可查看代码并了解如果重命名该代码会做什么)到Foo())。


-3

这些是无意义的词,在大多数情况下可以用更相关的示例词代替。当某人无法想到一个好的例子时,在编程中经常使用“ foo”和“ bar”这两个词。

如果“ foo”和“ bar”是从FUBAR派生的,那么为什么在示例中没有那么多人无法理解的例子中,却被这么多的专业人员用在示例中?

对我来说,这些词的不当用法是令人难以置信的。


2
请注意,问题下方是一面旗帜:我们正在寻找能提供一些解释和上下文的长答案。不要仅仅给出一个答案。解释为什么你的答案是正确的,最好是引用。不包含说明的答案可能会被删除。您的答案提供的解释很少。目前这只是一个意见。
马丁·皮耶特

还有许多其他简短答案。如果您不同意我的意思,而不是指出不适用的技术性,为什么不提供论据呢?
约翰·

在第2版中的编辑使此答案比以前更糟(尽管很难想象会变得更糟):现在,它只是重复了4年前发布的另一个答案
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.