ti-enxame.com

Por que é "||" o símbolo para ou?

Eu sei disso || representa a operação lógica "ou", mas estou curioso para saber se alguém conhece a história da escolha desse símbolo. Foi apenas porque passou a ser um símbolo não utilizado no teclado?

18
Erty Seidohl

Origens da linha vertical única "|" como indicando o disjuntivo "ou".

De histórico de caracteres ASCII :

Foi suposto que o caractere de linha vertical foi introduzido na área de computação com a metalinguagem da Forma Backus-Naur para descrever as linguagens de programação. Também foi utilizado no APL no início dos anos 60 e incorporado no PL/I aproximadamente ao mesmo tempo que o operador OR e, dobrou, como operador de concatenação.

John Warner Backus (3 de dezembro de 1924 - 17 de março de 2007) era um cientista da computação americano. Ele dirigiu a equipe que inventou a primeira linguagem de programação de alto nível amplamente usada (FORTRAN) e foi o inventor da forma Backus-Naur (BNF), a notação quase universalmente usada para definir a sintaxe formal da linguagem. Ele também pesquisou sobre programação em nível de função e ajudou a popularizá-la.

Um designer de linguagem de programação da IBM, ele propôs "fórmulas metalinguísticas" para descrever a sintaxe da nova linguagem de programação IAL, conhecida hoje como ALGOL 58, usando a notação BNF.

Na forma Backus-Naur, uma expressão consiste em sequências de símbolos e/ou sequências separadas por '|', indicando uma opção, sendo o todo uma possível substituição do símbolo à esquerda.

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

Na especificação ALGOL 58, Backus não usava originalmente a linha vertical; Ele usou a palavra "ou" com uma linha sobre ela (assim como o símbolo lógico OR symbol) Peter Naur , um cientista da computação dinamarquês que contribuiu para o ALGOL 60, modificou vários símbolos para aqueles que poderiam ser digitados em um teclado padrão. Entre suas mudanças estava a adição da linha vertical. (Fonte: " História das linguagens de programação ", Richard L. Wexelblat)

Mesmo depois a especificação ALGOL 60, no entanto, existem muitos exemplos da OR symbol símbolo ainda está sendo usado com o ALGOL. De fato, em 1961, o conjunto de caracteres ASCII teve sua barra invertida adicionada para que os operadores lógicos da ALGOL pudessem ser digitados com barras, assim: \/ /\ Os símbolos podem ser encontrados no teclado IBM 2741, disponível em meados dos anos sessenta:

IBM Keyboard

Mas há evidências claras de que Naur adicionou a linha vertical ao ALGOL 60. Em um artigo publicado em 1964, (Knuth D., “Backus Normal Form vs. Backus Naur Form”) Cartas ao Editor, Communications of the ACM, Vol. 7 ( 1964). Pp. 735-736, disponível aqui ), Donald Knuth argumentou que "Backus Normal Form" deveria ser referido como "Backus Naur Form" devido às contribuições de Naur. Entre as contribuições a que ele se referiu estava a adição da linha vertical como operador ou.

Aqui está uma imagem de uma parte do artigo de 1964. Observe no lado direito, o item com marcadores (iv).

enter image description here

O artigo continua descrevendo Naur como responsável por essa mudança semântica como parte de suas responsabilidades de edição no relatório ALGOL de 1960:

enter image description here

Origens da linha vertical dupla "||"

Em O Desenvolvimento da Linguagem C , Dennis M. Ritchie descreve por que o operador de linha vertical dupla foi adicionado:

As mudanças rápidas continuaram após o nome do idioma, por exemplo, a introdução do && e || operadores. Em BCPL e B, a avaliação de expressões depende do contexto: dentro de if e de outras instruções condicionais que comparam o valor de uma expressão com zero, essas linguagens colocam uma interpretação especial nos operadores e (&) e ou (|). Em contextos comuns, eles operam bit a bit, mas na instrução B

se (e1 e e2) ...

o compilador deve avaliar e1 e, se for diferente de zero, avaliar e2 e, se também for diferente de zero, elaborar a instrução dependente do if. O requisito desce recursivamente em & e | operadores dentro de e1 e e2. A semântica de curto-circuito dos operadores booleanos em tal contexto de "valor de verdade" parecia desejável, mas a sobrecarga dos operadores era difícil de explicar e usar. Por sugestão de Alan Snyder, apresentei o && e || operadores para tornar o mecanismo mais explícito.

(Obrigado a Richard Brown pela pesquisa desta seção).

34
Cameron Fredman

Eu acredito que foi o BCPL (wp) que o introduziu. Seu CPL predecessor tinha o símbolo | mas usou-o como um comentário alternativo até o final da linha.

Não encontrei nenhuma evidência de que o motivo já foi escrito em qualquer lugar, mas podemos pensar se essa foi a única opção (o que teria sido um bom motivo):

Eles não escolheram a Palavra "ou" porque o conceito de gramáticas livres de contexto (wp) estava se tornando muito popular em design de linguagem, para que eles escolham algo que não possa ser um símbolo válido (símbolos sendo definidos como [a-zA-Z _] + [a-zA-Z0-9 _] * ou adicionalmente com '-' normalmente).

Então eles analisaram todos os caracteres que foram definidos nos padrões definidos anteriormente. (Lembre-se de que o personagem já deveria existir em um padrão, para que eles não pudessem apenas decidir e pintar por conta própria.) Eles olharam especialmente 3 anos ASCII mas também no EBCDIC. Eles descobriram que não havia muito o que escolher:

  • além do alfabeto, sublinhado, números e espaço, havia:
  • NÚMERO DE SOH STX ETX E ACQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US, todos usados ​​como caracteres de controle de terminal (e não imprimíveis).
  • "" () {} [] eram semanticamente impróprios, como era & (usado como 'e' por> 100 anos)
  • todos estes foram utilizados ALGOL e/ou CPL:! # $% '* +, -. /:; <=>? @\^ _ ~
  • então o que restou foram `e | mas o backtick não pôde ser usado porque não estava disponível em todos os lugares, mesmo quando reivindicado como compatível com ascii.
3
Bernd Elkemann

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

As mudanças rápidas continuaram após o nome do idioma, por exemplo, a introdução do && e || operadores. Em BCPL e B, a avaliação de expressões depende do contexto: dentro de if e de outras instruções condicionais que comparam o valor de uma expressão com zero, essas linguagens colocam uma interpretação especial nos operadores e (&) e ou (|). Em contextos comuns, eles operam bit a bit, mas na instrução B

if (e1 & e2) ... o compilador deve avaliar e1 e se for diferente de zero, avaliar e2 e, se também for diferente de zero, elaborar a instrução dependente do if. O requisito desce recursivamente em & e | operadores dentro de e1 e e2. A semântica de curto-circuito dos operadores booleanos em tal contexto de "valor de verdade" parecia desejável, mas a sobrecarga dos operadores era difícil de explicar e usar. Por sugestão de Alan Snyder, apresentei o && e || operadores para tornar o mecanismo mais explícito.

2
Richard Brown

O uso mais antigo de um | como ou, pude encontrar depois de pesquisar um pouco sobre o tempo em Formulário Backus Naur .

O que parece ter aparecido pela primeira vez no artigo A sintaxe e a semântica da linguagem algébrica internacional proposta para a conferência Zuerich ACM-GRAMM por J.W. Backus em 1959, no entanto, ele não usou o | notação lá. Em vez disso, ele usou um "ou" sobreposto.

Então, em 1960, ele escreveu o Relatório sobre a linguagem algorítmica ALGOL 6 , que já usava a anotação |.

Então ele o inventou em algum lugar entre 1959 e 1960.

1
BeniBela

O uso da barra vertical para expressar uma operação "ou" (|| para lógica ou | para bits) pode ter surgido de BNF . O BNF não é uma linguagem de programação, mas foi desenvolvido no final da década de 1950 como uma maneira de criar uma especificação formal para a sintaxe da linguagem de programação. O caractere da barra vertical no BNF indica uma escolha entre expansões válidas para o símbolo não terminal. É altamente provável que os designers de linguagens de programação nos anos 60 e nos anos seguintes estejam familiarizados com essa notação e tenham sido influenciados por ela.

0
Richard Schwartz