web-dev-qa-db-fra.com

Pourquoi "||" le symbole pour ou?

Je le sais || représente l'opération logique "ou", mais je suis curieux de savoir si quelqu'un connaît l'histoire du choix de ce symbole. Était-ce simplement parce que c'était un symbole inutilisé sur le clavier?

18
Erty Seidohl

Origines de la ligne verticale unique "|" comme indiquant le "ou" disjonctif.

De historique des caractères ASCII :

Il a été supposé que le caractère de ligne verticale a été introduit dans le domaine de l'informatique avec le métalangage Backus-Naur Form pour décrire les langages de programmation. Il a également été utilisé dans APL au début des années 1960 et incorporé dans PL/I à peu près en même temps que l'opérateur OR et, doublé, comme opérateur de concaténation.

John Warner Backus (3 décembre 1924 - 17 mars 2007) était un informaticien américain. Il a dirigé l'équipe qui a inventé le premier langage de programmation de haut niveau largement utilisé (FORTRAN) et a été l'inventeur de la forme Backus-Naur (BNF), la notation presque universellement utilisée pour définir la syntaxe du langage formel. Il a également effectué des recherches sur la programmation au niveau des fonctions et a contribué à sa vulgarisation.

Concepteur de langage de programmation chez IBM, il a proposé des "formules métalinguistiques" pour décrire la syntaxe du nouveau langage de programmation IAL, connu aujourd'hui sous le nom d'ALGOL 58, en utilisant la notation BNF.

Sous forme Backus-Naur, une expression est constituée de séquences de symboles et/ou de séquences séparées par '|', indiquant un choix, le tout étant une possible substitution du symbole de gauche.

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

Dans la spécification ALGOL 58, Backus n'utilisait pas à l'origine la ligne verticale; Il a utilisé le mot "ou" avec une ligne au-dessus (ainsi que le symbole logique OR symbol). Peter Naur , un informaticien danois qui a contribué à ALGOL 60, a modifié plusieurs symboles en ceux qui pouvaient être saisis sur un clavier standard. Parmi ses changements figurait l'ajout de la ligne verticale. (Source: " Histoire des langages de programmation ", Richard L. Wexelblat)

Même après la spécification ALGOL 60, cependant, il existe de nombreux exemples de OR symbol symbole toujours utilisé avec ALGOL. En fait, en 1961, le jeu de caractères ASCII a obtenu sa barre oblique inverse afin que les opérateurs logiques d'ALGOL puissent être saisis avec des barres obliques, comme ceci: \/ /\ Les symboles se trouvent sur le clavier IBM 2741, disponible au milieu des années 60:

IBM Keyboard

Mais il existe des preuves évidentes que Naur a ajouté la ligne verticale à ALGOL 60. Dans un article publié en 1964, (Knuth D., "Backus Normal Form vs. Backus Naur Form", Lettres à l'éditeur, Communications of the ACM, Vol. 7 ( 1964), pp. 735-736, disponible ici ), Donald Knuth a soutenu que "Backus Normal Form" devrait être appelé "Backus Naur Form" en raison des contributions de Naur. Parmi les contributions auxquelles il a fait allusion figurait l'ajout de la ligne verticale en tant qu'opérateur.

Voici une image d'une partie de l'article de 1964. Remarque sur le côté droit, l'élément à puces (iv).

enter image description here

L'article continue en décrivant Naur comme étant responsable de ce changement sémantique dans le cadre de ses responsabilités d'édition pour le rapport ALGOL de 1960:

enter image description here

Origines de la double ligne verticale "||"

Dans Le développement du langage C , Dennis M. Ritchie explique pourquoi l'opérateur à double ligne verticale a été ajouté:

Des changements rapides se sont poursuivis après le nom de la langue, par exemple l'introduction des symboles && et || les opérateurs. Dans BCPL et B, l'évaluation des expressions dépend du contexte: dans if et dans d'autres instructions conditionnelles qui comparent la valeur d'une expression à zéro, ces langages placent une interprétation spéciale sur les opérateurs and (&) et ou (|). Dans des contextes ordinaires, ils opèrent au niveau du bit, mais dans l'instruction B

si (e1 et e2) ...

le compilateur doit évaluer e1 et s'il est différent de zéro, évaluer e2, et s'il est également différent de zéro, élaborer l'instruction en fonction de l'if. L'exigence descend récursivement sur & et | opérateurs dans e1 et e2. La sémantique de court-circuit des opérateurs booléens dans un tel contexte de "valeur de vérité" semblait souhaitable, mais la surcharge des opérateurs était difficile à expliquer et à utiliser. À la suggestion d'Alan Snyder, j'ai présenté les && et || opérateurs pour rendre le mécanisme plus explicite.

(Merci à Richard Brown pour la recherche de cette section).

34
Cameron Fredman

Je crois que c'est BCPL (wp) qui l'a introduit. Son prédécesseur CPL avait le symbole | mais l'a utilisé comme commentaire alternatif jusqu'à la fin de la ligne.

Je n'ai trouvé aucune preuve que la raison ait été écrite quelque part, mais nous pouvons penser si c'était le seul choix (ce qui aurait fait une bonne raison):

Ils n'ont pas choisi le mot "ou" parce que le concept de grammaires sans contexte (wp) devenait très populaire dans conception de langage, ils ont donc choisi quelque chose qui ne pouvait pas être un symbole valide (les symboles étant définis comme [a-zA-Z _] + [a-zA-Z0-9 _] * ou en plus avec '-' typiquement).

Ils ont donc examiné tous les caractères définis dans des normes précédemment définies. (Gardez à l'esprit que le personnage devait déjà exister dans une norme afin qu'ils ne puissent pas simplement décider et peindre le leur.) Ils ont regardé particulièrement attentivement le 3 ans ASCII mais aussi à EBCDIC. Ils ont trouvé qu'il n'y avait pas grand chose à choisir:

  • à part l'alphabet, le trait de soulignement, les nombres et l'espace, il y avait:
  • 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 qui étaient tous utilisés comme caractères de contrôle de terminal (et non imprimables).
  • "" () {} [] étaient sémantiquement impropres, tout comme & (a été utilisé comme 'et' pendant> 100 ans)
  • tous ont été utilisés ALGOL et/ou CPL:! # $% '* +, -. /:; <=>? @\^ _ ~
  • donc ce qui restait étaient `et | mais le backtick n'a pas pu être utilisé car il n'était pas disponible partout, même s'il était déclaré compatible ascii.
3
Bernd Elkemann

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

Des changements rapides se sont poursuivis après le nom de la langue, par exemple l'introduction des symboles && et || les opérateurs. Dans BCPL et B, l'évaluation des expressions dépend du contexte: dans if et dans d'autres instructions conditionnelles qui comparent la valeur d'une expression à zéro, ces langages placent une interprétation spéciale sur les opérateurs and (&) et ou (|). Dans des contextes ordinaires, ils opèrent au niveau du bit, mais dans l'instruction B

if (e1 & e2) ... le compilateur doit évaluer e1 et s'il est différent de zéro, évaluer e2, et s'il est également différent de zéro, élaborer l'instruction en fonction du if. L'exigence descend récursivement sur & et | opérateurs dans e1 et e2. La sémantique de court-circuit des opérateurs booléens dans un tel contexte de "valeur de vérité" semblait souhaitable, mais la surcharge des opérateurs était difficile à expliquer et à utiliser. À la suggestion d'Alan Snyder, j'ai présenté les && et || opérateurs pour rendre le mécanisme plus explicite.

2
Richard Brown

L'utilisation de la barre verticale pour exprimer une opération "ou" (|| pour logique ou | pour bit) peut provenir de BNF . BNF n'est pas un langage de programmation, mais il a été développé à la fin des années 1950 pour créer une spécification formelle de la syntaxe du langage de programmation. Le caractère de barre verticale dans BNF indique un choix entre des extensions valides pour le symbole non terminal. Il est fort probable que les concepteurs de langages de programmation des années 60 et des années ultérieures connaissaient cette notation et en aient été influencés.

0
Richard Schwartz