20

我知道这||代表逻辑运算“或”,但我很好奇是否有人知道选择该符号的历史。仅仅是因为它恰好是键盘上未使用的符号吗?

4

6 回答 6

38

单竖线“|”的起点 表示析取的“或”。

ASCII字符历史

据推测,垂直线字符被引入计算领域,是用用于描述编程语言的巴科斯-瑙尔形式元语言。它也于 1960 年代初在 APL 中使用,并与 OR 运算符几乎同时并入 PL/I,并且作为连接运算符加倍。

John Warner Backus(1924 年 12 月 3 日 - 2007 年 3 月 17 日)是美国计算机科学家。他领导的团队发明了第一个广泛使用的高级编程语言 (FORTRAN),并且是巴科斯-瑙尔形式 (BNF) 的发明者,这是一种几乎普遍用于定义形式语言语法的符号。他还研究了函数级编程并帮助推广它。

作为 IBM 的一名编程语言设计师,他提出了“元语言公式”来描述新的编程语言 IAL(今天称为 ALGOL 58)的语法,使用 BNF 表示法。

在巴科斯-瑙尔形式中,表达式由符号序列和/或用“|”分隔的序列组成,表示一个选择,整个是左边符号的可能替换。

<personal-name> ::= <name> | <initial>

在 ALGOL 58 规范中,Backus 最初并没有使用垂直线;他使用了“或”这个词,上面有一条线(以及逻辑符号或符号)。 为 ALGOL 60 做出贡献的丹麦计算机科学家Peter Naur将几个符号修改为可以在标准键盘上键入的符号。他的变化之一是增加了垂直线。(来源:“编程语言史”,Richard L. Wexelblat)

然而,即使ALGOL 60 规范之后,仍有大量或符号符号示例仍然与 ALGOL 一起使用。事实上,在 1961 年,ASCII 字符集添加了反斜杠,因此 ALGOL 的逻辑运算符可以用斜杠输入,如下所示: \/ /\ 这些符号可以在 60 年代中期的 IBM 2741 键盘上找到:

IBM 键盘

但有明确的证据表明,Naur 在 ALGOL 60 中添加了垂直线。在 1964 年发表的一篇文章中,(Knuth D.,“Backus Normal Form vs. Backus Naur Form”致编辑的信,ACM 通讯,第 7 卷( 1964). pp. 735-736, 可在此处获得),Donald Knuth 认为,由于 Naur 的贡献,“巴科斯范式”应称为“巴科斯瑙尔形式”。他提到的贡献之一是添加了垂直线作为或运算符。

这是 1964 年文章的一部分的图片。请注意右侧的项目符号 (iv)。

在此处输入图像描述

文章继续描述 Naur 对语义变化负责,这是他对 1960 年 Algol 报告的编辑职责的一部分:

在此处输入图像描述

双竖线“||”的起源

The Development of the C Language中,Dennis M. Ritchie 描述了为什么要添加双竖线运算符:

语言被命名后继续快速变化,例如引入 && 和 || 运营商。在 BCPL 和 B 中,表达式的计算取决于上下文:在 if 和其他将表达式的值与零进行比较的条件语句中,这些语言对 and (&) 和 or (|) 运算符进行了特殊解释。在普通上下文中,它们按位操作,但在 B 语句中

如果 (e1 & e2) ...

编译器必须评估 e1,如果它不为零,则评估 e2,如果它也是非零,则详细说明依赖于 if 的语句。需求递归地下降到 & 和 | e1 和 e2 中的运算符。在这种“真值”上下文中,布尔运算符的短路语义似乎是可取的,但运算符的重载难以解释和使用。在 Alan Snyder 的建议下,我引入了 && 和 || 运营商使机制更加明确

(感谢Richard Brown对本节的研究)。

于 2013-02-24T22:03:52.777 回答
3

我相信是 BCPL (wp)引入了它。它的前身 CPL 具有该符号|,但将其用作替代的 til-end-of-line 注释。

我没有发现任何证据表明原因曾经在任何地方写过,但我们可以考虑一下它是否是唯一的选择(这将是一个很好的理由):

他们没有选择“或”这个词,因为上下文无关语法 (wp)的概念在语言设计中变得非常流行,所以他们选择了不能是有效符号的东西(符号被定义为 [a-zA-Z_ ]+[a-zA-Z0-9_]* 或通常带有“-” )。

因此,他们查看了之前定义的标准中定义的所有字符。(请记住,字符必须已经存在于标准中,因此他们不能只决定和绘制自己的字符。)他们特别努力地查看了 3 岁的 ASCII 和 EBCDIC。他们发现没有太多选择:

  • 除了字母、下划线、数字和空格外,还有:
  • NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 这些都被用作终端控制字符(并且不可打印)。
  • "" ( ) { } [ ] 在语义上是不合适的,就像 & 一样(被用作 'and' 超过 100 年)
  • 所有这些都使用了 ALGOL 和/或 CPL:!# $ % ' * + , - . / : ; < = > ? @\^_~
  • 所以剩下的是`和| 但是不能使用反引号,因为即使在声称符合 ascii 的情况下也无法在任何地方使用它。
于 2013-02-24T22:04:15.313 回答
2

来自:http ://cm.bell-labs.com/cm/cs/who/dmr/chist.html

语言被命名后继续快速变化,例如引入 && 和 || 运营商。在 BCPL 和 B 中,表达式的计算取决于上下文:在 if 和其他将表达式的值与零进行比较的条件语句中,这些语言对 and (&) 和 or (|) 运算符进行了特殊解释。在普通上下文中,它们按位操作,但在 B 语句中

if (e1 & e2) ... 编译器必须评估 e1,如果它不为零,则评估 e2,如果它也非零,则根据 if 详细说明语句。需求递归地下降到 & 和 | e1 和 e2 中的运算符。在这种“真值”上下文中,布尔运算符的短路语义似乎是可取的,但运算符的重载难以解释和使用。在 Alan Snyder 的建议下,我引入了 && 和 || 运算符使机制更加明确。

于 2013-02-24T21:46:16.187 回答
1

| 最古老的用法 或者,我在谷歌搜索一段时间后可以找到Backus Naur Form

这似乎最早出现在JW Backus 于 1959 年在 Zuerich ACM-GRAMM 会议上提出的国际代数语言的语法和语义的论文中,但是他没有使用 | 那里的符号。相反,他使用了一个带上划线的“或”。

然后在 1960 年,他撰写了关于算法语言 ALGOL 60 的报告,该语言已经使用了 |-符号。

所以他在 1959 年到 1960 年之间的某个地方发明了它。

于 2013-02-24T22:10:41.070 回答
0

使用竖线表示“或”运算(|| 表示逻辑,或 | 表示按位)可能源于BNF。BNF 不是一种编程语言,但它是在 1950 年代后期开发的,作为一种为编程语言语法创建正式规范的方法。BNF 中的竖线字符表示在非终结符的有效扩展之间进行选择。60 年代及以后的编程语言设计者很可能熟悉这种表示法并受到它的影响。

于 2013-02-24T21:53:20.440 回答
-3

逻辑或 || 符号实际上来自 + 加号的拆分。水平条旋转了 90 度,因此是逻辑 OR || 的诞生。象征。您可能会或可能不会在互联网上找到此文档,因为它发生在很久以前。对于按位或 | , (你猜对了)横杆已从 + 加号中删除。

于 2013-02-24T21:47:42.733 回答