キャレットが累乗ではなくXORに使用されたのはなぜですか?


32

この構文上の問題に直面したことがある人にとっては本当に問題ではないというわけではありません^が、広く受け入れられている数学的な累乗演算の代わりにキャレット()をXOR演算として使用することに起因する大きな混乱が見られます。

もちろん、キャレットの(誤った)使用法を説明し修正する場所はたくさんありますが、キャレットに異なる意味が与えられた理由についての明確な情報源はありません。

それは利便性の問題でしたか?事故?明らかに、推論はさまざまな言語で異なる可能性があるため、あらゆる点で情報は洞察に満ちています。


回答:


58

古い前駆体があったものの、影響力のあるフランスの数学者ルネ・デカルトは通常され貸方上付き指数(導入するためのbは彼の作品には、数学的な書き込みに)Geometrieこれはまだ普遍的に今日の数学で使用される表記法である1637に掲載されました。

Fortranは、数値計算に広く使用されている最古のプログラミング言語であり、1954年まで累乗演算子を提供していました。累乗演算は二重アスタリスクで示されます**。当時の多くのコンピューターは、キャレット文字を提供しない6ビット文字エンコードを使用していたことに注意してください^。の使用**はその後、Pythonなどの累乗演算を提供するさまざまな最近のプログラミング言語の作成者に採用されました。

キャレットを含む最初に広く採用された文字セット^は、1963年に最初に標準化された7ビットASCIIエンコーディングでした。キャレットを使用して累乗を表す最も古いプログラミング言語はBASICで、1964年に作成されました。 IBM は、キャレットを含むEBCDIC文字エンコードを採用しました^

C言語は1972年に登場しました。累乗演算子を提供するのではなく、などのライブラリ関数を介して累乗をサポートしpow()ます。そのため、Cの累乗法、およびC ++やCUDAなどのCファミリの他の言語の累乗のためにシンボルを別に設定する必要はありません。

一方、それまでのプログラミング言語では一般的ではなかったCは、ビットごとの演算にシンボルを提供します。7ビットASCIIで使用可能な特殊文字の数は限られており、&ANDや~NOT などの特定の特殊文字に対する他の操作の「自然な親和性」があったため、XORのシンボルにはそれほど多くの選択肢がありませんでした。

リッチーまたはカーニガンが^XORを具体的に示すことを選択した理由について、公開された理論的根拠を知りません。リッチーのCの短い歴史は、この問題については言及していません。C、の前駆体の仕様を見て、言語Bは、それはXOR演算子を持っていなかったことが明らかになったが、すでに以外のすべての特殊文字を使用し^$@#

[更新] Bの作成者でありCの共同作成者の1人であるケン・トンプソンにメールを送信し^、CのXOR演算子として選択する理由を尋ね、ここで答えを共有する許可を求めました。彼の返事(読みやすさのために少し再フォーマット):

From:Ken Thompson
送信:2016年9月29日(木曜日)4:50 AM
To:Norbert Juffa
件名:Re:CでXOR演算子としてキャレットを選択した理由

それは残った文字のランダムな選択でした。

もう一度やり直す必要がある場合(これを行いました)、xor(^)とビット補数(〜)に同じ演算子を使用します。

^は現在、よく知られている演算子であるため、goでは^はxorであり、補数でもあります。

使用^あなたはを参照していることを「数学」の累乗については、実際には1988年に、このようなMathematicaのどの日付など代数システムのための1978年に、このようなKnuthのTeXのどの日付などのシステムを組版のための多くの後日確立された使用、コマンドライン・インタフェースであり、グラフ1990年代初期の電卓。

これらの製品^が指数の使用を採用したのはなぜですか?電卓の場合、私はBASICの影響を疑います。1980年代を通じて非常に人気のある最初のプログラミング言語であり、他のソフトウェア製品にも組み込まれていました。したがって、この表記は電卓の多くのバイヤーに馴染みのあるものでした。私の記憶はあいまいですが、実際には単純なBASICインタープリターを実行する計算機さえあったと思います。


4
これは素晴らしい歴史の教訓です。したがって、本当の質問は「なぜTexのソフトウェア(およびその時代の他のソフトウェア)が指数関数を持つXORシンボルを使用することにしたのでしょうか?」;)
AxelH

5
@AxelH実際には、そうではありません。TeXは上付き文字に使用^します。そして、上付き文字には「上」文字を使用し、下付き文字には「下」文字()を使用するのが理にかなっています。_
svick

2
@AxelH私はsvickに同意しますが^、これは上向きの指数の伝統的な位置を示唆する上矢印を示唆しているので、それは少し自然なフィットです。Donald Knuthは^TeXのべき乗に使用する決定について尋ねるメールに返信するはずですが、TAOCPの完了など、より重要な作業に忙しいことを考えると、私はそのステップを取りたくありませんでした(私は考慮しました)それ)。
-njuffa

7
en.wikipedia.org/wiki/Caretによると、Algol 60は累乗に上向きの矢印を使用し、元々ASCIIには現在キャレットシンボルがある同じコードポイントに上向き矢印があるため、2つは明らかに同じ頃に互いに同等にされた。
ペリアタブレアッタ16

4
本当に素晴らしい歴史的な答え。Cがべき乗ではなくビット演算子を実装する理由を追加したいと思います。Cの目標は、CPUがネイティブにサポートするものの大部分にプログラマが簡単にアクセスできる低レベル言語になることです。CPUは常にビット操作命令を提供しますが、累乗のための特別な命令を持つ単一のCPUについては知りません。そのため、べき乗には常にループ(少なくとも整数演算を伴う)が必要であり、Cには言語構造の背後にループを隠す単一の機能はありません。
cmaster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.