Diskussion:Zuweisung
Einfachzuweisung (Single assignment)
BearbeitenSingle assignment erklärung und beschreibung fehlt, verweis zu Haskell, Erlang usw. wäre auch nicht schlecht (nicht signierter Beitrag von 95.223.157.35 (Diskussion | Beiträge) 00:53, 16. Aug. 2009 (CEST))
Der Artikel setzt noch immer zu viel vorwissen voraus
BearbeitenDer Artikel setzt noch immer zu viel vorwissen voraus. Wer bereits weiß, was eine Variable und was eine Belegung ist, dem braucht man Zuweisung nicht mehr erklären, das ist der erste Teil. Der zweite Teil ist unvollständig, und nicht ausreichend abstrakt. Das kristallisiert sich darin, dass die angebliche Notation LISP und scheme nicht mehr trifft. Richardigel 18:45, 22. Mai 2006 (CEST)
- Hallo, danke für die diesmal ausführliche Begründung. So kann man schon etwas mehr mit deinen Bedenken anfangen. Ich habe den Begriff jetzt auf imperative Programmierung beschränkt, da insbesondere funktionale und 4GL-Sprachen eine Sonderrolle spielen, die nicht ohne Weiteres zu berücksichtigen ist oder für die der Begriff "Zuweisung" z. T. ganz unangebracht ist. Des weiteren habe ich den Begriff "Variable" besser erläutert, obwohl der Link auf den Variablen-Artikel hier aus meiner Sicht völlig ausreichend war. Für "Belegung" fällt mir nichts Besseres ein, ich habe hier einen entsprechenden Link aufgenommen. Wenn dir hier etwas Besseres einfällt, bin ich für Vorschläge offen. Insofern ich keinen begründeten und nachvollziehbaren Einspruch lese, werde ich den Baustein daher später wieder entfernen. Mkleine 19:20, 22. Mai 2006 (CEST)
- Auch funktionale Programmiersprachen benutzen Zuweisungen, auch wenn sie sie auf den Tod vermeiden, und es am liebsten gar nie zugeben würden (so wie Scheme). Inwieweit die Schemer da recht haben, darüber mag ich gerade nicht streiten. Aber als reinrassige funktionale Programmiersprache darf ich Smalltalk anführen, da wird zugewiesen, soviel man möchte. Richardigel 20:06, 22. Mai 2006 (CEST)
- Ist die gegenwärtige Artikelfassung eigentlich dein Ernst oder soll ich das als Vandalismus interpretieren? Von den zahlreichen Syntax- und Rechtschreibfehlern mal abgesehen, ist es ja wohl reichlich hahnebüchen, eine Zuweisung über Turingmaschinen erläutern zu wollen. Der Artikel hat sich in jeder Hinsicht verschlechtert, weshalb ich einen Revert vorschlage. Mkleine 20:12, 22. Mai 2006 (CEST)
- Ich finde das überhaupt nicht hahnebüchen. Eine Programmiersprache ist erst einmal eine Grammatik, da passiert nichts. Eine Grammatik ist ein DFA, und der hat nun einmal keine Variablen.
- Ich finde es naheliegend, einen Vorgang innerhalb einer Maschine an der Maschine zu erklären, und nicht an der angelehnten Grammatik (denn die Grammatik ist ein DFA, so einer hat keine Variablen) Richardigel 20:18, 22. Mai 2006 (CEST)
- Eine Grammatik ist ein DFA??? Hast du dich mal mit der Chomsky-Hierarchie beschäftigt? Die meisten Programmiersprachen sind übrigens kontextfreie Grammatiken, die so generierten Sprachen lassen sich von Kellerautomaten entscheiden, nicht von DFAs. Kann es eigentlich sein, dass du keine Ahnung von dieser Thematik hast? Mkleine 20:30, 22. Mai 2006 (CEST)
- Oops, das hab ich wohl tatsächlich vertan. Richardigel 20:36, 22. Mai 2006 (CEST)
- Eine Grammatik ist ein DFA??? Hast du dich mal mit der Chomsky-Hierarchie beschäftigt? Die meisten Programmiersprachen sind übrigens kontextfreie Grammatiken, die so generierten Sprachen lassen sich von Kellerautomaten entscheiden, nicht von DFAs. Kann es eigentlich sein, dass du keine Ahnung von dieser Thematik hast? Mkleine 20:30, 22. Mai 2006 (CEST)
- Ist die gegenwärtige Artikelfassung eigentlich dein Ernst oder soll ich das als Vandalismus interpretieren? Von den zahlreichen Syntax- und Rechtschreibfehlern mal abgesehen, ist es ja wohl reichlich hahnebüchen, eine Zuweisung über Turingmaschinen erläutern zu wollen. Der Artikel hat sich in jeder Hinsicht verschlechtert, weshalb ich einen Revert vorschlage. Mkleine 20:12, 22. Mai 2006 (CEST)
- Auch funktionale Programmiersprachen benutzen Zuweisungen, auch wenn sie sie auf den Tod vermeiden, und es am liebsten gar nie zugeben würden (so wie Scheme). Inwieweit die Schemer da recht haben, darüber mag ich gerade nicht streiten. Aber als reinrassige funktionale Programmiersprache darf ich Smalltalk anführen, da wird zugewiesen, soviel man möchte. Richardigel 20:06, 22. Mai 2006 (CEST)
Revert der Neufassung
BearbeitenHallo, ich reverte die Artikelneufassung aus folgenden Gründen:
- Der Bezug auf eine Turingmaschine ist nicht nur weit hergeholt und dürfte keinem Leser, der nicht über entsprechende Kenntnisse in der Automatentheorie verfügt, unverständlich bleiben. Er ist sogar sachlich falsch: Zuweisungen sind Programmiersprachen-Konstrukte, eine Turingmaschine ist aber an sich ein Automat und keine Sprache. Eine Turingmaschine verfügt nicht einmal über Variablen, sondern ledliglich über Bänder mit Zellen, auf die ein Schreibkopf Werte eintragen kann. Das hat aber nichts mit einer Zuweisung zu tun, weil eine Bandzelle der Turingmaschine nicht einer Variablen entspricht. Hierzu müsste zunächst eine Sprache formuliert werden, welche die Turingmaschine steuert, erst auf der Ebene dieser Sprache würde der Variablenbegriff (und damit der Zuweisungsbegriff) einen Sinn ergeben.
- Gravierende weitere inhaltliche Fehler wie z. B. "So eine Speicherstelle ist in der Turingmaschine als Zahl gegeben". Das ist aber nicht korrekt, genauso gut können Striche oder andere Zeichen verwendet werden. Das Alphabet einer TM ist frei wählbar.
- Von den sprachlichen Mängeln will ich im Detail garnicht reden.
Mkleine 21:30, 22. Mai 2006 (CEST)
- Ich gehe einmal auf das Wesentlich ein, du hältst das für falsch, weil eine Turing-Maschine ein Automat ist und keine Sprache. Das ist gerade der Grund, warum ich die Erklärung per Maschine (nicht notwendig als Turingmaschine, aber es bietet sich doch an) für zwingend notwendig halte. Denn eine Zuweisung ist kein Element einer speziellen Sprache, sondern etwas abstrakteres. Das bemerkt man eben daran, dass hier verschiedene Sprachen angegeben wurden, mit unterschiedlichen Wörtern, die alle als Zuweisung verstanden werden. Warum werden sie als Zuweisung verstanden? Weil sie auf der Maschine als Zuweisung behandelt werden. Dies ist das Abstraktum, dies ist der zu erklärende Begriff: Die Zuweisung auf der Maschine, und wie sie in Sprachen abgebildet wird. Ich stelle die Fassung wieder her. Richardigel 21:36, 22. Mai 2006 (CEST)
- Nein, auf Turingmaschinen wird nichts zugewiesen, es werden nur Bänder beschrieben. Das ist konzeptionell etwas völlig anderes, mal abgesehen von den didaktischen Mängeln des ganzen Ansatzes. Mkleine 21:40, 22. Mai 2006 (CEST)
- Das ist doch gerade äquivalent. Das zuweisen einer Variablen kann man erklären als Beschreiben eines Bandes oder als Zuweisung an eine Speicheradresse. Ich würde akzeptieren, wenn du die Turing-Maschine streichst und stattdessen einen Computer zugrundelegst, dessen Speicheradressen beschrieben werden. Richardigel 21:44, 22. Mai 2006 (CEST)
- Nocheinmal: Eine Zuweisung ist ein Konzept auf der Ebene einer Programmiersprache. Es macht nur in einem Kontext Sinn, in dem auch Variablen existieren. Variablen sind Namen für Speicherbereiche, aber diese Namen existieren nur innerhalb des Programmtextes. Auf Maschinenebene existieren keine Variablen. Also gibt es dort auch keine Zuweisungen. Es gibt höchstens Maschinenbefehle, die ein Bitmuster an eine bestimmte Adresse schreiben.
- Auf Maschinenebene ist der Begriff der Zuweisung daher sinnlos. Mkleine 22:04, 22. Mai 2006 (CEST)
- Eine Programmiersprache ist eine formale Sprache. Aber das Lemma heißt nicht: "Zuweisung der Programmiersprache Java", sondern das Lemma impliziert, dass für alle Programmiersprachen es Zuweisungen gibt. Es gibt also etwas abstrakteres, als "a = b", das ist der Mechanismus, den eine Zuweisung auslöst. Daran erkennt man eine Zuweisung. Das ist der Begriff Zuweisung. Richardigel 23:30, 22. Mai 2006 (CEST)
- Das ist doch gerade äquivalent. Das zuweisen einer Variablen kann man erklären als Beschreiben eines Bandes oder als Zuweisung an eine Speicheradresse. Ich würde akzeptieren, wenn du die Turing-Maschine streichst und stattdessen einen Computer zugrundelegst, dessen Speicheradressen beschrieben werden. Richardigel 21:44, 22. Mai 2006 (CEST)
- Nein, auf Turingmaschinen wird nichts zugewiesen, es werden nur Bänder beschrieben. Das ist konzeptionell etwas völlig anderes, mal abgesehen von den didaktischen Mängeln des ganzen Ansatzes. Mkleine 21:40, 22. Mai 2006 (CEST)
Gesperrt
BearbeitenBitte einigt Euch hier auf der Diskussionsseite und sagt auf der Seite der Entsperrwünsche bescheid, wenn Ihr so weit seid. --Silberchen ••• 22:13, 22. Mai 2006 (CEST) P.S. @Mkleine: Bitte siehe [1]
So, wir müssen uns jetzt einigen. Wenn wir uns geeinigt haben, wird der Artikel entsperrt. Richardigel 22:04, 22. Mai 2006 (CEST)
- Dann geh endlich mal auf die Argumente ein. Mkleine 22:07, 22. Mai 2006 (CEST)
Die Diskussion ist für mich an dieser Stelle abgeschlossen. Weder den Artikel noch die Diskussion setze ich unter diesen Umständen fort. @Silberchen: Da wirst du schon einen anderen Experten finden müssen, wenn ein verständlicher, fachlich korrekter Artikel dein Ziel ist. Mkleine 22:20, 22. Mai 2006 (CEST)
Neu erstellt.
BearbeitenUm eine Zuweisung zu verstehen, muss man keine Turing-Maschinen kennen, so schön diese auch sind. Außerdem gilt das oben gesagte. Ich habe also den Artikel ohne Bezug auf Turingmaschine weitgehend neu geschrieben. Hoffe die etwas allgemeinere Fassung trifft nun mehr Programmiersprachen, z.B. auch Scheme. -- Erzbischof 17:18, 23. Mai 2006 (CEST)
- Das ist der andere Zugang, den ich weniger schön finde als den über Turingmaschinen, der aber auch näher liegt. Man müsste noch ein wenig sortieren, der Zusammenhang zwischen Programmiersprache und umgesetzten Befehl geht verloren, das wird zu sehr gleichgesetzt. igel+- 17:53, 23. Mai 2006 (CEST)
- Die Sache mit Scheme musst du genauer erklären, ich fand deine Formulierungen bemüht vage, aber das ist, denke ich, unnötig, auch Scheme weist letztlich im normalen Sinne zu. Einen Abschnitt über Geltungsbereiche wäre eine Überschneidung mit Variable. Das ist im Rahmen einer kleinen Erklärung sicherlich ok, dann muss man aber auch genug Information bereitstellen, sodass man das verstehen kann. Darum habe ich den Geltungsbereich erst einmal entfernt, da ich ihn auch für verzichtbar halte. (Wenn er erklärt werden soll, muss mehr über Variablen gesagt werden) igel+- 18:16, 23. Mai 2006 (CEST)
Sehr glücklich bin auch ich mit dem aktuellen Wortlaut nicht. Die Definition „Eine Anweisung, die den Computer veranlasst, eine Information zu schreiben, ist eine Zuweisung“ ist entweder sehr unüblich oder irreführend formuliert – eine Zuweisung schreibt keine Information, jedenfalls nicht auf (Drucker-) Papier oder auf die Festplatte (und diese Schlüsse ließe die Formulierung für den völlig unvorbelasteten Leser zu).
Eine Zuweisung weist einem logischen Speicherplatz einen Wert zu. Diesen logischen Speicherplätze kann physisch eine Gruppe von adressierbaren Teilen des Hauptspeichers entsprechen (z.B. bei Zahlen, Sätzen oder Objekten), genausogut aber nur eine einzige (eine Bytevariable auf einer Bytemaschine, eine wortgroße Variable auf einer Wortmaschine) oder sogar nur ein Teil davon (eine gepackte BCD-Zahl auf einer Byte- oder Wortmaschine). Das eine hat mit dem anderen nichts zu tun, auch nicht in Assembler. Kurz: Eine Variable ist etwas anderes als ein symbolischer Name für eine Speicheradresse.
Eine Anweisung, ein Datum auf die Festplatte zu schreiben, wird an keiner mir bekannten Stelle als Zuweisung bezeichnet. Davon unbeschadet kann natürlich der logische Speicherplatz der Variable in einem virtuellen Adressraum liegen, aber das hat wirklich nichts mit dem Konzept der Zuweisung zu tun.
Die Formulierung „Eine Programmiersprache gibt einem Computer Anweisungen“ ist ja nun sogar falsch. Eine Sprache ist ein Mittel, Anweisungen auszudrücken, und kein Individuum, das jemandem Anweisungen erteilt. Okay, das kann man per Weltwissen emendieren, aber trotzdem sollte ein Artikel korrekt formuliert sein.
Ich neige auch dazu, anzuzweifeln, dass ein Programmierer glauben könnte, dass Namen Information transportieren. Ich nehme an, so ist es nicht gemeint, aber vielleicht ließe sich das Gemeinte ein bisschen deutlicher sagen?
Ansonsten leidet der Artikel ein bisschen daran, dass das Konzept der Zuweisung ziemlich banal ist. Wenn man weiß, was Variable (Programmierung) ist, dann kann man das Konzept der Zuweisung mit einem Satz erklären; darüber hinaus kann man dann allenfalls noch Beispiele für die Zuweisungssyntax in unterschiedlichen Sprachen angeben.
Viele Grüße, --GottschallCh 19:50, 23. Mai 2006 (CEST)
Nochmal zur Ansicht: Die erste Fassung
BearbeitenHallo, prima, dass hier etwas Bewegung in die Sache gekommen ist. Da dies nun die dritte Neufassung ist, möchte ich auch nochmal die erste Fassung ins Gedächtnis rufen. Ich gebe GottschallCh völlig recht, dass der Begriff ja eigentlich völlig unspektakulär ist. Im Detail gäbe es allerdings vielleicht schon ein paar Fragen zu klären, z.B.
- ob sich der Begriff Zuweisung auch auf den physischen Vorgang des Ladens von Werten in bestimmte Speicherzellen bezieht (Zuweisung auf eine Prozessorinstruktion ausdehnen)
- ob eine Zuweisung tatsächlich auf logische Speicherplätze bezogen ist, wie GottschallCh es sieht, oder ob sie nicht womöglich gar nur bezogen auf den Speicherbereich des Programmes selbst bezogen ist (und hier in der Regel auf den Stack)
- oder ob der Begriff nicht auf die Ebene einer Programmiersprache zu beschränken ist (Zuweisung als Anweisung in einer imperativen Programmiersprache)
- ob der Begriff Zuweisung auch auf nicht-imperative Sprachen angewandt werden kann
Hier also die alte Fassung, vielleicht lässt sich daraus ja noch noch etwas wiederverwenden. Allemal ist die jetzige Fassung besser als dieser furchtbare Turingmaschinen-Unsinn, wenn ich auch zustimme, dass weiterhin eine Reihe von Fehlern unschön ist.
- Hallo!
- Variablen und Zuweisungen sind abstrakte Konzepte, würde ich sagen. Wenn man einer Variablen einen Wert zuweist, dann wird das physisch meistens schon dazu führen, dass "eine oder mehrere Speicherzellen mit Werten geladen" werden. Beim "int i=5;" vermischt man gerne die Abstraktion und das physische Substrat, weil sie strukturell 1:1 aufeinander abbildbar sind. Bei der harmlosen logischen Zuweisung des Wertes b an die Variable a kann aber im Allgemeinen sehr viel mehr passieren, z.B. wenn a und/oder b Klassenvariablen sind Zuweisungsfunktionen, Kopierkonstruktoren odgl. aufgerufen werden. Wie gesagt, ich kenne keinen Sprachgebrauch, der Variable und physischen Speicher identifizieren würde.
- Mit "logischer Speicherbereich" meine ich ohnedies den logischen Speicherbereich des Programms – die Summe der Variablen, die dieses Programm verwendet. Welche davon einen oder mehrere physische Speicherplätze belegen und welche davon gar keinen physischen Speicherplatz belegen (z.B. weil sie wegoptimiert wurden) ist davon ganz unabhängig.
- In der Assemblerpraxis macht man den Abstraktionsschritt vom physischen Speicher zur logischen Variablen eher nicht, sondern sieht Labels tatsächlich rein als logische Namen für Speicheradressen und/oder Speicherbereiche an – dort nennt man sie aber auch nicht Variablen. In diesem Fall sagt man auch im keinem mir bekannten Sprachgebrauch, dass man "X einen Wert zuweise" odgl., sondern sagt eher, man lade X mit einem Wert. Die Abstraktion selber ließe sich hier aber natürlich auch anwenden, bloß ist auch dann nicht Variable=Speicherplatz/Speicherbereich, sondern Variable=logischer Speicherplatz, dessen Struktur (zufälligerweise) isomorph mit dem physischen Speicher ist.
- Ich würde es also wirklich lieber als abstraktes Konzept erklärt wissen, wobei natürlich überhaupt nichts dagegen spricht, etwas zur Realisierung zu sagen.
- Viele Grüße, --GottschallCh 21:20, 23. Mai 2006 (CEST)
- Hallo GottschallCh, ich stimme überein, eine Zuweisung als etwas Abstraktes zu sehen. Insbesondere halte ich einen konkreten Bezug auf physischen Speicher für nicht korrekt. Hier mal ein Beispiel aus Java, Stichwort ist hier "Autoboxing":
Integer i = 5;
- Was passiert hier? Wir haben im Programmcode nur eine Variable, eine Zuweisung. Aber physisch wird auf dem Stack eine Referenz angelegt und auf dem Heap ein Objekt vom Typ Integer (Wrapperklasse), auf das die Referenz zeigt. Es werden also mindestens zwei Speicherbereiche beschrieben, obwohl es programmiersprachlich nur eine Zuweisung und auch nur eine Variable gibt.
- Das Beispiel zeigt aus meiner Sicht, dass man den Zuweisungsbegriff tatsächlich abstrakt, und zwar auf sprachlicher Ebene abstrakt fassen muss (eine Maschinen-Abstraktion bringt hingegen nichts). Mkleine 00:00, 24. Mai 2006 (CEST)
Unter einer Zuweisung (engl. assignment) versteht man in einer imperativen Programmiersprache die Belegung einer Variablen mit einem Wert. Eine Variable wird dabei als ein Name für einen Speicherbereich verstanden, der den jeweiligen Wert aufnehmen kann.
Die Zuweisung ist somit eine spezielle Anweisung (engl. statement).
Der jetztige verworrene Zustand des Artikels wurde von mir mitverschuldet, da ich im Zuge einer Neudefinition "Zuweisung" zu allgemein im Hinsicht auf "Bindung" erklärt habe, was nachträglich von Richardigel in "Zuweisung" zu einem zu konkret-umständlichen Artikel aus der Perspektive von Speicherzellen, aber aufbauend auf meinem Text, verändert wurde. Ich schlage vor, "Zuweisung" noch mal neu zu schreiben (Nachtrag: beziehungsweise auf die alte Version von Mkleine zurückzusetzen Erzbischof 20:48, 23. Mai 2006 (CEST)) und auf folgende Themen zu reduzieren:
- Definition in drei Sätzen
- Unterschied zwischen Zuweisungen in der Informatik und Definitionen in der Mathematik
- Beispiele der Syntax
- Verbreitete Fehler (== und = in C verwechseln, etc)
- Die Vertauschung
Das entspricht etwa dem Englischen Artikel, muss aber nicht so ausführlich sein.
Aus dem Englischen Artikel en:name binding und meinem alten Text machen wir dann den neuen Artikel Bindung (Programmiersprachen) oder so ähnlich. Einverstanden?
-- Erzbischof 20:45, 23. Mai 2006 (CEST)
- Aus meiner Sicht wäre das einen Versuch wert. Schieß los ;-). Übrigens finde ich, dass diese Vertauschungs-Codebeispiele doch eher Kinderkram sind. Mit Zuweisung hat das nur insofern zu tun, als fast jeder Programmcode eben auch hier und da Zuweisungen verwendet. Das kann aus meiner Sicht also draußen bleiben, da es den Artikel nur unnötig aufbläht. Mkleine 00:00, 24. Mai 2006 (CEST)
Notation
BearbeitenEine Zuweisung besteht in fast allen imperativen Programmiersprachen aus drei Bestandteilen:
- Ein symbolischer Name steht für die Variable, der ein Wert zugewiesen werden soll. Dieser Name wird auf der linken Seite der Zuweisung notiert.
- Ein Zuweisungsoperator oder -befehl kennzeichnet die Anweisung als eine Zuweisung.
- Ein Ausdruck (engl. expression) bestimmt, welcher Wert der Variablen zugewiesen wird.
Welche exakte Notation für Variable, Zuweisungs-Operator und Ausdruck verwendet wird, kann je nach Programmiersprache variieren. Hier einige Beispiele für unterschiedliche Zuweisungs-Operatoren:
Variable = Ausdruck Variable := Ausdruck Variable ← Ausdruck set Variable Ausdruck
Viele Grüße Mkleine 20:38, 23. Mai 2006 (CEST)
igels Antwort
Bearbeiten- Hallo ihr drei. Ich finde auch, dass die aktuelle Fassung so nicht bleiben kann, ihr habt mir euren Gründen wohl alles gesagt. Nach all dem Gesagten fühle ich mich allerdings bestärkt darin, die Turing-Maschine zu erwähnen. Sie bildet die gesuchte Brücke zwischen Sprache und Maschine. GottschalCHs Einwürfe, dass der Begriff Zuweisung so nicht verwendet wird, sind nicht von der Hand zu weisen. Ich denke, der Ausflug zur Turing-Maschine würde den Variable-Artikel gut ergänzen. Der eigentliche Vorteil ist, dass man als Vorwissen nur eine ungefähre Vorstellung von einer Turing-Maschine haben muss. Das kann man als viel oder wenig empfinden. Das coole ist, dass der Artikel Turing-Maschine selbst nur wenig Vorwissen voraussetzt, sodass die in den Informatik-Artikeln oft findbare Kreise unterbleiben, in der Wörter mit Wörtern erklärt werden, die woanders erklärt werden, sodass man Stunden lang im Kreis klicken kann, ohne ein Wort zu verstehen. Man müsste nur diesen Artikel (In dieser Version: [2]) lesen, und ein paar Kapitel aus Turing-Maschine.
- Das Problem an meinem Ansatz war tatsächlich, dass viele Menschen sich für Programmieren und Zuweisung interessieren, ohne von Turingmaschinen gehört zu haben, oder sich dafür zu interessieren. Der Verweis auf sie macht den Artikel schön und interessant (wie ich finde), aber die Erklärung scheint gleichzeitig erst einmal einen (vielleicht unnötigen) Umweg zu machen. --igel+- 21:36, 23. Mai 2006 (CEST)
Die Turingmaschine als Metapher –zumal in der gewählten Formulierung– suggeriert aber:
- dass eine Turingmaschine ein realer Apparat sei
- dass eine Variable ein realer Speicherplatz sei.
- dass alle Speicherplätze und damit alle Variablen gleichartig sind und beliebige Werte speichern können.
Das wird einerseits der Turingmaschine nicht gerecht, die ein rein gedankliches Konstrukt ist, und andererseits den Variablen nicht, die auch rein gedankliche Konstrukte sind – aber von anderer Art als die Turingmaschine und von untereinander unterschiedlichem Typ.
Klar kann und muss man erwähnen, wie Variablen auf physikalisch existierenden Computern realisiert werden. Dort werden sie aber durchaus nicht immer, nicht einmal mehrheitlich als Speicherstellen realisiert, sondern:
- häufiger als Bereich mehrerer Speicherstellen
- oft bloß durch CPU-Register
- oft auch gar nicht (wenn der Compiler Zwischenvariablen wegoptimiert
Ebenfalls klar ist, dass die ersten beiden Punkte auf abstrakterer Ebene dasselbe sind ("Speicher"), aber die Formulierungen im Artikel machen das gar nicht deutlich.
Wie gesagt, der Artikel vermischt komplett die logischen Konzepte der Variablen und Zuweisungen mit einer deren möglicher Realisierungen (numerisch adressierbare Speicherplätze).
Den Abschnitt über Notationen und sogar über das Vertauschen von Werten finde ich dafür ganz nett, weil er konkrete Beispiele liefert und man sich dann hoffentlicht mehr darunter vorstellen kann.
Viele Grüße, --GottschallCh 16:19, 25. Mai 2006 (CEST)
Zur Abwechslung mal eine externe Quelle
BearbeitenHallo, ich habe heute mal in der Bibliothek gestöbert. Zunächst einmal ist festzuhalten, dass nur wenige lexikalisch orientierte Werke den Begriff überhaupt führen (ich habe glaube ich 6-7 Lexika/Wörterbücher u.ä. gefunden, aber nur in 3 oder 4 war der Begriff enthalten. In den älteren Werken wird der Begriff in einem ganz anderen Zusammenhang verwendet, nämlich im Sinne von "Ressourcenzuweisung" nicht nur bezogen auf Speicher. Häufig verweisen die Lexika daher auch auf den Begriff "Zuordnung". Es handelt sich da also um eine ganz andere, zweite Bedeutung, die heute kaum mehr gebräuchlich ist.
Dennoch, immerhin habe ich ein Zitat gefunden. Und ich war doch überrascht, wie nahe dieses Zitat an meiner ersten Version dieses Artikels liegt. Quelle ist der Informatik-Duden, die Autoren Prof. Claus und Prof. Schwill (kommen dir die bekannt vor, GottschallCh ;-) ?):
Die Zuweisung (oder auch Wertzuweisung) ist die elementarste Anweisung in imperativen Programmiersprachen. Durch eine Zuweisung erhält eine Variable einen neuen Wert.
Hier nochmal zum Vergleich meine Version, bevor Richardigel seine Turingmaschinen-Idee einbrachte:
Unter einer Zuweisung (engl. assignment) versteht man in einer imperativen Programmiersprache die Belegung einer Variablen mit einem Wert. Eine Variable wird dabei als ein Name für einen Speicherbereich verstanden, der den jeweiligen Wert aufnehmen kann. Die Zuweisung ist somit eine spezielle Anweisung (engl. statement).
Auch wenn ich es natürlich nicht nachweisen kann, kann ich euch versichern, dass ich meine Formulierung nicht aus dem Informatik-Duden abgeleitet habe, und eigentlich halte ich von diesem Werk auch nicht so wahnsinnig viel (wie GottschallCh ja bestätigen kann ;-) ). Aber dennoch: Die Tatsache, dass hier ganz unterschiedliche Personen auf eine fast identische Formulierung gekommen sind, scheint mir auf einen wesentlichen Kern des Begriffs Zuweisung hinzudeuten:
- Der Begriff Zuweisung bezeichnet ein Konzept, dass auf der Ebene von imperativen Programmiersprachen angesiedelt ist.
- Hierzu gehört auch die Formulierung, dass die Zuweisung eine spezielle Anweisung ist.
Wenn sich daher, wie es sich in den letzten Tagen angedeutet hat, in Artikel oder Diskussion keine Fortschritte mehr ergeben, werde ich auf der Basis dieser Quelle eine Artikelversion erstellen, die dann freilich wieder recht nahe an der ursprünglichen Version liegt. Und mehr noch: Wenn dieser Begriff über die programmiersprachliche Ebene hinaus ausgedeht wird, so muss von demjenigen, der dies tut, ein entsprechender Quellennachweis eingefordert werden, denn es hat sich gezeigt, dass die ganze Diskutierei auf der Basis persönlichen Wissens oder Halbwissens oder Nichtwissens zu einem chaotischen, unverständlichen und inhaltlich in weiten Teilen falschen Artikel geführt hat. Mkleine 23:45, 26. Mai 2006 (CEST)
- Hallo!
- Ich versuche ja auch die ganze Zeit, gegen die Fehler des Artikels in seinem aktuellen Zustand zu argumentieren. An der Ausgangsfassung habe ich viel weniger auszusetzen als am jetzigen Zustand, von zwei Kleinigkeiten abgesehen:
- „Belegung einer Variablen mit einem Wert“ ist mehrdeutig und könnte einerseits als Belegung im mathematischen Sinn, andererseits als Vorgang des Belegens gelesen werden. Letzteres könnte man akzeptieren, aber die gängigste Bedeutung scheint doch die einer Anweisung zu sein, die einer Variablen einen Wert zuweist.
- Dass eine Variable als „Name für einen Speicherbereich verstanden“ wird ist natürlich richtig, lässt sich aber –gerade weil „Speicher“ und „Speicherbereich“ Wörter sind, die jede/r kennt– sehr leicht im Sinn physikalischen Speichers missverstehen (der Duden-Eintrag zu „Variable“ gefällt mir übrigens auch gut).
- Die Beispiele dafür, wie Zuweisungen in einzelnen Sprachen aussehen, würde ich –einschließlich Austausch von Variableninhalten– übrigens beibehalten, weil sie den Text auflockern und die Sache konkreter machen.
- Die Sache mit der Ressourcenzuweisung halte ich für kein Problem. „Jemandem etwas zuordnen, zuteilen, zuweisen“ ist ganz gewöhnlicher deutscher Sprachgebrauch. Der Gebrauch ist noch nicht einmal veraltet, bloß ist es kein terminus technicus und braucht deshalb keinen Eintrag in einem Lexikon (in einem Wörterbuch sähe das natürlich anders aus).
- Viele Grüße, --GottschallCh 01:20, 27. Mai 2006 (CEST)
- Hallo, die Erläuterung, was eine Variable ist, habe ich fast wörtlich aus dem Artikel Variable (Programmierung) entnommen und erst in den Artikel eingearbeitet, nachdem Richardigel nicht bereit war, einen QS- bzw. Überarbeiten-Baustein zu entfernen, mit der Begründung, die Begriffe "Belegung" und "Variable" seien ohne weitere Erläuterung nicht verständlich. Meines Erachtens kann die Erläuterung, was eine Variable ist, ohnehin besser wegfallen. Der Link auf den Artikel genügt. Auf den Begriff "Belegung" bestehe ich auch nicht. Mkleine 18:32, 27. Mai 2006 (CEST)
- Hallo!
- Die Formulierung „Anweisung, durch die eine Variable einen neuen Wert erhält“ ist zwar eine gute Beschreibung, aber noch keine exakte Definition: Auch andere Anweisungstypen (z.B. Prozeduraufrufe mit Referenzparametern) können den Wert einer Variablen ändern, ohne dass man sie deshalb üblicherweise Zuweisung nennen würde. Mit ist nichts Besseres eingefallen als „In Abgrenzung von anderen Anweisungstypen, die ebenfalls den Wert einer Variablen verändern können, spricht man nur dann von einer Zuweisung, wenn der Zuweisungsoperator der jeweiligen Programmiersprache verwendet wird.“
- Viele Grüße, --GottschallCh 13:33, 28. Mai 2006 (CEST)
Vektorzuweisung
BearbeitenHi GottschallCh, könntest du bitte den Begriff "Vektorzuweisung" kurz erläutern? Der ist mir bislang noch nicht untergekommen. Google findet nur 10 Treffer. Gibt es einen geläufigeren Begriff? Was ist gemeint? Mkleine 14:36, 28. Mai 2006 (CEST)
- Hallo!
- Das ist nur ein gewöhnliches Kompositum, kein terminus technicus: Vektorzuweisung = Zuweisung eines Vektors. Ein Perl-Ausdruck der Form
(a1, a2, ... an)
ist ein Vektor. Wenn so ein Ausdruck Quelle und/oder Ziel einer Zuweisung ist, dann die Zuweisung eines Vektors = Vektorzuweisung.($a1,$a2) = ($a2,$a1)
ist also logisch keine Mehrfachzuweisung, sondern die Zuweisung genau eines Objekts (eines Vektors) an genau ein Objekt (einen Vektor). - Ich war beim Bilden dieser Formulierung ganz arglos, weil Kompositabildung im Deutschen ein ganz normaler Vorgang ist; zusätzlich hätte ich angenommen, dass ein nicht verlinktes und nicht kursiv gedrucktes Wort im normalsprachlichen Sinn verstanden wird. Es wäre für mich aber kein Problem, statt dessen z.B. "Zuweisung eines Vektors an einen anderen Vektor" odgl. zu schreiben.
- Viele Grüße, --GottschallCh 18:51, 28. Mai 2006 (CEST)
- Ich würde unter diesen Umständen das Perl-Beispiel lieber entfernen. Zum einen ist es ja dann keine Mehrfachzuweisung im eigentlichen Sinne, zum anderen wird hier relativ spezielle Terminologie aus der Perl-Welt vorausgesetzt (welcher Leser weiß, was ein "Vektor" ist? Was ist der Unterschied zu einer Liste? Einem Array?). Das Ruby-Beispiel deckt ja das Wesentliche einer Mehrfachzuweisung schon ganz gut ab. Was meinst du? Viele Grüße Mkleine 19:27, 28. Mai 2006 (CEST)
- Hallo!
- Naja, es ist ja nicht so, dass es keine Mehrfachzuweisung wäre, sondern dass es bloß ein Grenzfall ist. In Perl ist eine Liste ein L-Wert, dem etwas zuzuweisen zur Folge hat, dass den in der Liste aufgezählten L-Werten zugewiesen wird. Im verwendeten Beispiel ist die Listenzuweisung also eine Mehrfachzuweisung. Ich habe aber den Exkurs in punkto Vektor (=Array=Liste) wieder entfernt, damit es nicht zu ausschweifend wird.
- Der Artikel Dreieckstausch ist für mich an sich okay, ich hätte nur die paar Worte zum Austauschen von Variableninhalten als nette Illustration zur Zuweisung gesehen; der englische Wikipedia-Eintrag [3] macht das ebenso. Ob das Thema genug für einen eigenen Artikel hergibt, wurde in den bisherigen Löschdiskussionen [4] negativ beschieden – aber, wie gesagt, ich persönlich finde es nicht schlimm, wenn es einen eigenen Artikel dazu gibt.
- Viele Grüße, --GottschallCh 20:46, 28. Mai 2006 (CEST)
- Hi, so wie jetzt ist der Artikel doch prima! Was den Dreieckstausch betrifft, zähle ich in der Löschdiskussion 6:4 Stimmen für behalten. Auch wenn das ja keine "Abstimmungen" im engeren Sinne sind, kann ich nicht ganz nachvollziehen, warum der Artikel schließlich gelöscht wurde. Scheint mir eine eigenmächtige Admin-Entscheidung gewesen zu sein. In jedem Fall halte ich den Dreieckstausch nicht für relevant im Artikel Zuweisung, da er nur insofern zum Thema Zuweisung beiträgt wie jedes andere Codebeispiel, das Zuweisungen benutzt, das auch tut. Bei aller Liebe zu Details darf doch das Wesentliche nicht aus dem Auge verloren werden, weshalb ich einen Link hier für ausreichend halte. Viele Grüße Mkleine 20:58, 28. Mai 2006 (CEST)
- Halllo =) Die Merfachzuweisung in der Form
int a, b, c = 5;
und der Forma = b = c = getValue();
sollte m.E. auch aufgeführt werden, ggf. zusammen mit den Programmiersprachen, die diese Form der Zuweisung unterstützen. --GoldenHawk82 20:23, 31. Mai 2008 (CEST)
- Halllo =) Die Merfachzuweisung in der Form
Zielloses Rambling
BearbeitenDer Abschnitt "syntaktische Eigenheiten" ist zielloses Rambling. Er
- fängt damit an, dass irgendwas verwechselt werden kann,
- hackt dann so-lala auf Fortran und Konsorten herum,
- spricht von "booleschen Ergebnissen" der Gleichheits-Relation, was ein dümmliches Konzept ist (eine Relation ist eine parametrisierte Aussage und als solche in moderner Informatik eher als Typ zu betrachten; a=b und b=a sind dann auch nicht gleich, sondern nur natürlich isomorph; und das ist kein Defekt, sondern besser so); gemeint ist vll. eher eine Entscheidungsprozedur / "relationaler Operator" o.ä.
- und erkennt zu guter letzt nicht, dass die C-Code-Beispiele nicht so viel mit (kontextfreier) Syntax zu tun haben, sondern auch ein bescheuertes Typsystem erfordern (dieses kann man C aber auch nicht ohne weiteres vorhalten, denn es sollte ursprünglich eine super-simple Sprache sein, wo praktisch alles int ist). Man kann auch bei Sprachen mit C-artiger Syntax und wertbehafteten Zuweisungen die genannten Fehler durch den Compiler verhindern lassen. Java und C# machen's pi-mal-Daumen 60%ig vor, wie's in etwa geht. Wenn man zudem Vergleiche von booleschen Ausdrücken mit bool-Literalen für illegal erklärt (was nicht der geringste Verlust ist), ist man schon fast bei pi-mal-Daumen 95%. Keine dieser Techniken hängt sich an der Syntax oder "Verwechselungsgefahren" auf, sondern ist völlig unabhängig von der konkreten Syntax sinnvoll und hilfreich.
--77.5.186.209 22:45, 6. Aug. 2013 (CEST)
- Vielen Dank für die Auseinandersetung der Sachverhalte an dieser Stelle ! Ich versuche, sachlich zu antworten:
- Die Verwechslungsgefahr ist Bestandteil der bis heute andauernden Geschichte von Programmiersprachen. Aber leider (zu Lasten der sowohl der Entwickler als auch der Anwender) wird C immernoch häufig benutzt, insbesondere bei hardwarenahen Implementierungen.
- Der Abschnitt kann sehr gerne verbessert und ergänzt (oder umbenannt) werden, zum Beispiel durch den Hinweis, dass manche Compiler helfen können, solche Programmierfeheler zu entdecken oder das strukturierte Programmiersprachen solche Fehlermöglichkeiten ausschließen.
- Natürlich ist mit "Relation" der Operator gemeint - mir war gar nicht bewust, dass es im Deutschen anders als im Englischen "relation" und "relational operator" nicht synonym verwendet werden (sollen), aber ich finde die Differenzierung und Präzisierung sehr gut und habe das im Artikel bereits entsprechend geändert.
- --Bautsch (Diskussion) 10:16, 7. Aug. 2013 (CEST)