it-swarm.com.de

Warum ordnet der Zuweisungsoperator der linken Seite zu?

Ich habe erst kürzlich angefangen, einer Freundin das Programmieren beizubringen (wir verwenden Python), und als wir anfingen, die Variablenerstellung und den Zuweisungsoperator zu diskutieren, fragte sie, warum der Wert auf der rechten Seite dem Namen auf der linken Seite zugewiesen ist und nicht umgekehrt .

Ich hatte vorher nicht zu viel darüber nachgedacht, weil es mir natürlich erschien, aber sie sagte, dass ihr von links nach rechts natürlicher erschien, da die meisten von uns so natürliche Sprachen lesen.

Ich dachte darüber nach und kam zu dem Schluss, dass es das Lesen von Code erheblich erleichtert, da die zugewiesenen Namen (die der Programmierer wiederverwenden muss) gut sichtbar sind und linksbündig ausgerichtet sind.

aligned = 2
on = 'foo' + 'bar' + 'foobar'
the = 5.0 / 2
left = 2 + 5

Im Gegensatz zu:

2 = aligned 
'foo' + 'bar' + 'foobar' = on
5.0 / 2 = the 
2 + 5 = right 

# What were the names again...?

Jetzt frage ich mich, ob es noch andere Gründe für diesen Standard gibt. Gibt es eine Geschichte dahinter? Oder gibt es einen technischen Grund, warum dies eine gute Option ist (ich weiß nicht viel über Compiler)? Und gibt es Programmiersprachen, die der rechten Seite zugeordnet sind?

48
voithos

Das Gleiche gilt für @paxdiablo. Die frühen Programmiersprachen wurden von Mathematikern geschrieben - eigentlich alle. In der Mathematik macht es nach ihrem eigenen Prinzip - von links nach rechts lesen - Sinn, wie es funktioniert.

x = 2y - 4.

In der Mathematik würden Sie folgendes sagen: Sei x gleich 2y -4.

Auch in der Algebra tun Sie dies. Wenn Sie eine Gleichung für eine Variable lösen, isolieren Sie die Variable, nach der Sie suchen, auf der linken Seite. d.h. y = mx + b;

Sobald eine ganze Sprachfamilie - wie die C-Familie - eine bestimmte Syntax hat, ist das Ändern teurer.

56
Jonathan Henson

BASIC, eine der frühesten Computersprachen, hatte die "richtige" Form von:

10 LET AREA = HEIGHT * WIDTH

dies entspricht der mathematischen Denkweise der Angabe einer Variablen wie "Sei H die Höhe des Objekts".

COBOL war auch mit seiner Anweisung COMPUTE ähnlich. Wie bei vielen Methoden war es möglicherweise einfach eine willkürliche Entscheidung, die in vielen Sprachen getroffen wurde.

26
user10776

Tatsächlich gibt es eine Programmiersprache, die der rechten Seite zugewiesen wird: TI-BASIC ! Nicht nur das, sondern es wird auch nicht '=' als Zuweisungsoperator verwendet, sondern ein Pfeil, der als "STO" -Operator bekannt ist.

beispiele:

5→A
(A + 3)→B
(A - B)→C

Im obigen Beispiel werden drei Variablen deklariert und mit Werten versehen. A wäre 5, B wäre 8 und C wäre -3. Die erste Deklaration/Zuordnung kann als 'Speicher 5 als A' gelesen werden.

Ich begründe, warum TI-BASIC ein solches System für die Zuweisung verwendet, weil es eine Programmiersprache für einen Taschenrechner ist. Der Operator "STO" bei TI-Taschenrechnern wurde am häufigsten im normalen Taschenrechnerbetrieb verwendet, nachdem eine Zahl berechnet wurde. Wenn es sich um eine Nummer handelte, an die sich der Benutzer erinnern wollte, drückte er auf die Schaltfläche "STO" und der Caclulator forderte ihn zur Eingabe eines Namens auf (automatisch wurde die Alphasperre aktiviert, sodass Tastenanschläge Buchstaben anstelle von Zahlen erzeugten):

Sin(7 + Cos(3))
                    -.26979276
Ans→{variable name}
                    -.26979276

und der Benutzer kann die Variable beliebig benennen. Das Aktivieren der Alphasperre, das Eingeben des Namens und das Drücken von "STO" und das Drücken der Taste "Ans" wären für den normalen Betrieb viel zu umständlich gewesen. Da alle Taschenrechnerfunktionen in TI-BASIC verfügbar sind, wurden keine weiteren Zuweisungsoperatoren hinzugefügt, da "STO" dieselbe Aufgabe ausführte, wenn auch im Vergleich zu den meisten anderen Sprachen rückwärts.

(Anekdote: TI-BASIC war eine der ersten Sprachen, die ich gelernt habe. Als ich das erste Mal lernte Java im College) hatte ich das Gefühl, dass die Zuordnung zur LINKEN ungewöhnlich und "rückwärts" war! )

25
diceguyd30

Heuristic 1 : Wenn Sie beim Entwerfen einer Sprache mit mehr als einer Möglichkeit konfrontiert sind, etwas zu tun, wählen Sie die gebräuchlichste, intuitivste aus, oder Sie werden es tun am Ende mit Perl +.

Nun Wie ist es natürlicher (zumindest für einen Englisch sprechenden)? Schauen wir uns an, wie wir Dinge auf Englisch schreiben/sagen:

Steven ist jetzt 10 Jahre alt (im Gegensatz zu 10 Jahren ist Steven jetzt). Ich wiege mehr als 190 Pfund (im Gegensatz zu mehr als 190 Pfund, die ich wiege).

In Code:

steven = 10
i > 190

Folgendes klingt auch natürlicher:

"Wenn Mary 18 Jahre alt ist, kann sie eine Süßigkeit haben". "Wenn ich jünger als 21 Jahre bin, werde ich meinen Bruder bitten, mir Tequila zu geben.".

if (mary == 18) { ... }
if (i < 21) { ... }

als:

"Wenn 18 Jahre alt sind, ist Mary ..." "Wenn 21 Jahre größer sind als ich ..."

Nun der Code:

if (18 == mary) { ... }
if (21 > i) { ... }

Beachten Sie, dass dies weder für Programmierer noch für englischsprachige Personen selbstverständlich ist. Die Sätze klingen wie Yoda-Sprechen, und der Code trägt den Spitznamen Yoda-Bedingungen. Diese mögen in C++ hilfreich sein, aber ich bin sicher, die meisten Leute würden dem zustimmen: Wenn ein Compiler das schwere Heben übernehmen und die Notwendigkeit von Yoda-Bedingungen verringern könnte, wäre das Leben ein bisschen einfacher.

Natürlich könnte man sich an alles gewöhnen. Zum Beispiel wird Nummer 81 geschrieben als:

Einundachtzig (Englisch) Einundachtzig (Spanisch) Eins und Achtzig (Deutsch).

Endlich gibt es 4! = 24 gültige Arten, auf Russisch "grün Apple liegt auf dem Tisch") zu sagen - die Reihenfolge spielt (fast) keine Rolle, außer dass "on" mit "table" zusammenkommen muss. Also, wenn Wenn Sie beispielsweise Russisch sprechen, ist es Ihnen vielleicht egal, ob Sie a = 10 oder 10 = a schreiben, da beide gleich natürlich erscheinen.

Obwohl Linguistik ein faszinierendes Fach ist, habe ich es nie offiziell studiert und kenne nicht so viele Sprachen. Hoffentlich habe ich aber genug Gegenbeispiele geliefert.

15
Job

Es begann mit FORTRAN in den 1950er Jahren. Wobei FORTRAN eine Abkürzung für FORmula TRANslation war - die fraglichen Formeln sind einfache algebraische Gleichungen, die gemäß Konvention immer links zugeordnet werden.

Sein nahezu zeitgemäßes COBOL hingegen sollte englischsprachig sein und rechts (meistens!) Zugeordnet sein.

MOVE 1 TO COUNTER.
ADD +1 TO LINE-CNT.
MULTIPLY QTY BY PRICE GIVING ITEM-PRICE.
11
James Anderson

Nun, wie @ diceguyd30 betonte, gibt es beide Notationen.

  • <Identifier> = <Value> bedeutet "let Identifier be Value ". Oder um das zu erweitern: Definieren (oder definieren Sie) die Variable Bezeichner auf Wert .
  • <Value> -> <Identifier> bedeutet "speichere Wert bis Kennung ". Oder um das zu erweitern: Setzen Sie Value an die Stelle, die durch Identifier gekennzeichnet ist.

Natürlich kann der Bezeichner im Allgemeinen tatsächlich ein beliebiger L-Wert sein.

Der erste Ansatz berücksichtigt das abstrakte Konzept von Variablen, der zweite Ansatz befasst sich eher mit der tatsächlichen Speicherung.

Beachten Sie, dass der erste Ansatz auch in Sprachen üblich ist, die keine Zuweisungen haben. Beachten Sie auch, dass die Definition und Zuweisung von Variablen relativ nahe beieinander liegen. <Type> <Identifier> = <Value> vs. <Identifier> = <Value>.

5
back2dos

Es könnte ein Überbleibsel früher Parsing-Algorithmen sein. Denken Sie daran, dass das LR-Parsing erst 1965 erfunden wurde und es durchaus sein kann, dass LL-Parser Probleme hatten (innerhalb der zeitlichen und räumlichen Einschränkungen der Maschinen zu der Zeit), die umgekehrt waren. Erwägen:

identifier = function();
function();

Die beiden sind vom zweiten Token eindeutig zu unterscheiden. Auf der anderen Seite,

function() = identifier;
function();

Kein Spaß. Dies wird noch schlimmer, wenn Sie mit der Verschachtelung von Zuweisungsausdrücken beginnen.

function(prev_identifier = expression) = identifier;
function(prev_identifier = expression);

Eine einfachere Disambiguierung für Maschinen bedeutet natürlich auch eine einfachere Disambiguierung für Menschen. Ein weiteres einfaches Beispiel wäre die Suche nach der Initialisierung eines bestimmten Bezeichners.

identifier1 = expressionOfAnArbitraryLength;
identifier2 = expressionOfAReallyReallyReallyArbitraryLength;
identifier3 = expression;
identifier4 = AlongLineExpressionWithAFunctionCallWithAssignment(
    identifier = expr);

Einfach, schauen Sie einfach auf der linken Seite nach. Rechte Seite dagegen

expressionOfAnArbitraryLength = identifier1;
expressionOfAReallyReallyReallyArbitraryLength = identifier2;
expression = identifier3;
AlongLineExpressionWithAFunctionCallWithAssignment(expr = identifier
    ) = identifier4;

Besonders wenn Sie keine Lochkarten grep können, ist es viel schwieriger, die gewünschte Kennung zu finden.

3
DeadMG

Wie bereits erwähnt, haben alle frühen Computersprachen so funktioniert. Z.B. FORTRAN, das viele Jahre vor BASIC kam.

Es ist sehr sinnvoll, die zugewiesene Variable links vom Zuweisungsausdruck zu haben. In einigen Sprachen haben Sie möglicherweise mehrere verschiedene überladene Routinen mit dem gleichen Namen, die unterschiedliche Ergebnistypen zurückgeben. Indem der Compiler zuerst den Typ der zugewiesenen Variablen sehen lässt, weiß er, welche überladene Routine aufgerufen werden muss oder welche implizite Umwandlung beim Konvertieren von (z. B.) einer Ganzzahl in einen Gleitkommawert generiert werden soll. Das ist eine vereinfachende Erklärung, aber hoffentlich haben Sie die Idee.

3
Dave Jewell

Assemblierungssprachen haben das Ziel als Teil des linken Opcodes. Höhere Sprachen folgten tendenziell den Konventionen der Vorgängersprachen.

Wenn Sie = (Oder := Für pascalische Dialekte) sehen, können Sie diese als is assigned the value Aussprechen, dann ist die Natur von links nach rechts sinnvoll (weil wir auch lesen) von links nach rechts in den meisten Sprachen). Da Programmiersprachen überwiegend von Leuten entwickelt wurden, die von links nach rechts lesen, blieben die Konventionen bestehen.

Es ist eine Art von Pfadabhängigkeit . Ich nehme an, wenn die Computerprogrammierung von Leuten erfunden wurde, die Hebräisch oder Arabisch (oder eine andere Sprache von rechts nach links) sprachen, dann vermute ich, dass wir das Ziel rechts setzen würden.

2
Tangurena

Für das, was es wert ist, lesen sich die meisten Anweisungen in COBOL von links nach rechts, sodass die beiden Operanden zuerst und das Ziel zuletzt benannt wurden, wie: multiply salary by rate giving tax.

Ich werde jedoch nicht vorschlagen, dass Ihr Schüler COBOL bevorzugt, aus Angst, dass ich (zu Recht) für einen so niedrigen, unhöflichen, geschmacklosen Kommentar gekennzeichnet werde! :-)

2
Jerry Coffin

sie sagte, dass ihr von links nach rechts natürlicher erschien, da die meisten von uns so natürliche Sprachen lesen.

Ich denke das ist ein Fehler. Einerseits können Sie "10 x zuweisen" oder "10 x verschieben" sagen. Auf der anderen Seite können Sie sagen "setze x auf 10" oder "x wird 10".

Mit anderen Worten, abhängig von Ihrer Wahl des Verbs kann die zugewiesene Variable das Subjekt sein oder nicht und kann sich auf der linken Seite befinden oder nicht. "Was natürlich ist" hängt also ganz von Ihrer gewohnten Wortwahl ab, um die Aufgabe darzustellen.

1
Steve314

Im Pseudocode wird der Zuweisungsoperator sehr häufig rechts geschrieben. Zum Beispiel

2*sqrt(x)/(3+y) -> z

In Casio-Rechnern, auch nicht programmierbaren Varianten, wird die Zuordnungsvariable ebenfalls rechts angezeigt

A+2B → C

In Forth befindet sich die Variable ebenfalls rechts

expression variable !

In x86 hat die Intel-Syntax das Ziel auf der linken Seite, aber die GAS-Syntax kehrt die Reihenfolge um, was viele Leute verwirrt, insbesondere bei Anweisungen zur Reihenfolge der Parameter wie Subtraktion oder Vergleiche. Diese Anweisungen sind in 2 verschiedenen Dialekten gleich

mov rax, rbx    ; Intel syntax
movq %rbx, %rax ; GAS syntax

Beide verschieben den Wert in rbx nach rax. Keine anderen Assemblersprachen, die ich kenne, schreiben das Ziel rechts wie GAS.

Einige Plattformen setzen den Ausdruck links und die Variable rechts:

MOVE expression TO variable      COBOL
expression → variable            TI-BASIC, Casio BASIC
expression -> variable           BETA, R
put expression into variable     LiveCode

https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation

Die meisten Sprachen weisen den Wert links zu. Einer der Gründe dafür ist, dass die Operatoren leicht auszurichten sind, die Variable leichter zu lesen und zu erkennen ist, da die Positionen der Zuweisungsoperatoren und Variablen in den Zeilen nicht stark variieren und es einfacher ist, als zu lesen "Variable sei ein Wert".

Einige Leute sagen jedoch lieber "Wert x nach y verschieben" und schreiben die Variable rechts.

0
phuclv