 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Stefan Ram Guest
|
Posted: Thu Aug 31, 2006 6:51 pm Post subject: Re: Einführung in C(++) für Benutzer anderer Sprachen? |
|
|
"kanze" <kanze@gabi-soft.fr> writes:
| Quote: | Ich denke nicht. Das Problem mit Schildt ist meistens, dass was
er schreibt falsch ist. Es funktionniert zwar mit einem
Compiler, heute, stosst aber an den Regeln der Sprache,
|
"The fact that the program works has no relevance."
(Bartosz Milewski)
Ein paar Erklärungen zu diesem Thema finden sich auch in:
http://www.purl.org/stefan_ram/pub/formal_abstrakt_de |
|
| Back to top |
|
 |
Stefan Ram Guest
|
Posted: Thu Aug 31, 2006 7:32 pm Post subject: Re: Einfuehrung in C(++) fuer Benutzer anderer Sprachen? |
|
|
ram (AT) zedat (DOT) fu-berlin.de (Stefan Ram) writes:
| Quote: | Ihr redet aneinander vorbei, da du eine andere Bedeutung von
'Objekt' verwendest als Stefan.
Ich bemühe mich in dieser Runde darum, die Bedeutung der
C++-Spezifikation zugrundezulegen.
|
In den 50er Jahre, vor der objektorientierten Programmierung
und C, hatte das Wort "Objekt" ja auch schon eine Bedeutung.
Einmal in der Sprachwissenschaft ("Subjekt", "Prädikat",
"Objekt"), aber auch in der Philosophie.
Nach meinem Sprachgefühl bedeutet "Objekt" im allgemeinen
Sinne das, von dem man mit einer Sprache sprechen kann.
Man kann sich beispielsweise vorstellen, daß eine einfache
Sprache (Ursprache) ein Wort für Dinge ("Stein", "Fell") und
Tiere ("Hase", "Wolf"), aber noch keine Wörter für Satzteile
("Subjekt", "Prädikat") hat. Dann wären diese Satzteile
Entitäten, da sie ja benutzt werden und somit existieren, aber
keine Objekte dieser Sprache.
Insofern ist es bedauerlich, daß das Wort "Objekt" sowohl von
C++ als auch der objektorientierten Programmierung "überladen"
wurde, weil es dadurch in seinem ganz allgemeinen Sinne
weniger verfügbar ist, wenn man über C++ spricht. Somit
ist es nun dreifach überladen (Sprachphilosophie,
objektorientierte Programmierung und C++).
Ein anderer, sehr allgemeiner, Begriff, der mit einer gewissen
Frechheit in einer formalen Sprache stark spezialisert wurde,
ist die "Entität" in XML. Wenn man nun mit XML Entitäten im
philosophischen Sinne modelliert (was man tatsächlich mit
einem XML-Element im allgemeinen dauernd tut), kann es auch zu
Mißverständnissen kommen, wenn man dann mit diesem Begriff
darüber sprechen will.
Ich werden in meinen "C++-Lehrgangkriterien" demnächst bei
"object" einen Hinweis darauf einfügen, daß mein Standpunkt
in dieser Frage umstritten ist. |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Thu Aug 31, 2006 8:52 pm Post subject: Re: Einfuehrung in C(++) für Benutzer ander er Sprachen? |
|
|
Stefan Ram wrote:
| Quote: | Jörg Barfurth <usenet05 (AT) barfurth (DOT) de> writes:
Ja. Aber es gibt durchaus mehr als eine C++-Terminologie. Die
Terminologie des Standards ist nicht dieselbe wie die, die meist
verwendet wird, um über C++-Programmierung zu sprechen.
In den meisten Runden des Usenet zu Programmiersprachen, die
ich kenne, folgt man der Terminologie der Sprachspezifikation.
Ich dachte bis vor kurzem, dies sei auch in dieser Runde so
üblich.
|
Dennoch hat die Entwicklung wesentlich mehr Aspekte als nur Dinge so
umzusetzen, dass sie ISO 14882 entsprechen. Für den Entwurf einer
Objekt(!)-orientierten Anwendung kann man gut und gerne Terminologie
verwenden, die in ISO 14882 nicht oder anders vorkommt. Zum Beispiel ist
eben eine UML-Aggregation ein bisschen was anderes als ein 'aggregate'
in C++-speak.
| Quote: | Dies ist allerdings keine vollständige Definition. Nicht jede
"region of storage" ist ein Objekt. Und, vornehm oder nicht, es
tatsächlich eine Eigenschaft die für Programmierer - zumal
Neulinge - ziemlich irrelevant ist.
Dein erster Satz stimmt. Aber der zweite ist mir überhaupt
nicht nachvollziehbar. Anfänger benutzen Variablen, und
Variablen sind Namen für Objekte. Wie kann das für Neulinge
"irrelevant" sein?
|
Wer schrieb hier was von Namen?
Der ganze C++-Standard ist voll von Definitionen von Eigenschaften
verschiedener Objekte und Objektarten. Beispielsweise beschreibt 10.3
das Verhalten von virtuellen Funktionen in polymorphen Objekten. Oder
Kapitel 11 beschreibt den Zugriffsschutz. Das sind alles Aspekte eines
C++-Objektes, die in einem Kurs wichtig sind. Dem ausgerechnet die
Definition "ein Objekt ist ein Byteklops" vorzuziehen, nur weil sie im
Kapitel 1 steht, ist mir irgendwie nicht eingängig.
| Quote: | Ich denke, auch ausführliche Kurse in C++ sollten im
Allgemeinen nicht als Ziel haben, dass man die Norm
selbstständig lesen kann.
Die Norm bietet mir eine umfassende und halbwegs konsistente
(bewährte) Terminologie für C++ an. Ich habe nicht die Mittel,
um meine eigene Terminologie aufzustellen. Es ist für mich
daher am einfachsten und sichersten, die Normterminologie zu
übernehmen. Dies sichert auch am ehesten die terminologische
Verträglichkeit verschiedener Texte über C++ untereinander.
|
Deswegen würdest du auch nie auf die Idee kommen, Begriffe wie "Köpfe",
"Meßfunktionen" oder "Vorverarbeiterdirektiven" zu verwenden, nicht
wahr? :->
Stefan |
|
| Back to top |
|
 |
Stefan Ram Guest
|
Posted: Fri Sep 01, 2006 2:27 am Post subject: Re: Einfuehrung in C(++) fuer Benutzer anderer Sprachen? |
|
|
Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
| Quote: | Dennoch hat die Entwicklung wesentlich mehr Aspekte als nur Dinge so
umzusetzen, dass sie ISO 14882 entsprechen. Für den Entwurf einer
Objekt(!)-orientierten Anwendung kann man gut und gerne Terminologie
verwenden, die in ISO 14882 nicht oder anders vorkommt. Zum Beispiel ist
eben eine UML-Aggregation ein bisschen was anderes als ein 'aggregate'
in C++-speak.
|
Das mag sein: Anderes Thema - andere Terminologie.
Ich spreche erst einmal von den Situationen, in denen
es (nur) um die Programmiersprache C++ geht.
| Quote: | Dein erster Satz stimmt. Aber der zweite ist mir überhaupt
nicht nachvollziehbar. Anfänger benutzen Variablen, und
Variablen sind Namen für Objekte. Wie kann das für Neulinge
"irrelevant" sein?
Wer schrieb hier was von Namen?
|
Der anonyme Feigling versteckt sich hinter einem "ISO-Komitee":
»A variable is introduced by the declaration of an object.
The variable's name denotes the object.«
ISO/IEC 14882:2003(E), 3, p4
| Quote: | Dem ausgerechnet die Definition "ein Objekt ist ein Byteklops"
vorzuziehen, nur weil sie im Kapitel 1 steht, ist mir irgendwie
nicht eingängig.
|
Das eine ist die Definition, das andere sind weitere Eigenschaften
und Verwendungen des so definierten Begriffs.
Ich ziehe sie nicht vor, sondern sie gilt gemeinsam mit allen
anderen Aussagen des Normdokuments.
| Quote: | Deswegen würdest du auch nie auf die Idee kommen, Begriffe wie "Köpfe",
"Meßfunktionen" oder "Vorverarbeiterdirektiven" zu verwenden, nicht
wahr? :-
|
Wenn Teilnehmer meiner Kurse eine Lehrveranstaltung in
Englisch wünschten, wäre ich dazu bereit. Sonst ist die
Frage der Übersetzung oder Nichtübersetzung noch eine weitere,
die aber erst einmal von der Frage, was man nun mit "object"
meint, abgekoppelt werden kann, da sich diese Frage auch im
Englischen stellte. |
|
| Back to top |
|
 |
kanze Guest
|
Posted: Fri Sep 01, 2006 6:29 pm Post subject: Re: Einführung in C(++) für Benutzer anderer Sprachen? |
|
|
Stefan Ram wrote:
| Quote: | "kanze" <kanze@gabi-soft.fr> writes:
Ich denke nicht. Das Problem mit Schildt ist meistens, dass was
er schreibt falsch ist. Es funktionniert zwar mit einem
Compiler, heute, stosst aber an den Regeln der Sprache,
"The fact that the program works has no relevance."
(Bartosz Milewski)
|
Die Tatsache, dass ein Programm scheint zu funktionnieren, heißt
lange noch nicht, dass es immer funktionniert. Es gibt einen
Unterschied zwischen Schein und Sein.
(Ich habe dieses Problem in der letzten Zeit meinstens mit
Multithreading gesehen. Trifft aber auch anderswo aus.)
Wenn es darum geht, bewußt unportablen Programme zu schreiben,
weil die Portabilität nicht zu den Anforderung gehört, habe ich
nichts dagegen. Ich tue es auch, und 99% meines heutigen
C++-Code geht davon aus, dass int mindestens 32 Bits enthält.
Wenn man es bewußt macht. Das ist wichtig. Und wenn ich auf
andere Garantien stützen: die Sparc-Architektur garantiert
mindestens 32 Bits, Posix macht eine Menge Garantien. Wenn es
nur um ein zufälliges Verhalten meines aktuellen Compiler geht,
dagegen, die sich in der nächsten Version ändern kann, oder
sogar, wenn ich eine höhere Stufe Optimierung anfordere...
(Typischer Beispiel dafür -- ich weiß nicht, ob ihn in Schildt
vorkommt -- sind Aussage wie: »Funktionsparameter werden von
rechts nach links ausgewertet«.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Jörg Barfurth Guest
|
Posted: Sat Sep 02, 2006 4:45 am Post subject: Re: Einfuehrung in C(++) für Benutzer ander er Sprachen? |
|
|
Stefan Ram schrieb:
| Quote: | Jörg Barfurth <usenet05 (AT) barfurth (DOT) de> writes:
Ja. Aber es gibt durchaus mehr als eine C++-Terminologie. Die
Terminologie des Standards ist nicht dieselbe wie die, die meist
verwendet wird, um über C++-Programmierung zu sprechen.
In den meisten Runden des Usenet zu Programmiersprachen, die
ich kenne, folgt man der Terminologie der Sprachspezifikation.
Ich dachte bis vor kurzem, dies sei auch in dieser Runde so
üblich.
|
Ich halte es für sinnvoller meine Terminologie so zu wählen, dass der
Adressat meiner Aussagen diese verstehen kann.
Bei der Beantwortung der Frage eines "Benutzers anderer Sprachen" (siehe
Betreff) der einen Zugang zu C++ sucht, der ihm das Abbilden von
C++-API-Dokumentationen auf seine anderen Sprachen ermöglich - und zwar
ohne dass ein tiefer Einstieg in C++ erforderlich ist - halte ich die
Verwendung dieser sehr spezialisierten Terminologie für ungeeignet.
| Quote: | Dies ist allerdings keine vollständige Definition. Nicht jede
"region of storage" ist ein Objekt. Und, vornehm oder nicht, es
tatsächlich eine Eigenschaft die für Programmierer - zumal
Neulinge - ziemlich irrelevant ist.
Dein erster Satz stimmt. Aber der zweite ist mir überhaupt
nicht nachvollziehbar. Anfänger benutzen Variablen, und
Variablen sind Namen für Objekte. Wie kann das für Neulinge
"irrelevant" sein?
|
Auch für das Verständnis von Variablen ist nur relevant das sie Namen
für Objekte sind und nicht dass sie damit auch Namen für
Speicherbereiche sind. Sie sind eben nicht Namen für beliebige
Speicherbereiche, sondern nur für einige die Objekte beherbergen.
Ich muss allerdings zugeben, dass der von dir so hervorgehobene Aspekt
dann praktisch relevant ist, wenn es um das Verständnis von Zeigern
geht, da das Konzept von Speicheraddressen hier doch wesentlich ist.
Darüber hinausgehende Anwendungen, bei denen etwa noch die
Repräsentation von Objekten in ihrem Speicherbereich eine Rolle spielt,
sind für viele Programmierer selten - und für Neulinge eigentlich nie
relevant.
| Quote: | Ihr redet aneinander vorbei, da du eine andere Bedeutung von
'Objekt' verwendest als Stefan.
Ich bemühe mich in dieser Runde darum, die Bedeutung der
C++-Spezifikation zugrundezulegen.
|
Du legst allerdings in dieser Diskussion nur einen Bruchteil dieser
Bedeutung zugrunde. Der definierende Absatz auf den du dich immer
beziehst, macht noch mehr definierende Aussagen über Objekte, die mE
hier gleichrangig sind, die aber für Programmierer, zumal Neulinge
wesentlich wichtiger zum Verständnis des C++-Objektkonzepts sind[*].
Zum Beispiel werden dort noch folgende Eigenschaften erwähnt:
- Ein Objekt hat einen Typ.
- Ein Objekt wird erzeugt [durch ...]
- Die Eigenschaften eines Objekts werden bei der Erzeugung bestimmt.
- Ein Objekt hat [...] eine Lebensdauer
- Ein Objekt kann einen Namen haben.
- Manche Objekte sind polymorph
Ich halte all diese Eigenschaften für verständnisrelevanter für jemanden
wie den OP. Allerdings halte ich diese Ebene des Begriffsdefinierens
immer noch für unangebracht für eine oberflächliche "Einfuehrung in
C(++) für Benutzer anderer Sprachen", wie sie der OP wünschte.
[*] Für Menschen, die andere Programmiersprachen kennen und grundlegende
Kenntnisse über die Arbeitsweise von Computern und Computerprogrammen
haben, ist es beim Kennenlernen des C++-Objektbegriffs bald klar, das
ein Objekt während der Programmausführung in einem Speicherbereich
repräsentiert ist, auch ohne dass dies explizit oder definitorisch
erläutert wird.
| Quote: | Im Programmieralltag, erlebe ich es aber extrem selten, dass
diese Bedeutung verwendet wird: Meist sprechen Leute von
int-Variablen, -Membern, etc. oder einem "int auf dem Heap".
Was alles nicht genau das gleiche ist wie ein int-Objekt.
|
Richtig.
| Quote: | Sonst habe ich nichts gegen die Verwendung der Bezeichnung
"int-Variable", aber nicht jedes int-Objekt ist eine
int-Variable.
|
Den allgemeinen Begriff 'int-Objekte' benötige ich im Alltag allerdings
fast nie. Wenn ich über konkrete Objekte spreche, dann kann ich idr
einen der og konkreteren begriffe verwenden.
| Quote: | Man braucht ihn auch da nicht unbedingt. Wenn 'Objekt' droht
mit dem OOP-Begriff zu kollidieren ("int-Objekte gibt es in
Smalltalk aber nicht in C++"), dann ist 'int-Lvalue' potentiell
präziser als dein 'int-Objekt'.
"Linkswert" ist ja nun auch wieder nicht derselbe Begriff wie
ein "Objekt".
|
Aber ein praktisch relevanterer für Objekte mit denen ich gewisse Dinge
tun kann.
| Quote: | Das folgt schon daraus, dass dieses Thema nahtlose Übergänge
sowohl zur allgemeinen oder OOP-Programmierung als auch zur
legalistischen C++-Sprachdefinition hat.
Es ist eine Sprachdefinition, in der man manchmal
Informationen schneller findet als in Büchern und in der
manchmal Dinge sogar einfacher erklärt sind als in Büchern.
|
.... wenn man mit ihrem Aufbau und Terminologie vertraut ist.
| Quote: | Deine Zitate enthalten keine vollständigen Definitionen der Begriffe
'object' (C++) oder 'variable' (Java). Daher ist der Schluss, den du aus
der Gleichheit der teilweisen Definitionen ziehst, unzulässig.
Ich behaupte keine vollständige Identität, aber eine
näherungsweise Entsprechung ist offensichtlich.
|
Keinesfalls. Auch in Java halte ich es für eine wesentliche
definitorische Eigenschaft einer Variablen, dass sie einen Namen hat[+],
während eben nicht jedes C++-Objekt benannt ist. Andererseits sind
Exemplare von Klassentypen eine der wichtigsten Arten von Objekten in
C++, während eine Java-Variable eben keinen strukturierten Datentyp
haben kann, sondern höchstens eine Referenz auf einen solchen.
[+] Wenn dies nicht zutrifft, dann halte ich den Begriff für irreführend.
- Jörg |
|
| Back to top |
|
 |
Stefan Ram Guest
|
Posted: Sat Sep 02, 2006 8:11 am Post subject: Re: Einfuehrung in C(++) für Benutzer anderer Sprachen? |
|
|
Jörg Barfurth <usenet05 (AT) barfurth (DOT) de> writes:
| Quote: | Ich halte es für sinnvoller meine Terminologie so zu wählen, dass der
Adressat meiner Aussagen diese verstehen kann.
|
Das mag dann möglich sein, wenn Du diesen kennst. Bei einem
Text, der sich an mehrere Leser richtet, wird dies aber nicht
immer möglich sein.
| Quote: | Auch für das Verständnis von Variablen ist nur relevant das sie
Namen für Objekte sind und nicht dass sie damit auch Namen für
Speicherbereiche sind.
|
"Daß sie Namen für Objekte sind" ist ja erst verständlich,
wenn man sich unter einem "Objekt" auch etwas vorstellen kann.
| Quote: | Ich muss allerdings zugeben, dass der von dir so hervorgehobene
Aspekt dann praktisch relevant ist, wenn es um das Verständnis
von Zeigern geht, da das Konzept von Speicheraddressen hier
doch wesentlich ist.
|
Ein "Speicher" ist etwas, in dem man etwas "speichern" kann.
Die fundamentale Defintion "an object is a region of storage"
sagt, daß ein Objekt ein Stück Speicher ist, also daß man in
einem Objekt etwas speichern kann. Zusammen mit "an object has
a type" bedeutet dies, daß man in einem Objekt einen Wert
speichern kann.
Von Adressen ist hier noch keine Rede. Ein Fach in einem Regal
oder ein Parkplatz ist in der Alltagswelt ebenfalls "a region
of storage", darunter kann sich jeder etwas vorstellen. Das
ist nicht besonders abstrakt oder schwierig zu verstehen.
| Quote: | Darüber hinausgehende Anwendungen, bei denen etwa noch die
Repräsentation von Objekten in ihrem Speicherbereich eine Rolle
spielt, sind für viele Programmierer selten - und für Neulinge
eigentlich nie relevant.
|
Das kommt bei "an object is a region of storage" und "an
object has a type" ja auch noch gar nicht vor.
| Quote: | Du legst allerdings in dieser Diskussion nur einen Bruchteil dieser
Bedeutung zugrunde. Der definierende Absatz auf den du dich immer
beziehst, macht noch mehr definierende Aussagen über Objekte, die mE
hier gleichrangig sind, die aber für Programmierer, zumal Neulinge
wesentlich wichtiger zum Verständnis des C++-Objektkonzepts sind[*].
Zum Beispiel werden dort noch folgende Eigenschaften erwähnt:
- Ein Objekt hat einen Typ. [...]
|
Die kann man aber besser verstehen, wenn man erst einmal weiß,
daß da von einem Stück Speicher die Rede ist. Die Autoren der
ISO-Norm haben sich auch schon etwas bei der Reihenfolge der
Sätze gedacht.
Das ist wie:
- Ein Hund ist ein Säugetier.
- Ein Hund hat vier Beine.
- Ein Hund kann laute akustische Signale erzeugen.
Wenn man den ersten Satz zuerst erfährt, kann man die weiteren
Sätze besser einordnen und verstehen. Auch gilt der erste Satz
alleine weiterhin, wenn man die anderen streicht. Der erste
Satz ist für sich alleine bereits eine nützliche Information,
wenn jemand bisher Hunde nicht kennt, selbst wenn er die
anderen Sätze nicht erfahren sollte. Wenn man aber nur die
beiden letzten Sätze kennt, könnte man sich auch einen
Lautsprecher auf vier Holzbeinchen vorstellen.
| Quote: | [*] Für Menschen, die andere Programmiersprachen kennen und
grundlegende Kenntnisse über die Arbeitsweise von Computern und
Computerprogrammen haben, ist es beim Kennenlernen des
C++-Objektbegriffs bald klar, das ein Objekt während der
Programmausführung in einem Speicherbereich repräsentiert ist,
auch ohne dass dies explizit oder definitorisch erläutert wird.
|
Wir wollen ja hier nun kein Quiz spielen, bei dem die Natur
von Objekten erraten werden soll. Wir können ruhig gleich am
Anfang verraten, daß ein Objekt ein Stück Speicher ist.
| Quote: | Den allgemeinen Begriff 'int-Objekte' benötige ich im Alltag
allerdings fast nie. Wenn ich über konkrete Objekte spreche,
dann kann ich idr einen der og konkreteren begriffe verwenden.
|
"object" ist für mich ein sehr konkreter Begriff.
| Quote: | Aber ein praktisch relevanterer für Objekte mit denen ich
gewisse Dinge tun kann.
|
"object" ist für mich allerdings "praktisch relevant".
(Beispiele nannte ich.)
| Quote: | Es ist eine Sprachdefinition, in der man manchmal
Informationen schneller findet als in Büchern und in der
manchmal Dinge sogar einfacher erklärt sind als in Büchern.
... wenn man mit ihrem Aufbau und Terminologie vertraut ist.
|
Ich bin das zum großen Teil nicht, kann aber trotzdem oft
relativ schnell etwas darin finden. Einfach mit der
Textsuchfunktion nach dem Stichwort suchen: Das kann jeder,
und es liefert erstaunlich oft eine verständliche Antwort.
| Quote: | Keinesfalls. Auch in Java halte ich es für eine wesentliche
definitorische Eigenschaft einer Variablen, dass sie einen Namen hat[+],
|
Da ich den relevanten Teil der Java-Spezifikation hier schon
zweimal zitiert hatte, besteht eigentlich kein Grund mehr
dafür dies zu vermuten, Ihr müßtet ja nur dieses Zitat zur
Kenntnis nehmen. So muß ich es nun noch einmal erklären:
| Quote: | [+] Wenn dies nicht zutrifft, dann halte ich den Begriff für irreführend.
|
Ja, es trifft nicht zu.
Wenn man in Java beispielsweise mit »new int[ 3 ]« eine
int-Reihung erzeugt, so enthält diese drei namenlose
int-Variablen.
»An array object contains a number of variables.«
http://java.sun.com/docs/books/jls/third_edition/html/arrays.html
Analog in C++:
»An object of array type contains a contiguously allocated
non-empty set of N sub-objects of type T.«
ISO/IEC 14882:2003(E), 8.3.4
In Java enthalten Reihungen "Variablen" und in C++ "Objekte"
(jeweils mit der Terminologie der betreffenden Sprache gesagt.)
(Diese Stelle in der C++-Norm fand ich übrigens - wie
beschrieben - mit der Textsuchfunktion in deutlich weniger als
einer Minute, das wäre genauso gegangen, wenn ich diese Norm
heute zum ersten Mal verwendet hätte.)
Du empfindest den Java-Begriff "Variable" vielleicht als
"irreführend", weil Du vielleicht mehr die C++-Begriffe
gewohnt bist. Andererseits empfindest Du den C++-Begriff
"object" vielleicht auch als irreführend, weil Du dabei eher
an ein "object" der "objektorientierten Programmierung"
denkst. Wo finden wir eigentlich das Dokument oder die
Sprache, in dem bzw. in der alle diese Begriffe (Variable,
Objekte, ...) so definiert sind, wie es Dir als richtig oder
"nicht irreführend" erscheint? |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sat Sep 02, 2006 4:52 pm Post subject: Re: Einfuehrung in C(++) fuer Benutzer anderer Sprachen? |
|
|
Stefan Ram wrote:
| Quote: | Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
Dennoch hat die Entwicklung wesentlich mehr Aspekte als nur Dinge so
umzusetzen, dass sie ISO 14882 entsprechen. Für den Entwurf einer
Objekt(!)-orientierten Anwendung kann man gut und gerne Terminologie
verwenden, die in ISO 14882 nicht oder anders vorkommt. Zum Beispiel ist
eben eine UML-Aggregation ein bisschen was anderes als ein 'aggregate'
in C++-speak.
Das mag sein: Anderes Thema - andere Terminologie.
Ich spreche erst einmal von den Situationen, in denen
es (nur) um die Programmiersprache C++ geht.
|
Solche Situationen gibt es meiner Meinung nach nur sehr selten. Zum
Beispiel, wenn man einen Compiler implementiert oder reine Syntax
erklärt. Wenn man in einem Kurs (hoffentlich) auch das "Warum" erklärt,
ist man schon wieder "zwischen den Welten".
| Quote: | Dein erster Satz stimmt. Aber der zweite ist mir überhaupt
nicht nachvollziehbar. Anfänger benutzen Variablen, und
Variablen sind Namen für Objekte. Wie kann das für Neulinge
"irrelevant" sein?
Wer schrieb hier was von Namen?
Der anonyme Feigling versteckt sich hinter einem "ISO-Komitee":
»A variable is introduced by the declaration of an object.
The variable's name denotes the object.«
ISO/IEC 14882:2003(E), 3, p4
|
Darum ging es aber in diesem Teilthread gar nicht. Hier ging es um
Objekte, nicht um Variablennamen.
| Quote: | Dem ausgerechnet die Definition "ein Objekt ist ein Byteklops"
vorzuziehen, nur weil sie im Kapitel 1 steht, ist mir irgendwie
nicht eingängig.
Das eine ist die Definition, das andere sind weitere Eigenschaften
und Verwendungen des so definierten Begriffs.
Ich ziehe sie nicht vor, sondern sie gilt gemeinsam mit allen
anderen Aussagen des Normdokuments.
|
Eine Definition hat meines Wissens derart gestaltet zu sein, dass sie
das definierte Objekt komplett beschreibt. Meine Wikipedia-CD "Frühjahr
2005" meint z.B.
# Eine Definition [Etymologie weggelassen] ist die genaue Bestimmung
# eines Begriffes durch Beschreibung und/oder Erklärung seines Inhalts.
(der aktuelle englische WP-Artikel klingt ähnlich, der aktuelle deutsche
WP-Artikel ist etwas geschraubter).
Damit ist "ein Objekt ist ein Byteklops" bestenfalls Teil der
Definition. Es steht auch nirgends in der Norm, dass das eine komplette
Definition sein soll. Vielmehr werden halt alle Eigenschaften eines
Objekts aufgezählt, und diese ergeben zusammengefasst die Definition.
Ein Lehrbuchautor muss sich dann die didaktisch günstigen Teile für den
Einstieg raussuchen. Für mich gehört "ein Objekt ist ein Byteklops" da
nicht dazu.
| Quote: | Deswegen würdest du auch nie auf die Idee kommen, Begriffe wie "Köpfe",
"Meßfunktionen" oder "Vorverarbeiterdirektiven" zu verwenden, nicht
wahr? :-
Wenn Teilnehmer meiner Kurse eine Lehrveranstaltung in
Englisch wünschten, wäre ich dazu bereit. Sonst ist die
Frage der Übersetzung oder Nichtübersetzung noch eine weitere,
|
Von "Dies sichert auch am ehesten die terminologische Verträglichkeit
verschiedener Texte über C++ untereinander." kann dann aber eben keine
Rede mehr sein.
Stefan |
|
| Back to top |
|
 |
Stefan Ram Guest
|
Posted: Sat Sep 02, 2006 5:59 pm Post subject: Re: Einfuehrung in C(++) fuer Benutzer anderer Sprachen? |
|
|
Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
| Quote: | Ich spreche erst einmal von den Situationen, in denen
es (nur) um die Programmiersprache C++ geht.
Solche Situationen gibt es meiner Meinung nach nur sehr selten.
|
Situationen, in denen C++ das Thema ist, sind Texte über C++.
| Quote: | Wenn man in einem Kurs (hoffentlich) auch das "Warum" erklärt,
ist man schon wieder "zwischen den Welten".
|
Um das Warum zu erklären, muß man zu C++ noch eine Motivation
finden, und diese ergibt sich letztendlich immer aus
Anwendungen (Problemen).
| Quote: | Darum ging es aber in diesem Teilthread gar nicht. Hier ging es um
Objekte, nicht um Variablennamen.
|
Wenn man über C++ spricht, braucht man meist Variablen,
insbesondere in Anfängerkursen. Und dann will man sagen,
/wofür/ eine Variable ein Name ist.
| Quote: | Eine Definition hat meines Wissens derart gestaltet zu sein, dass sie
das definierte Objekt komplett beschreibt.
|
So komplett, wie nötig, um es für den Gebrauch zu
identifizieren.
| Quote: | Meine Wikipedia-CD "Frühjahr 2005" meint z.B. # Eine
Definition [Etymologie weggelassen] ist die genaue Bestimmung #
eines Begriffes durch Beschreibung und/oder Erklärung seines
Inhalts.
Damit ist "ein Objekt ist ein Byteklops"
|
Das steht so nicht im Standard.
| Quote: | bestenfalls Teil der Definition.
|
Da ich nicht weiß, welche Aussage des Standards Du meinst,
kann ich sonst leider nichts dazu sagen.
| Quote: | Vielmehr werden halt alle Eigenschaften eines Objekts
aufgezählt, und diese ergeben zusammengefasst die Definition.
|
Wobei diese Definition dann aber noch redundante Eigenschaften
enthalten könnte, die man durch Vereinfachung eliminieren sollte.
| Quote: | Ein Lehrbuchautor muss sich dann die didaktisch günstigen Teile für den
Einstieg raussuchen. Für mich gehört "ein Objekt ist ein Byteklops" da
nicht dazu.
|
Da sich die von Dir angegebene Aussage so nicht in der
ISO-Norm findet, kann ich zu diesem Satz nichts sagen. |
|
| Back to top |
|
 |
Jörg Barfurth Guest
|
Posted: Sun Sep 03, 2006 5:08 am Post subject: Re: Einfuehrung in C(++) für Benutzer ander er Sprachen? |
|
|
Stefan Ram schrieb:
| Quote: | Auch für das Verständnis von Variablen ist nur relevant das sie
Namen für Objekte sind und nicht dass sie damit auch Namen für
Speicherbereiche sind.
"Daß sie Namen für Objekte sind" ist ja erst verständlich,
wenn man sich unter einem "Objekt" auch etwas vorstellen kann.
|
Womit wir wieder bei dem Punkt sind, dass ich "ist ein Speicherbereich"
(oder in Stefan's laxerer Übersetzung "ist ein Byteklops") nicht für die
wichtigste solche Vorstellung halte.
| Quote: | Ich muss allerdings zugeben, dass der von dir so hervorgehobene
Aspekt dann praktisch relevant ist, wenn es um das Verständnis
von Zeigern geht, da das Konzept von Speicheraddressen hier
doch wesentlich ist.
Ein "Speicher" ist etwas, in dem man etwas "speichern" kann.
|
Wenn du C++-Normterminologie verwenden willst, dann ist Speicher
(storage) in dem Absatz vor der von dir hervorgehobenen Objektdefinition
definiert und besteht aus 'bytes'. Die in einem Programm verwendete
storage existiert im verfügbaren memory, besteht also ebenfalls aus
einer finiten Anzahl zusammenhängender Bytefolgen.
| Quote: | Die fundamentale Defintion "an object is a region of storage"
sagt, daß ein Objekt ein Stück Speicher ist, also daß man in
einem Objekt etwas speichern kann.
|
Eine "region of storage" ist weniger vage als "ein Stück (irgendwie
gearteter) Speicher": es ist ein Gebiet (=Bereich) innerhalb der
erwähnten Bytefolgen. Da ist 'Speicherbereich' die treffendere
Übersetzung und selbst Stefans "Byteklops" kommt dem sehr nahe (vor
allem mit dem Zusatzwissen, dass Objekte tatsächlich zusammenhängende
Speicherbereiche sind).
| Quote: | Zusammen mit "an object has
a type" bedeutet dies, daß man in einem Objekt einen Wert
speichern kann.
|
Dass man (oder die Implementierung) in einem Objekt einen Wert speichern
kann ist in der Tat eine wichtige und grundlegende Vorstellung für
diesen Begriff. Das ist aber etwas ganz anderes als "ein Objekt ist ein
Speicherbereich (oder 'Byteklops')".
| Quote: | Darüber hinausgehende Anwendungen, bei denen etwa noch die
Repräsentation von Objekten in ihrem Speicherbereich eine Rolle
spielt, sind für viele Programmierer selten - und für Neulinge
eigentlich nie relevant.
Das kommt bei "an object is a region of storage" und "an
object has a type" ja auch noch gar nicht vor.
|
Das wird aber unmittelbar impliziert. Dass ein Speicherbereich einen Typ
hat bedeutet eben, dass Werte des Typs darin repräsentiert sind. Deshalb
enthält 1.7/2 ja auch einen Vorwärtsverweis auf 3.9.
| Quote: | Du legst allerdings in dieser Diskussion nur einen Bruchteil dieser
Bedeutung zugrunde. Der definierende Absatz auf den du dich immer
beziehst, macht noch mehr definierende Aussagen über Objekte, die mE
hier gleichrangig sind, die aber für Programmierer, zumal Neulinge
wesentlich wichtiger zum Verständnis des C++-Objektkonzepts sind[*].
Zum Beispiel werden dort noch folgende Eigenschaften erwähnt:
- Ein Objekt hat einen Typ. [...]
Die kann man aber besser verstehen, wenn man erst einmal weiß,
daß da von einem Stück Speicher die Rede ist. Die Autoren der
ISO-Norm haben sich auch schon etwas bei der Reihenfolge der
Sätze gedacht.
|
Dass ein Objekt einen Wert enthält ist in der Tat fundamental für das
Verständnis des Begriffs. Dass dies dadurch realisiert ist, dass ein
Objekt ein Bereich im Speicher ist, ist hingegen nicht wesentlich zum
anfänglichen Kennenlernen des Begriffs.
Der Standard allerdings braucht diese Eigenschaft des Objektbegriffs.
Daher macht es hier Sinn diese Aufgliederung des Objektbegriffs zu wählen.
| Quote: | [*] Für Menschen, die andere Programmiersprachen kennen und
grundlegende Kenntnisse über die Arbeitsweise von Computern und
Computerprogrammen haben, ist es beim Kennenlernen des
C++-Objektbegriffs bald klar, das ein Objekt während der
Programmausführung in einem Speicherbereich repräsentiert ist,
auch ohne dass dies explizit oder definitorisch erläutert wird.
Wir wollen ja hier nun kein Quiz spielen, bei dem die Natur
von Objekten erraten werden soll. Wir können ruhig gleich am
Anfang verraten, daß ein Objekt ein Stück Speicher ist.
|
Was ich meinte ist, dass wenn erläutert wird, dass ein Objekt einen Wert
enthält, es für jemanden mit den beschriebenen Vorkenntnissen schon
intuitiv klar ist, dass dieser Wert im zur Verfügung stehenden
Programmspeicher abgelegt wird.
Hingegen sollte es möglich sein vieles vom C++-Objektbegriff zu
verstehen, ohne das C++ Speichermodell zu verstehen. Letzteres ist aber
nötig um zu verstehen, was ein 'Speicherbereich' ist (nämlich eben ein
'Byteklops').
| Quote: | Keinesfalls. Auch in Java halte ich es für eine wesentliche
definitorische Eigenschaft einer Variablen, dass sie einen Namen hat[+],
Da ich den relevanten Teil der Java-Spezifikation hier schon
zweimal zitiert hatte, besteht eigentlich kein Grund mehr
dafür dies zu vermuten, Ihr müßtet ja nur dieses Zitat zur
Kenntnis nehmen.
|
Da du auch die C++-Objektdefinition in 1.8 nur sehr unvollständig
zitiert hattest, gab es keinen Grund anzunehmen das Zitat der
Java-Spezifikation sei vollständiger.
| Quote: | So muß ich es nun noch einmal erklären:
[+] Wenn dies nicht zutrifft, dann halte ich den Begriff für irreführend.
Ja, es trifft nicht zu.
Wenn man in Java beispielsweise mit »new int[ 3 ]« eine
int-Reihung erzeugt, so enthält diese drei namenlose
int-Variablen.
»An array object contains a number of variables.«
|
Das empfinde ich allerdings tatsächlich als irreführend, da 'variable'
mir sonst bisher (im Progrommierkontext) nur als Bezeichnung für Namen
oder benannte Objekte begegnet ist.
| Quote: | Du empfindest den Java-Begriff "Variable" vielleicht als
"irreführend", weil Du vielleicht mehr die C++-Begriffe
gewohnt bist. Andererseits empfindest Du den C++-Begriff
"object" vielleicht auch als irreführend, weil Du dabei eher
an ein "object" der "objektorientierten Programmierung"
denkst. Wo finden wir eigentlich das Dokument oder die
Sprache, in dem bzw. in der alle diese Begriffe (Variable,
Objekte, ...) so definiert sind, wie es Dir als richtig oder
"nicht irreführend" erscheint?
|
Nirgends. Das kann es gar nicht geben.
Wie bereits gesagt, versuche ich iA eine Terminologie zu finden die mir
die Verständigung mit jemandem ermöglicht. Dazu mag es nötig sein
Begriffe, die in verschiedenen Varianten auftreten, zu klären oder zu
definieren. Dabei hängt meine Begriffsverwendung eben auch vom Gegenüber
ab.
Bei einem Dokument, das sich an eine unbekannte Zielgruppe wendet, ist
das wichtigste, dass ich eine konsistente Terminologie innerhalb des
Dokuments beibehalte. Auch dabei mag die Ausdruckswahl auch von der
erwarteten erweiterten Zielgruppe abhängen. Falls nötig kann man die
gewählten Begriffe auch in einem Glossar im Kontext definieren.
Gruss, Jörg |
|
| Back to top |
|
 |
Stefan Ram Guest
|
Posted: Sun Sep 03, 2006 6:12 am Post subject: Re: Einfuehrung in C(++) fuer Benutzer anderer Sprachen? |
|
|
Jörg Barfurth <usenet05 (AT) barfurth (DOT) de> writes:
| Quote: | Womit wir wieder bei dem Punkt sind, dass ich "ist ein Speicherbereich"
(oder in Stefan's laxerer Übersetzung "ist ein Byteklops") nicht für die
wichtigste solche Vorstellung halte.
|
Die Natur eines Objektes ist es eben, daß man darin
etwas speichern kann.
| Quote: | Wenn du C++-Normterminologie verwenden willst, dann ist
Speicher (storage) in dem Absatz vor der von dir
hervorgehobenen Objektdefinition definiert und besteht aus
'bytes'.
|
Dort wird die Bedeutung von "storage" ohne Definition als
bekannt vorausgesetzt. Dann wird eine Aussage über "the
fundamental storage unit", also die Untergliederung des
"storage", gemacht.
| Quote: | Eine "region of storage" ist weniger vage als "ein Stück
(irgendwie gearteter) Speicher": es ist ein Gebiet (=Bereich)
innerhalb der erwähnten Bytefolgen. Da ist 'Speicherbereich'
die treffendere Übersetzung [...] (vor allem mit dem
Zusatzwissen, dass Objekte tatsächlich zusammenhängende
Speicherbereiche sind).
|
"Stücke" sind ja auch zusammenhängend: Wenn ein Stück Kuchen
zerschnitten wird, dann ist es keines mehr, sondern zwei Stücke.
("Stück" - "eine Einheit bildender Teil eines Ganzen" [Duden])
| Quote: | Dass man (oder die Implementierung) in einem Objekt einen Wert
speichern kann ist in der Tat eine wichtige und grundlegende
Vorstellung für diesen Begriff. Das ist aber etwas ganz anderes
als "ein Objekt ist ein Speicherbereich [...]".
|
"Speicherbereich" sagt, daß man darin etwas speichern kann.
| Quote: | Das kommt bei "an object is a region of storage" und "an
object has a type" ja auch noch gar nicht vor.
Das wird aber unmittelbar impliziert. Dass ein Speicherbereich einen Typ
hat bedeutet eben, dass Werte des Typs darin repräsentiert sind. Deshalb
enthält 1.7/2 ja auch einen Vorwärtsverweis auf 3.9.
|
Man muß das nicht mitlernen. Auch ohne "Adressen" und "Bytes"
ist klar, daß man in einem Stück Speicher etwas speichern
kann, und daß man in einem Speicher mit einem Typ einen Wert
dieses Typs speichern kann. Es ist nicht nötig, zur Erklärung
dieses Sachverhalts, "Adressen" oder "Bytes" heranzuziehen.
| Quote: | Dass ein Objekt einen Wert enthält ist in der Tat fundamental für das
Verständnis des Begriffs. Dass dies dadurch realisiert ist, dass ein
Objekt ein Bereich im Speicher ist, ist hingegen nicht wesentlich zum
anfänglichen Kennenlernen des Begriffs.
|
Das sind zwei verschiedene Formulierungen für den
gleichen Sachverhalt.
| Quote: | Was ich meinte ist, dass wenn erläutert wird, dass ein Objekt einen Wert
enthält, es für jemanden mit den beschriebenen Vorkenntnissen schon
intuitiv klar ist, dass dieser Wert im zur Verfügung stehenden
Programmspeicher abgelegt wird.
|
Genau.
| Quote: | Hingegen sollte es möglich sein vieles vom C++-Objektbegriff zu
verstehen, ohne das C++ Speichermodell zu verstehen.
|
Ja.
| Quote: | Letzteres ist aber nötig um zu verstehen, was ein
'Speicherbereich' ist [...].
|
Das Wort "Speicher" wird in C++ auch nicht definiert. Es ist
aber bereits in der Alltagssprache bekannt als ein Depot, in
das man etwas legen kann, dem man es später wieder entnehmen
kann. Ein "Bereich" ist auch bereits aus der Alltagssprache
soweit bekannt, daß klar ist, daß mit "Speicherbereich" eben
nicht der ganz Speicher gemeint ist, sondern ein Teil davon
(ein Stück).
verbundener Duden:
Speicher - "Vorrichtung [...] zum Speichern von Informationen",
Bereich - "Gebiet von bestimmter Ausdehnung"
http://app.mr-check.de/Mrcheck.php?CL=zeit&SP=Speicher
http://app.mr-check.de/Mrcheck.php?CL=zeit&SP=Bereich
| Quote: | Da du auch die C++-Objektdefinition in 1.8 nur sehr unvollständig
zitiert hattest, gab es keinen Grund anzunehmen das Zitat der
Java-Spezifikation sei vollständiger.
|
Daß noch etwas anderes in der Norm steht, ändert ja nichts
daran, daß die zitierten Aussagen darin stehen. Bei einer
konsistenten Norm kann auch keine weitere Aussage mehr etwas
an den bereits zitierten Aussagen ändern - es kann diese nur
ergänzen, aber ihnen nie widersprechen. Hier reichte das von
mir Zitierte bereits für die von mir ausgeführten Schlüsse aus
- es war nicht nötig, mehr zu zitieren.
Beispiel: Wenn in der Norm steht "Fritz ist ein Hund." und ich
dies zitiere und daraus folgere, daß Fritz ein Säugetier ist,
ist dies zulässig, auch wenn in der Norm noch vieles anderes
über Fritz steht, das ich nicht zitiert habe, was aber für
meine Folgerung gar nicht benötigt wird.
Außerdem sind Dir die Normen zugänglich (jedenfalls die JLS)
und Du kannst selber darin nachlesen. Du bist nicht auf meine
Zitate angewiesen.
| Quote: | Bei einem Dokument, das sich an eine unbekannte Zielgruppe wendet, ist
das wichtigste, dass ich eine konsistente Terminologie innerhalb des
Dokuments beibehalte. Auch dabei mag die Ausdruckswahl auch von der
erwarteten erweiterten Zielgruppe abhängen. Falls nötig kann man die
gewählten Begriffe auch in einem Glossar im Kontext definieren.
|
Es ist ganz schön schwierig selber eine konsistente
Terminologie aufzustellen. Daher ist es - wenn es um C++ geht
- meist eine gute Idee, die Terminologie von ISO/IEC
14882:2003(E) zu übernehmen. |
|
| Back to top |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|