Warum wurde das Caret für XOR anstelle von Exponentiation verwendet?

32

Es ist nicht wirklich ein Problem für jeden, der sich zuvor mit diesem syntaktischen Problem befasst hat, aber ich sehe eine Menge Verwirrung, die sich aus der Verwendung von caret ( ^) als XOR-Operation anstelle der allgemein akzeptierten mathematischen Potenzierungsoperation ergibt.

Natürlich gibt es viele Stellen, an denen der (falsche) Gebrauch des Carets erklärt und korrigiert wird, aber ich habe keine endgültigen Quellen gefunden, warum dem Caret eine andere Bedeutung beigemessen wurde.

War es eine Frage der Bequemlichkeit? Ein Unfall? Offensichtlich könnte die Begründung für die verschiedenen Sprachen unterschiedlich sein, so dass Informationen in jeder Hinsicht aufschlussreich wären.

Qix
quelle

Antworten:

58

Obwohl es ältere Vorläufer gab, wird dem einflussreichen französischen Mathematiker Rene Descartes in seiner 1637 veröffentlichten Arbeit Geometrie in der Regel die Einführung hochgestellter Exponenten (a b ) in das mathematische Schreiben zugeschrieben . Diese Notation wird in der Mathematik bis heute allgemein verwendet.

Fortran ist die älteste Programmiersprache, die häufig für numerische Berechnungen verwendet wird und einen Exponentiationsoperator bereitstellt. Sie stammt aus dem Jahr 1954. Die Exponentiationsoperation wird durch einen doppelten Stern gekennzeichnet **. Es ist zu beachten, dass viele Computer zu dieser Zeit 6-Bit-Zeichencodierungen verwendeten , die kein Caret-Zeichen lieferten ^. Die Verwendung von **wurde später von Entwicklern verschiedener neuerer Programmiersprachen übernommen, die eine Potenzierungsoperation bieten, wie z. B. Python.

Der erste weit verbreitete Zeichensatz, der das Caret enthielt, ^war die 7-Bit- ASCII- Codierung, die 1963 zum ersten Mal standardisiert wurde. Die älteste mir bekannte Programmiersprache, die das Caret zur Bezeichnung der Exponentiation verwendete, ist BASIC, die auf das Jahr 1964 datiert Zu dieser Zeit übernahm IBM die EBCDIC- Zeichencodierung, die auch das Caret enthält ^.

Die C-Sprache wurde 1972 eingeführt. Sie bietet keinen Exponentiationsoperator, sondern unterstützt die Exponentiation über Bibliotheksfunktionen wie pow(). Daher muss kein Symbol für die Exponentiation in C und in anderen, späteren Sprachen der C-Familie wie C ++ und CUDA reserviert werden.

Andererseits und für Programmiersprachen bis zu diesem Zeitpunkt ungewöhnlich, stellt C Symbole für bitweise Operationen bereit. Die Anzahl der Sonderzeichen, die in 7-Bit-ASCII verfügbar waren, war begrenzt, und da es eine "natürliche Affinität" anderer Operationen zu bestimmten Sonderzeichen gab, z. B. &für AND und ~für NOT, gab es nicht allzu viele Auswahlmöglichkeiten für das Symbol für XOR .

Mir ist keine veröffentlichte Begründung von Ritchie oder Kernighan bekannt, warum sie sich entschieden haben ^, XOR spezifisch zu bezeichnen. Ritchies kurze Geschichte von C schweigt zu diesem Thema. Ein Blick auf die Spezifikation für den Vorläufer C, der Sprache B , zeigt , dass es nicht eine XOR - Operator hatte, aber schon alle Sonderzeichen außer verwendet ^, $, @, #.

[Update] Ich schickte eine E-Mail an Ken Thompson, den Schöpfer von B und einen der Mitschöpfer von C, und erkundigte mich nach den Gründen für die Wahl ^als XOR-Operator von C und bat um die Erlaubnis, die Antwort hier zu teilen. Seine Antwort (aus Gründen der Lesbarkeit leicht neu formatiert):

Von: Ken Thompson
Gesendet: Donnerstag, 29. September 2016, 04:50 Uhr
An: Norbert Juffa
Betreff: Re: Begründung für die Wahl von Caret als XOR-Operator in C?

Es war eine zufällige Auswahl der verbleibenden Charaktere.

Wenn ich es noch einmal machen müsste (was ich getan habe), würde ich den gleichen Operator für xor (^) und Bitkomplement (~) verwenden.

da ^ jetzt der bekanntere Operator ist, ist ^ in go xor und auch komplementär.

Die Verwendung von ^für die Exponentiation in "Mathematik", auf die Sie sich beziehen, wird tatsächlich zu einem viel späteren Zeitpunkt für Schriftsatzsysteme wie Knuths TeX aus dem Jahr 1978, Befehlszeilenschnittstellen für Algebra-Systeme wie Mathematica aus dem Jahr 1988 und Graphik verwendet Taschenrechner in den frühen 1990er Jahren.

Warum wurden diese Produkte ^zur Potenzierung verwendet? Bei Taschenrechnern vermute ich den Einfluss von BASIC. In den achtziger Jahren war es eine sehr beliebte erste Programmiersprache und wurde auch in andere Softwareprodukte eingebettet. Die Schreibweise wäre daher vielen Käufern der Rechner geläufig gewesen. Mein Gedächtnis ist vage, aber ich glaube, es gab sogar Taschenrechner, auf denen einfache BASIC-Interpreter ausgeführt wurden.

njuffa
quelle
4
Das ist eine nette Geschichtsstunde. Die eigentliche Frage wäre also: "Warum hätte Tex (und andere aus dieser Zeit) beschlossen, das XOR-Symbol mit Exponentialfunktion zu verwenden?" ;)
AxelH
5
@AxelH Eigentlich nicht. TeX verwendet ^für hochgestellte . Und für mich ist es sinnvoll, ein "hoch" -Zeichen für hochgestellt und ein "runter" -Zeichen ( _) für tiefgestellt zu verwenden.
Svick
2
@AxelH Ich bin mit Svick einverstanden, dass der ^einen Aufwärtspfeil vorschlägt, der wiederum auf die traditionelle Position eines hochgestellten Exponenten hinweist, so dass es ein bisschen wie ein natürlicher Fit ist. Ich bin mir sicher, dass Donald Knuth auf eine E - Mail antworten würde, in der er nach seiner Entscheidung ^für die Potenzierung in TeX gefragt wird, aber da er mit wichtigeren Dingen wie dem Abschluss von TAOCP beschäftigt ist, wollte ich diesen Schritt nicht machen (ich habe darüber nachgedacht) es).
Njuffa
7
Laut en.wikipedia.org/wiki/Caret verwendete Algol 60 einen nach oben zeigenden Pfeil für die Potenzierung und stellt fest, dass ASCII ursprünglich auch einen Aufwärtspfeil an derselben Codestelle hatte, an der es derzeit das Caret-Symbol hat, sodass die beiden eindeutig waren etwa zur gleichen Zeit miteinander gleichgesetzt.
Periata Breatta
4
Wirklich schöne historische Antwort. Ich möchte nur einen wahrscheinlichen Grund für die Implementierung von Bitoperatoren durch C anstelle einer Potenzierung hinzufügen: Das Ziel von C ist eine Sprache auf niedriger Ebene, die dem Programmierer einen einfachen Zugriff auf einen großen Teil der von CPUs nativ unterstützten Inhalte ermöglicht. Und CPUs liefern immer Bitmanipulationsanweisungen, aber ich kenne keine einzige CPU, die spezielle Anweisungen zur Potenzierung hat. Daher erfordert Exponentiation immer eine Schleife (zumindest mit Ganzzahlarithmetik), und es gibt in C kein einziges Merkmal, das eine Schleife hinter einem Sprachkonstrukt verbirgt.
cmaster