Ich habe vor kurzem angefangen, einer Freundin Programmieren beizubringen (wir verwenden Python), und als wir angefangen haben, die Erstellung von Variablen und den Zuweisungsoperator zu besprechen, fragte sie, warum der Wert auf der rechten Seite dem Namen auf der linken Seite zugewiesen wird und nicht umgekehrt .
Ich hatte vorher nicht zu viel darüber nachgedacht, weil es mir natürlich erschien, aber sie sagte, dass von links nach rechts für sie natürlicher erschien, da die meisten von uns auf diese Weise natürliche Sprachen lesen.
Ich habe darüber nachgedacht und bin zu dem Schluss gekommen, dass der Code dadurch viel einfacher zu lesen ist, da die zugewiesenen Namen (die der Programmierer wiederverwenden muss) leicht sichtbar sind und links 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...?
Nun frage ich mich, ob es auch 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 richtigen Seite zugeordnet sind?
quelle
value -> variable
).Antworten:
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 zu lesen - Sinn, wie es funktioniert.
x = 2y - 4.
In der Mathematik würde man 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 zu lösende Variable auf der linken Seite. dh y = mx + b;
Wenn eine ganze Familie von Sprachen - wie beispielsweise die C-Familie - eine bestimmte Syntax hat, ist die Änderung zudem kostenintensiver.
quelle
let a be...
in der es keine Zeit gibt, beide Seiten der Aufgabe gleich, so dass die Aufgabe in der Tat eine Gleichheit ist, kein Wunder, warum beide dasselbe Zeichen verwenden:=
x = 1
in Kapitel eins, aberx = 2
in Kapitel zwei behaupte , ist das kein schrecklicher Widerspruch - jede Behauptung gilt nur innerhalb eines bestimmten Kontexts. Der Unterschied bei der imperativen Programmierung besteht zum einen in der Beseitigung einer Barriere (wir brauchen keinen Kontextwechsel), zum anderen in der Implementierung und dem Nutzen.BASIC
, eine der frühesten Computersprachen hatte die "richtige" Form von:Dies entspricht der mathematischen Denkweise, eine Variable wie "Sei H die Höhe des Objekts" anzugeben.
COBOL
war auch ähnlich mit seinerCOMPUTE
Aussage. Wie bei vielen Arten, Dinge zu tun, kann es einfach eine willkürliche Entscheidung gewesen sein, die durch viele Sprachen übertragen wurde.quelle
I declare that X must equal THIS
anstelle der linearenEvaluate THIS and store it in X
MULTIPLY HEIGHT BY WIDTH GIVING AREA
, sodass sich die Variable, die das Ergebnis erhält, ganz rechts in der Anweisung befindet.Tatsächlich gibt es eine Programmiersprache, die der rechten Seite zuweist: TI-BASIC ! Darüber hinaus wird "=" nicht als Zuweisungsoperator verwendet, sondern ein Pfeil, der als "STO" -Operator bezeichnet wird.
Beispiele:
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 / Zuweisung kann als 'Speicher 5 als A' gelesen werden.
Was den Grund betrifft, warum TI-BASIC ein solches System für die Zuweisung verwendet, schreibe ich das so, weil es eine Programmiersprache für einen Taschenrechner ist. Der "STO" -Operator bei TI-Taschenrechnern wurde im normalen Taschenrechnerbetrieb am häufigsten verwendet, nachdem eine Zahl berechnet wurde. Wenn es sich um eine Zahl handelte, an die sich der Benutzer erinnern wollte, drückte er die Taste "STO", und der Taschenrechner forderte sie zur Eingabe eines Namens auf (wobei die Alpha-Sperre automatisch aktiviert wurde, sodass Tastatureingaben Buchstaben anstelle von Zahlen ergaben):
und der Benutzer kann die Variable benennen, was auch immer er wählt. Wenn Sie die Alpha-Sperre aktivieren müssten, geben Sie den Namen ein und drücken Sie dann "STO". Das Drücken der "Ans" -Taste wäre 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" die gleiche Aufgabe ausführte, wenn auch im Vergleich zu den meisten anderen Sprachen in umgekehrter Reihenfolge.
(Anekdote: TI-BASIC war eine der ersten Sprachen, die ich lernte. Als ich zum ersten Mal im College Java lernte, hatte ich das Gefühl, dass es ungewöhnlich und „rückwärts“ war, der LINKEN zuzuweisen!)
quelle
Heuristik 1: Wenn Sie beim Entwerfen einer Sprache mehr als eine Möglichkeit haben, etwas zu tun, wählen Sie die häufigste, intuitivste, sonst erhalten Sie Perl +.
Nun, wie ist es natürlicher (zumindest zu einem englischen Sprecher)? Schauen wir uns an, wie wir Dinge auf Englisch schreiben / sagen:
Steven ist jetzt 10 Jahre alt (im Gegensatz zu Steven, der jetzt 10 Jahre alt ist). Ich wiege mehr als 190 Pfund (im Gegensatz zu mehr als 190 Pfund, die ich wiege).
In Code:
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 schicken."
als:
"Wenn Maria 18 Jahre alt ist ..." "Wenn 21 Jahre älter sind als ich ..."
Nun der Code:
Beachten Sie, dass dies weder für Programmierer noch für englischsprachige Benutzer selbstverständlich ist. Die Sätze klingen wie Yoda-Sprechen, und der Code trägt den Spitznamen Yoda-Bedingungen. Dies mag in C ++ hilfreich sein, aber ich bin mir sicher, dass die meisten Leute dem zustimmen würden: 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 kann man sich an alles gewöhnen. Zum Beispiel lautet Nummer 81 wie folgt:
Eighty One (englisch) Eighty and one (spanisch) One and Eighty (deutsch).
Endlich sind es 4! = 24 gültige Ausdrücke für "grüner Apfel liegt auf dem Tisch" auf Russisch - die Reihenfolge spielt (fast) keine Rolle, außer dass 'on' mit 'table' zusammenkommen muss. Wenn Sie also beispielsweise Russisch als Muttersprache sprechen, ist es Ihnen vielleicht egal, ob Sie schreiben
a = 10
oder10 = a
weil beide gleichermaßen 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.
quelle
(four times twenty) one
Es begann mit FORTRAN in den 1950er Jahren. Während FORTRAN eine Abkürzung für FORmula TRANslation war, handelte es sich bei den fraglichen Formeln um einfache algebraische Gleichungen, die nach der Konvention immer links stehen.
Sein zeitnahes COBOL hingegen sollte englischartig sein und (meistens!) Der Rechten zugeordnet werden.
quelle
Nun, wie @ diceguyd30 hervorhob, gibt es beide Notationen.
<Identifier> = <Value>
bedeutet " Bezeichner sei Wert ". Oder um dies zu erweitern: Definieren Sie die Variable Identifier to Value (oder definieren Sie sie neu) .<Value> -> <Identifier>
bedeutet " Wert zu Identifikator speichern ". Oder um dies zu erweitern: Setzen Sie den Wert an den von Identifier angegebenen Ort .Natürlich kann der Identifikator im Allgemeinen tatsächlich ein beliebiger L-Wert sein.
Der erste Ansatz berücksichtigt das abstrakte Konzept der Variablen, der zweite Ansatz befasst sich mehr mit der tatsächlichen Speicherung.
Beachten Sie, dass der erste Ansatz auch in Sprachen üblich ist, die keine Zuweisungen haben. Beachten Sie auch, dass variable Definition und Zuordnung relativ nahe
<Type> <Identifier> = <Value>
vs.<Identifier> = <Value>
.quelle
Wie bereits erwähnt, funktionierten alle frühen Computersprachen auf diese Weise. ZB FORTRAN, das viele Jahre vor BASIC kam.
Tatsächlich ist es sehr sinnvoll, die zugewiesene Variable links vom Zuweisungsausdruck zu haben. In einigen Sprachen haben Sie möglicherweise mehrere verschiedene überladene Routinen mit SAME NAME, die unterschiedliche Ergebnistypen zurückgeben. Indem der Compiler zuerst den Typ der zugewiesenen Variablen sieht, weiß er, welche überladene Routine aufzurufen ist oder welche implizite Umwandlung beim Konvertieren von (z. B.) einer Ganzzahl in einen Gleitkommawert zu generieren ist. Das ist eine vereinfachende Erklärung, aber Sie werden hoffentlich auf die Idee kommen.
quelle
Es könnte ein Überbleibsel früher Parsing-Algorithmen sein. Denken Sie daran, dass das LR-Parsing erst 1965 erfunden wurde und es durchaus möglich ist, dass LL-Parser Probleme hatten (im Rahmen der zeitlichen und räumlichen Beschränkungen der Maschinen zu dieser Zeit), das Gegenteil zu erreichen. Erwägen:
Die beiden sind deutlich vom zweiten Token zu unterscheiden. Auf der anderen Seite,
Kein Spaß. Dies wird schlimmer, wenn Sie anfangen, Zuweisungsausdrücke zu verschachteln.
Eine leichtere Disambiguierung für Maschinen bedeutet natürlich auch eine leichtere Disambiguierung für Menschen. Ein weiteres einfaches Beispiel wäre die Suche nach der Initialisierung eines bestimmten Bezeichners.
Ganz einfach, schau einfach auf der linken Seite nach. Auf der anderen Seite die rechte Seite
Besonders wenn Sie keine
grep
Lochkarten finden können, ist es viel schwieriger, die gewünschte Kennung zu finden.quelle
Assemblersprachen haben das Ziel als Teil des linken Opcodes. Höhere Sprachen folgten in der Regel den Konventionen der Vorgängersprachen.
Wenn Sie sehen
=
(oder:=
für Pascalische Dialekte), können Sie diese als aussprechenis assigned the value
, dann ist die Links-Rechts-Natur sinnvoll (da wir in den meisten Sprachen auch von links nach rechts lesen). Da die Programmiersprachen überwiegend von Leuten entwickelt wurden, die von links nach rechts lesen, blieben die Konventionen bestehen.Es ist eine Art 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 würden wir das Ziel vermutlich auf die rechte Seite stellen.
quelle
mov.b #255, d0
zum Beispiel, wohind0
das Register zugewiesen werden soll. Ältere Assembler haben nur ein einziges Argument pro Anweisung. Im 6502LDA #255
(Akku laden) könnte man behaupten, dass sich dasA
auf der linken Seite befindet, aber es befindet sich auch auf der linken Seite inSTA wherever
(Akku laden).Die meisten Anweisungen in COBOL lauten von links nach rechts, sodass die beiden Operanden zuerst und das Ziel zuletzt benannt wurden
multiply salary by rate giving tax
.Ich werde jedoch nicht vorschlagen, dass Ihr Schüler COBOL bevorzugen könnte, aus Angst, dass ich (zu Recht) dafür gekennzeichnet wäre, dass ich einen so leisen, unhöflichen, geschmacklosen Kommentar mache! :-)
quelle
Ich halte das für einen Fehler. Einerseits kann man sagen "10 zu x zuweisen" oder "10 zu x verschieben". Auf der anderen Seite können Sie sagen "setze x auf 10" oder "x wird 10".
Mit anderen Worten, abhängig von Ihrer Verbwahl kann die zugewiesene Variable das Subjekt sein oder nicht und kann sich links befinden oder nicht. "Was natürlich ist" hängt also nur ganz von Ihrer gewohnten Wortwahl ab, um die Aufgabe darzustellen.
quelle
Im Pseudocode steht der Zuweisungsoperator sehr häufig rechts. Zum Beispiel
In Casio-Rechnern, auch nicht programmierbaren Varianten, wird rechts zusätzlich die Zuordnungsvariable angezeigt
In Forth ist die Variable auch rechts
In x86 hat die Intel-Syntax das Ziel auf der linken Seite, aber die GAS-Syntax kehrt die Reihenfolge um, was für viele Leute zu Verwirrung führt, insbesondere bei Anweisungen bezüglich der Reihenfolge der Parameter wie Subtraktion oder Vergleiche. Diese Anweisungen sind in 2 verschiedenen Dialekten gleich
Beide verschieben den Wert in rbx nach rax. Keine andere Assembler-Sprache, die ich kenne, schreibt das Ziel auf der rechten Seite wie GAS.
https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation
Die meisten Sprachen weisen den Wert der linken Seite zu. Einer der Gründe dafür ist die einfache Ausrichtung der Operatoren, das einfachere Lesen und Erkennen der Variablen, da die Positionen der Zuweisungsoperatoren und Variablen in den Zeilen nicht stark variieren und das Lesen einfacher ist msgstr "Variable soll ein Wert sein".
Einige Leute bevorzugen es jedoch, "Wert x nach y verschieben" zu sagen und die Variable rechts zu schreiben.
quelle
Ich denke, es folgt einer logischen Denkweise.
Es muss zuerst eine Box (Variable) geben, dann setzen Sie ein Objekt (Wert) hinein.
Sie legen das Objekt nicht in die Luft und stellen dann eine Schachtel darum.
quelle