Warum haben Programmiersprachen angefangen, = für die Zuweisung zu verwenden?


13

In den meisten frühen Algorithmenbüchern <-wird auf Zuordnung und =Vergleich Bezug genommen. Aber heutzutage sind die einzigen Sprachen, die nicht =für die Zuweisung verwendet werden, Pascal ( :=) und Spielzeugsprachen wie COOL . Was hat dazu geführt, dass moderne Programmiersprachen =in Bedeutungszuweisung statt in mathematische Bedeutung von Gleichheit umgewandelt wurden?


8
Lass mich nicht anfangen ===...
Deer Hunter

1
bleibt in der Arbeit mit Algorithmen üblich; Dies ist eine von drei gebräuchlichen Notationen für die Zuweisung beim Schreiben eines Algorithmus (die anderen sind :=und =). Nur weil alle Programmierer alle verwenden, =heißt das nicht, dass alle Mathematiker fallen gelassen wurden .
cpast

@ DeerHunter ===ist in Ordnung.
Darth Egregious

1
Ich hatte ein Mädchen aus der Mittelschule heulen: "Wie kann x gleich x plus eins sein?" in einem Intro habe ich unterrichtet. Das ist die grundlegende Verrücktheit von Computern: Variablen existieren in der Natur nicht, sie sind anders als alles andere im Universum.

1
User251748: Meine Brieftasche ist eine reale Variable, die mehrere Münzen, Banknoten und gelegentliche Zettel enthält.
Gnasher729

Antworten:


14

Laut Wikipedia geht die Verwendung von Gleichen für die Zuordnung auf Heinz Rutishausers Sprache Superplan zurück, der von 1949 bis 1951 entworfen wurde und von Fortran besonders populär gemacht wurde:

Ein berüchtigtes Beispiel für eine schlechte Idee war die Wahl des Gleichheitszeichens zur Bezeichnung der Zuordnung. Es geht auf Fortran im Jahr 1957 zurück und wurde blind von Armeen von Sprachdesignern kopiert. Warum ist es eine schlechte Idee? Weil es eine jahrhundertealte Tradition stürzt, „=“ einen Vergleich für Gleichheit bezeichnen zu lassen, ein Prädikat, das entweder wahr oder falsch ist. Aber Fortran machte es zu einer Aufgabe, der Durchsetzung der Gleichheit. In diesem Fall sind die Operanden ungleich: Der linke Operand (eine Variable) ist gleich dem rechten Operanden (ein Ausdruck) zu machen. x = y bedeutet nicht dasselbe wie y = x.

- Niklaus Wirth, gute Ideen, durch den Spiegel

Konrad Zuse verwendete auch das Gleichheitszeichen für Plankalkul , was zu Rutishausers Superplan inspirierte, obwohl nie ein Compiler dafür entwickelt wurde. Warum hat er das Gleichheitszeichen gewählt? Ich denke, du müsstest ihn fragen.


4
Nun, es gab sicherlich schlechtere Ideen. Schließlich verwenden mathematische Texte =sowohl als Prädikat als auch zur Definition von Variablen, z. B. in „Sei x = 4. Dann ist √ (x - y) Null, wenn y = 4“. Dies funktioniert, weil die mathematische Notation eher deklarativ als zwingend verstanden werden sollte. Funktionale Programmiersprachen (z. B. die ML-Familie) verwenden standardmäßig nicht veränderbare Variablen und können daher =problemlos in ihrer Doppelrolle weiter verwendet werden. Genauer gesagt, =ist sowohl ein Operator als auch ein Teil derlet Syntax.
Amon

2
@amon: Ich bin nicht einverstanden mit der doppelten Bedeutung in der Mathematik. "Let 4 = x" ist genauso gültig wie "Let x = 4".
Kommen Sie vom

4
@COMEFROM "Let 4 = x" ist ungefähr so ​​unnatürlich wie die INTERCAL-Anweisung, aus der Sie Ihren Benutzernamen entnehmen. Wenn "x" noch nie zuvor erwähnt wurde, führt "Sei x = {etwas}" oder "Sei x ein {Widget}" zusätzlich zur Angabe ihres Werts eine Variable ein, wodurch die Variable gemäß Konvention an erster Stelle steht. Das liegt genau daran, dass dies zumindest in Bezug auf die Intuition etwas anderes ist, als nur "der Wert ist gleich ..." zu sagen.

3
@delnan "Let x = 4" ist nur eine Abkürzung für "Let x ∈ ∈ und x = 4". Der Kontext führt die neue Variable ein und =ist dann nur ein Prädikat, genau wie überall, wo sie verwendet wird. Beachten Sie, dass "Let x = 4" je nach Kontext auch "Let x ∈ ∈ und x = 4" bedeuten könnte.
Doval

2
@ RobertHarvey Wir sprechen über mathematisches Schreiben, nicht über C-Programmierung. KOMMEN SIE AUS: Ich gebe zu, dass es nicht so eindeutig ist, wie ich es zuvor gesagt habe, aber da die mathematische Prosa auf Konventionen basiert und es keine Spezifikation gibt, die von einem Anwalt zugelassen werden könnte, um "let 4 = x" zuzulassen, nein, sagte die Aussage nicht nur so gültig wie "let x = 4". Zumindest verwirrt es die Leser und verfehlt damit den Hauptzweck der Prosa .

7

Aber als ich in der Schule Mathe gemacht habe "lass x = 123"

war übliche Formulierung. Frühere Versionen von Basic bestanden auf dem Schlüsselwort "let" vor dem gleichen. Es wird also im Grunde genommen verstanden, wie man "lassen" kann.

Ein Schlüsseltreiber, der normalerweise nicht in Betracht gezogen wird, aber zu dem Zeitpunkt sehr wichtig ist, auf dem Sie tatsächlich eingegeben haben.

Es gab zwei mögliche Eingabegeräte,

  • Der "Teletyp", bei dem Sie mit einem Standard-Teletypgerät kleine Löcher in ein Papierband stanzen können, die dann vom Computer gelesen werden können. Dies war nicht so schlimm, da es das Standard-Aplphabet in Groß- und Kleinbuchstaben sowie die meisten Zeichen in der oberen Reihe Ihrer Tastatur unterstützte.
  • Lochkarten - Es gab viele Lochkartenautomaten, da der Einsatz von Sortierern, Tabulatoren und Druckern in großen Unternehmen üblich war. Diese unterstützten einen sehr begrenzten Zeichensatz, nur Großbuchstaben und eine begrenzte Anzahl von "Sonderzeichen".

Teletypen wurden in der Regel in akademischen und militärischen Läden verwendet, Kartenstempel in eher kommerziellen Läden. Daher unterstützten akademische Sprachen wie Pascal Kleinbuchstaben und "sinnvolle" Notationen wie ": =" für die Zuordnung. Sprachen, die sich an ein kommerzielleres Publikum richteten, gingen davon aus, dass Lochkarten die Hauptform der Eingabe sein würden, daher nur Großbuchstaben wie FORTRAN und COBOL mit begrenzter Unterstützung für ":;> <" Zeichen, die auf einem Standard-Keypunch nicht verfügbar waren.

Im frühen FORTRAN gab es übrigens keine Unklarheit darüber, dass "=" für die Zuweisung verwendet wurde, da der Vergleich mit ".LT.", ".LE.", ".EQ.", ".GE" durchgeführt wurde. und ".GT." Syntax.


Ich finde es let x = 123jedoch analoger assert(x == 123)als jede Art von Aufgabe.
AKHolland

1
PS Wenn Sie pedantisch werden, ist die COBOL "MOVE" -Syntax die genaueste Beschreibung dessen, was der Computer tatsächlich tut. Obwohl "COPY" noch genauer wäre.
James Anderson

@AKHolland für große Werte von 123.

Seit C ++ Move-Konstruktoren erfunden hat, klingt COBOLs „MOVE“ viel seltsamer.
Gnasher729

Ich war immer der Meinung, dass LET in BASIC obligatorisch bleiben sollte, da dies die Zuordnung von Gleichheitstests abheben würde. Eine Art COBOL-artige Abkürzung. Das Problem ist, dass dies ein weiteres Token in der Quelle aufnehmen würde, ein weiteres wertvolles Byte in den winzigen PCs der Zeit. Also ließen sie es fallen.
Chuck Adams
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.