Post by Patrick RoemerDu hast also ein Ding, dessen Wert Du nicht auslesen kannst,
Ein "Zeiger" *zeigt* auf etwas. Wie er das tut hängt vom Kontext ab. Eine
Adresse ist nur eine mögliche Implementierung für einen Zeiger und diese
kann man auch nur dann auslesen, wenn das die Programmiersprache erlaubt.
Post by Patrick Roemerdas Du
nicht explizit dereferenzieren kannst (bzw. das gar nicht verwendet
werden kann, ohne automatisch und transparent dereferenziert zu werden),
Automatisch und transaprent? Ich muss ganz explizit einen '.' schreiben,
damit das passiert.
Post by Patrick Roemermit dem Du keine Zeigerarithmetik betreiben kannst,
Eine Spezialität von Low-Level-Sprachen wie Assembler und C/C++. Die darauf
basiert, dass man sehr viele Details der internen Repräsentation fest
definiert hat.
Doch: ein Objekt.
Post by Patrick RoemerDie interne Repraesentation von Objekten ist der VM-Implementierung
voellig freigestellt.
Das ist mir aber als Programmierer völig egal, denn ich habe einen Zeiger,
der auf ein Objekt zeigt, außer dem Sonderfall null (s.unten).
Post by Patrick RoemerWas ein Zeiger oder eine Referenz ist, haengt schlicht von der
betrachteten Sprache ab. Um es mit der IMO ganz vernuenftigen
FOLDOC-Definition zu sagen: 'An address, from the point of view of a
programming language. [...] The terms "pointer" and "reference" are
generally interchangable although particular programming languages often
differentiate these two in subtle ways.'
Ja, z.B. C/C++ und Pascal, bei denen eine Referenz nach ihrer
Initialisierung das "Objekt", auf das sie zeigt nicht wechseln und nicht
null/nil/0 sein darf, während ein Zeiger all das kann.
Post by Patrick RoemerWie sieht es also in der speziellen Programmiersprache Java aus? In der
| The reference values (often just references) are pointers to these
| objects, and a special null reference, which refers to no object.
Ich wuerde hier sagen, dass man aufgrund der eher 'flapsigen' Verwendung
des Begriffs unterstellen kann, dass allgemein 'Verweis' und nicht
'Adresse' gemeint ist.
"Pointer" = "Zeiger", also "zeigt" er auf etwas, also "verweist" er auf
etwas. Du argumentierst gerade für die Gegenseite.
Post by Patrick RoemerAber auch wenn man dieser Interpretation nicht
folgen will: Was ist denn dann die Nullreferenz? Offenbar doch kein
Pointer, oder?
Was ein Glück, dass es in C (da gibt es doch Pointer, oder?) keine
Null-Pointer gibt. Da ein Pointer sein Ziel zur Laufzeit ändern kann, kann
es ohne weiteres Bedarf für den Sonderfall geben dass er gerade auf
"Nichts" verweist. Das Standardanfängerbeispiel für die Benutzung von
Pointern ist die Verkettete Liste, da ist es unerlässlich, einen
definierten Null-Pointer zu haben, da dieser das Ende der Liste markiert.
Post by Patrick RoemerIn der VM-Spec (die sich ja nun auch nicht mehr mit der Sprache, sondern
| Values of type reference can be thought of as pointers to objects.
Kann man sich so vorstellen, muss aber wohl nicht - insbesondere, wenn
spaeter darauf hingewiesen wird, dass je nach Implementierung noch ein
'Handle' dazwischenliegen kann.
Auch ein Handle ist ein Pointer, oder warum heißen die Smart-Pointer in der
C++-Standard-Library auto_*ptr*? Das sind auch Handles. Und was ist mit dem
"Counted *Pointer*"-Idiom? Und schreibt der C++-Standard vor, dass Pointer
Speicheradressen beinhalten? Ich glaube nicht, es wird auch nur das
Verhalten definiert.
Post by Patrick RoemerWenn man ansonsten bei Sun sucht, findet man zwar oefter sprachliche
Inkonsistenzen (NPE wurde ja schon angesprochen), aber auch deutliche
Aussagen wie 'Because there are no pointers in Java, [...]', 'Thus, Java
has no pointer data types.', 'Java technology has no pointers. Instead,
all references to allocated storage, which in practice means all
references to an object, are through symbolic "handles".', usw. usf.
Java wurde offensichtlich daraufhin entwickelt, gut bei C++-Entwicklern
anzukommen, da man damit auf eine große Entwicklergemeinde zurückgreifen
konnte, ohne die der Erfolg dieser Sprache nicht zustandegekommen wäre. Da
man bei C++ mit "Pointer" etwas ganz spezielles Verbindet, was ganz
spezielle Probleme mit sich bringt ("dangling pointers"), ist auch die
Dokumentation oft so formuliert, dass die diesbezüglichen Unterschiede
zwischen C++ und Java herausgestrichen werden. Korrekt wären Formulierungen
wie 'Java technology has no pointers like C++.', was aber nicht gerade sehr
lesbar ist.
Bei der Diskussion hier sollte man einmal sehen, was das abstrakte Konstrukt
"Pointer" eigentlich ist, und prüfen, ob sich die Referenzen in Java so
verhalten, dass sie darauf passen. Was dann hinter den Kulissen des
Quellcodes passiert ist dabei völlig egal.
Aus meiner Erinnerung (Praktisch Informatik, Uni Mannheim, 1987) sinngemäß:
- Ein Pointer zeigt auf Daten
- Als Sonderfall kann er auch "nil" sein, dann zeigt er auf nichts
- Mehrere Pointer können auf das selbe Datum zeigen
- Wenn man ein Datum über einen Pointer ändert, sind die Änderungen über
alle Pointer, die darauf zeigen sichtbar
Die Darstellung, die wir damals hatten, waren Kästchen für die Daten, Punkte
für die Pointer und vom Punkt weg einen Pfeil, der auf das referenzierte
Datum zeigt, wenn der Pointer nicht nil ist.
Mit Adressen hat das erst mal nix zu tun und Pointer-Arithmetik kam dabei
auch nicht vor (Beispiele wurden alle in Standard(!)-Pascal programmiert).
Erst beim Kontakt mit C (außerhalb des Studiums) kamen
Implementierungsdetails zum Vorschein wie das, dass Pointer Adressen
speichern.
Gruß,
Martin