Подтвердить что ты не робот

Почему "||" символ для или?

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

4b9b3361

Ответ 1

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

Из История символов ASCII:

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

Джон Уорнер Бэккус (3 декабря 1924 года - 17 марта 2007 года) был американским ученым-компьютером. Он руководил командой, которая изобрела первый широко используемый язык программирования высокого уровня (FORTRAN) и была изобретателем формы Backus-Naur (BNF), почти универсальной используемой нотации для определения формального синтаксиса языка. Он также занимался исследованиями на функциональном уровне программирования и помогал популяризировать его.

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

В форме Бэксу-Наура выражение состоит из последовательностей символов и/или последовательностей, разделенных символом "|", указывая на выбор, и все это является возможной заменой символа слева.

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

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

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

IBM Keyboard

Но есть явные доказательства того, что Наур добавил вертикальную линию к ALGOL 60. В статье, опубликованной в 1964 году, (Кнут Д., "Нормальная форма Бэксу против формы Бэксуса Наура", Письма в редакцию, Сообщения ACM, Vol 7 (1964), стр. 735-736, доступный здесь), Дональд Кнут утверждал, что "Нормальная форма Бэкуса" следует называть "Форма Бэкуса Наура" из-за вкладов Наур. Среди вкладов, о которых он говорил, было добавление вертикальной линии как оператора или.

Здесь изображен фрагмент статьи 1964 года. Обратите внимание на правую сторону, маркированный элемент (iv).

enter image description here

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

enter image description here

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

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

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

если (e1 и e2)...

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

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

Ответ 2

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

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

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

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

Ответ 4

Самое старое использование | как или, я мог найти после того, как googling некоторое время находился в форме Backus Naur.

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

Затем в 1960 году он написал отчет об алгоритмическом языке ALGOL 60, который уже использовал | -notation.

Поэтому он изобрел его где-то между 1959 и 1960 годами.

Ответ 5

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

Ответ 6

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