web-dev-qa-db-ja.com

「||」はなぜですかまたはのための記号?

そんなこと知ってる ||は論理演算「または」を表しますが、そのシンボルを選択した歴史を知っている人がいるかどうかは興味があります。それはたまたまキーボード上の未使用のシンボルであったからですか?

18
Erty Seidohl

単一の垂直線「|」の原点選言的な「または」を示すものとして。

ASCII文字履歴 から:

プログラミング言語を記述するためのBackus-Naur Formメタ言語を使用して、コンピューティングの領域に垂直線文字が導入されたと推測されています。また、1960年代初期にAPLで使用され、OR演算子とほぼ同時にPL/Iに組み込まれ、連結演算子として2倍になりました。

John Warner Backus (1924年12月3日– 2007年3月17日)は、アメリカのコンピューター科学者でした。彼は、最初に広く使用されている高レベルプログラミング言語(FORTRAN)を発明したチームを指揮し、正式な言語構文を定義するためにほぼ普遍的に使用される表記法であるBackus-Naur形式(BNF)の発明者でした。また、関数レベルのプログラミングの研究を行い、その普及に貢献しました。

IBMのプログラミング言語デザイナーである彼は、BNF表記を使用して、今日のALGOL 58として知られる新しいプログラミング言語IALの構文を記述するための「メタ言語式」を提案しました。

Backus-Naur形式では、式はシンボルのシーケンスおよび/または '|'で区切られたシーケンスで構成され、選択を示します。全体が左側のシンボルの可能な置換です。

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

ALGOL 58仕様では、Backusはもともと垂直線を使用していませんでした。彼は単語「または」の上に線を付けて使用しました(および論理記号 OR symbol)。 Peter Naur 、ALGOL 60に貢献したデンマークのコンピューター科学者は、いくつかの記号を標準キーボードで入力できる記号に変更しました。彼の変更の中には、縦線が追加されました。 (出典: " プログラミング言語の歴史 "、リチャードL.ウェクセブラト)

でもafter ALGOL 60仕様ですが、多くの例があります OR symbol シンボルはまだALGOLで使用されています。実際、1961年にASCII文字セットにバックスラッシュが追加されたため、ALGOLの論理演算子は次のようにスラッシュで入力できました:\/ /\シンボルは60年代半ばに利用可能なIBM 2741キーボードにあります。

IBM Keyboard

しかし、ナウルがALGOL 60に垂直線を追加したという明確な証拠があります。1964年に公開された記事で(Knuth D。、「Backus Normal Form vs. Backus Naur Form」Letters to the Editor、Communications of the ACM、Vol.7( 1964)。pp。735-736、available here )、Donald Knuthは、Naurの貢献により「Backus Normal Form」は「Backus Naur Form」と呼ばれるべきだと主張しました。彼が言及した貢献の中には、or演算子としての垂直線の追加がありました。

これが1964年の記事の一部の画像です。右側の箇条書き項目(iv)に注意してください。

enter image description here

この記事では、1960年のALGOLレポートの編集責任の一部として、その意味の変更を担当したとしてNaurを説明しています。

enter image description here

二重垂直線「||」の原点

C言語の開発 では、Dennis M. Ritchieが二重垂直線演算子が追加された理由を説明しています。

言語に名前が付けられた後、急速な変化が続きました。たとえば、&&や||の導入演算子。 BCPLおよびBでは、式の評価はコンテキストに依存します。式の値をゼロと比較するifおよびその他の条件ステートメント内では、これらの言語はand(&)およびor(|)演算子に特別な解釈を行います。通常のコンテキストでは、ビット単位で動作しますが、Bステートメントでは

if(e1&e2)...

コンパイラーはe1を評価する必要があり、ゼロでない場合はe2を評価し、ゼロでない場合はifに依存するステートメントを作成します。要件は&および|で再帰的に下降します。 e1およびe2内の演算子。このような「真理値」コンテキストでのブール演算子のショートサーキットセマンティクスは望ましいように見えましたが、演算子のオーバーロードは説明と使用が困難でした。 アラン・スナイダーの提案で、&&と||を導入しました。メカニズムをより明示的にする演算子

(このセクションの研究について Richard Brown に感謝します)。

34
Cameron Fredman

BCPL (wp) が導入されたと思います。その前身のCPLには、シンボル|が、行末までの代替コメントとして使用した。

reasonがどこにも書かれたことを示す証拠は見つかりませんでしたが、それが唯一の選択であったかどうかを考えることができます(これには正当な理由があります)。

context-free grammars(wp) の概念が非常に普及しているため、彼らはWord "or"を選択しませんでした。言語設計のため、有効なシンボルになれないものを選択しました(シンボルは[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年以上にわたって 'and'として使用されていました)
  • これらはすべてALGOLおよび/またはCPLを使用しました。 #$% '* +、-。 /:; <=>? @\^ _〜
  • 残ったのは `と|しかし、バックティックはアスキーに準拠していると主張されている場合でもどこでも利用できないため、使用できませんでした。
3
Bernd Elkemann

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内の演算子。このような「真理値」コンテキストでのブール演算子のショートサーキットセマンティクスは望ましいように見えましたが、演算子のオーバーロードは説明と使用が困難でした。 Alan Snyderの提案で、&&と||を導入しました。メカニズムをより明確にするための演算子

2
Richard Brown

の最も古い使用法|または、しばらくグーグルで探した後、 Backus Naur Form でした。

これは最初に論文に登場したようです Zuerich ACM-GRAMM会議の提案された国際代数言語の構文とセマンティクス by J.W. 1959年にバッカス、しかし彼は使用しませんでした|表記があります。代わりに、彼は上線付きの「または」を使用しました。

その後、1960年に彼は アルゴリズム言語ALGOL 60に関するレポート を書きました。

そこで彼は1959年から1960年の間にそれを発明しました。

1
BeniBela

「または」操作を表す垂直バーの使用(論理の場合は||、ビット単位の場合は||)は、 [〜#〜] bnf [〜#〜] から生じた可能性があります。 BNFはプログラミング言語ではありませんが、プログラミング言語の構文の正式な仕様を作成する方法として1950年代後半に開発されました。 BNFの縦線文字は、非終端記号の有効な展開の選択肢を示します。 60年代以降のプログラミング言語デザイナーは、この表記法に精通しており、この表記法の影響を受けていた可能性が高いです。

0