Почему "||" символ или? [закрытый]

Я знаю, что || представляет логическую операцию "или", но мне любопытно, знает ли кто-нибудь историю выбора этого символа. Было ли это просто потому, что это был неиспользуемый символ на клавиатуре?

6 ответов


происхождение одной вертикальной линии " | "как указывающее на дизъюнктив"или".

С ASCII история символов:

было предположено, что символ вертикальной линии был введено в область вычислений с формой Backus-Naur метаязык для описания языков программирования. Он также был взят в пользу в APL в начале 1960-х годов и включены в PL / I около в то же время, как оператор OR и, в два раза, как сцепление оператор.

Джон Уорнер Бэкус

программирования в IBM он предложил "металингвистические формулы" для описания синтаксиса нового языка программирования IAL, известного сегодня как ALGOL 58, используя нотацию BNF.

в форме Backus-Naur выражение состоит из последовательностей символов и/или последовательностей, разделенных '|', что указывает на выбор, причем все это является возможной заменой символа слева.

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

в спецификации ALGOL 58 Backus первоначально не использовал вертикаль линия; он использовал слово " или " с линией над ним (а также логический символ OR symbol). Питер Наур, датский ученый-компьютерщик, который внес свой вклад в ALGOL 60, изменил несколько символов на те, которые могли быть набраны на стандартной клавиатуре. Среди его изменений было добавление вертикальной линии. (Источник: "история языков программирования", Richard L. Wexelblat)

даже после спецификация Алгол 60, однако, множество из примеров OR symbol символ все еще используется с АЛГОЛОМ. Фактически, в 1961 году набор символов ASCII получил обратную косую черту, поэтому логические операторы ALGOL могли быть набраны с косыми чертами, например:\/ /\ символы можно найти на клавиатуре IBM 2741, доступной в середине шестидесятых:

IBM Keyboard

но есть явные доказательства того, что Наур добавил вертикальную линию к АЛГОЛУ 60. В статье, опубликованной в 1964 году, (кнут Д., " нормальная форма Backus против формы Backus Naur" Письма в редакцию, сообщения ACM, Vol. 7 (1964). PP. 735-736, available здесь), Дональд Кнут утверждал, что" нормальная форма Бэкуса "должна называться" формой Бэкуса Наура " из-за вклада Наура. Среди вкладов, которые он упомянул, было добавление вертикальной линии в качестве оператора or.

вот изображение части статьи 1964 года. Обратите внимание на маркированный справа пункт (iv).

enter image description here

в далее в статье говорится, что Наур несет ответственность за это семантическое изменение в рамках своих обязанностей по редактированию доклада Algol 1960 года:

enter image description here

происхождение двойной вертикальной линии"//"

на развитие языка C, Деннис М. Ричи описывает, почему был добавлен оператор двойной вертикальной линии:

быстрые изменения продолжались после того, как язык был назван, например этот введение операторов && и||. В BCPL и B, оценка выражений зависит от контекста: внутри if и других условные операторы, сравнивающие значение выражения с нулем, эти языки предоставляют специальный перевод на and ( & ) И or (|) операторы. В обычных условиях они действуют побитово, но в Б заявление

if (e1 & e2)...

компилятор должен вычислить e1, и если он ненулевой, вычислить e2 и если это тоже является ненулевым, разработайте утверждение, зависящее от if. Требование рекурсивно нисходит на операторы & и | в пределах e1 и Е2. Семантика короткого замыкания булевых операторов в таких контекст "истина-ценность" казался желательным, но перегрузка операторов трудно объяснить и использовать. по предложению Алан Снайдер, я представил & & и / / операторы, чтобы сделать механизм более явный.

(спасибо к Ричард Браун для исследования этого раздела).


From: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. Семантика короткого замыкания булевых операторов в таком контексте "истинностного значения" казалась желательной, но перегрузку операторов было трудно объяснить и использовать. по предложению Алана Снайдера, я представил операторы && и||, чтобы сделать механизм более явным.


Я считаю, что это был BCPL (wp), который ввел его. Его предшественник CPL имел символ | но использовал его как альтернативный комментарий до конца строки.

Я не нашел никаких доказательств того, что причина было когда-либо написано в любом месте, но мы можем подумать о том, был ли это единственный выбор (который сделал бы вескую причину):

они не выбрали слово "или", потому что понятие контекстно-свободных грамматик (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, которые все использовались в качестве символов терминального управления (и непечатаемых).
  • "" ( ) { } [ ] были семантически непригодны, как и & (использовались как 'и' для >100 лет)
  • все они были использованы ALGOL и / или CPL:! # $ % ' * + , -. / : ; ? @ \ ^ _ ~
  • так что осталось " и / но backtick не может быть использован, потому что он не был доступен везде, даже там, где утверждал ascii-совместимый.

самое старое использование | as или, я мог найти после того, как гуглил некоторое время был в Backus Naur Форма.

который, кажется, впервые появился в газете синтаксис и семантика предлагаемого международного алгебраического языка конференции ACM-GRAMM Zuerich J. W. Backus в 1959 году, однако он не использовал | обозначение там. Вместо этого он использовал наложенное "или".

затем в 1960 году он написал отчет об алгоритмическом язык Алгол 60, который уже использовал / - нотацию.

Итак, он изобрел его где-то между 1959 и 1960 годами.


использование вертикальной полосы для выражения операции" или " (||для логического или | для битового), возможно, произошло от BNF. BNF не является языком программирования, но он был разработан в конце 1950-х годов как способ создания формальной спецификации синтаксиса языка программирования. Символ вертикальной полосы в BNF указывает на выбор между допустимыми расширениями для нетерминального символа. Весьма вероятно, что разработчики языков программирования в 60-х и более поздних годах были знакомы с этим обозначением и были связаны.


логический символ или || фактически произошел от разделения символа + plus. Горизонтальная полоса была повернута на 90 градусов и, таким образом, была рождением логического или || символа. Вы можете или не можете найти это документально в интернете, потому что это произошло так давно. Для побитового или|, (вы догадались) перекладина была удалена из символа + plus.