Studie zeigt C als beliebteste Sprache in offenen Projekten
-
volkard schrieb:
Das ordentliche Aufteilen und Zerlegen in Klassen, hat doch nichts mit information hiding zu tun.
"information hiding" in Form von Trennung zwischen (innerer) Repräsentation und (äußerem) Verhalten ist Grundbedingung für Polymorphismus. Alles Andere würde auch dem "message passing" Prinzip widersprechen.
Dies spielt in C++ eine untergeordnete Rolle, schon weil sauberes "message passing" mit seinem Korollar "alles ist ein Objekt" für C++ in unerreichbarer Ferne liegt, aber daß C++ hinsichtlich Paradigmenreinheit/OOP nicht die Maßstäbe setzt, sollte ohnehin klar sein.
-
Für Polymorphismus ist diese Trennung zwar nötig, aber Hiding ist nicht nötig.
Der Rest war unbegründetes Ablästern und bedarf keiner Widerlegung.
-
u-ser_l schrieb:
...schon weil sauberes "message passing" mit seinem Korollar "alles ist ein Objekt" für C++ in unerreichbarer Ferne liegt...
streng genommen könnte man jedes sprache, die message passing mit methodenaufrufen macht, als 'unsauber' ansehen, weil's nur ein 'gosub' in eine prozedur des anderen objekts ist. stell dir vor, du unterhältst dich mit jemanden und während du auf seine reaktion wartest, frierst du ein. sogar herzschlag und atmung stehen still.
-
object-message-passing sollte eigentlich mal eine stark vereinfachte Nachbildung menschlicher Kommunikation sein - direkte Ansprache mit Subjekt-Imperativ-Objekt-Sätzen:
Hans sage 'hallo'
mit object-message-passing-Syntax:
Hans sage: 'hallo'
mit Methoden-Syntax:
Hans.sage('hallo')
Die Idee ist ursprünglich gewesen, daß es zur Kommunikation Mensch/Computer zwei Wege gibt:
a. Mensch paßt seine natürliche Kommunikationsweise dem Computer an
b. Man läßt den Computer seine Kommunikationsweise dem Menschen anpassen
Um nicht mio. Jahre warten zu müssen, daß sich a. entwickelt, entschied man sich bei der Entwicklung der OOP für Plan b.
Aus dem object-message-passing folgen dann die weiteren notwendigen Eigenschaften der OOP wie Polymorphie, information hiding usw.
-
u-ser_l schrieb:
mit object-message-passing-Syntax:
Hans sage: 'hallo'
mit Methoden-Syntax:
Hans.sage('hallo')
^^syntax ist doch ziemlich egal, mir gehts um die beiden varianten synchrones und asynchrones message passing. ersteres sind einfache 'gosubs' und damit statisch und single-CPU-bezogen, können direkt zu maschinencode gemacht werden usw. der asynchrone fall braucht ein laufzeitsystem, objekte sind prozesse und haben eine message-queue. (siehe z.b. sowas wie erlang). sowas finde ich 'natürlicher' als diese methoden-aufruferei. zudem haste damit automatisch unterstützung für multiprozessorsysteme (solche faxen wie OpenMP für C++ sind von vorn herein überflüssig), multitasking-probleme wie race conditions schon auf unterster ebene erscheinen garnicht erst, weil's durch die message-queues entkoppelt ist, usw. wie machts smalltalk eigentlich? synchron oder asynchron?
u-ser_l schrieb:
Aus dem object-message-passing folgen dann die weiteren notwendigen Eigenschaften der OOP wie Polymorphie, information hiding usw.
polymorphie folgt nicht daraus. polymorphie entspringt doch der komponenten-orientierten programmierung. oder nicht?
-
Polymorphie folgt insofern aus obj.-mess'g.-passing, als: ein und dieselbe message kann je nach Klasse des Empfängers verschiedene Bedeutungen haben, sprich: Polymorphie in Form von überladenen Nachrichten bzw Operatoren (= Spezialfall von Nachrichten beim object-mess'g-passing)
@(A)synchronität: message passing ist (zumindest beim klassischen Smalltalk-80) synchron. Es gibt gewisse Steuerungsmöglichkeiten, indem man Blocks verschickt - ein Block wird ja erst in dem Moment ausgewertet, wenn er nachrichten wie value oder value: ... empfängt.
Ich meine gelesen zu haben, daß frühe evtl experimentelle Smalltalk-Versionen vor 80 auf asynchrones message passing aufgebaut waren, kann das aber momentan nicht nachprüfen.
-
Die flexibelste Sprache ist und bleibt (Common) Lisp:
(loop for i from 1 to 10 sum i) ===> 55 (loop for i from 1 to 10 collect i) ===> (1 2 3 4 5 6 7 8 9 10)
Welche andere Sprache bietet einem schon die Möglichkeit eine DSL so schön zu implementieren?
-
Smalltalk!
(1 to: 10) inject: 0 into: [ :sum :item | sum + item ]. => 55 (1 to: 10) collect: [ :item ]. => #(1 2 3 4 5 6 7 8 9 10)
aber die lisp-Versionen sind auch ganz schön ...
-
u-ser_l schrieb:
Smalltalk!
(1 to: 10) inject: 0 into: [ :sum :item | sum + item ]. => 55 (1 to: 10) collect: [ :item ]. => #(1 2 3 4 5 6 7 8 9 10)
aber die lisp-Versionen sind auch ganz schön ...
Das ist doch total kryptisch, da sehe ich jetzt keinen Vorteil gegenüber der LISP-Notation (also der Lisp-Syntax und nicht der DSL von loop).
-
ich formulier's mal um, damit es dem Lisp-Beispiel ähnlicher wird:
(1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ].
was ist daran kryptisch ? Das ist schön und elegant.
-
außerdem ist es in Smalltalk kürzer:
(loop for i from 1 to 10 sum i) (loop for i from 1 to 10 collect i) => 18 Wörter (1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ]. => 16 Wörter
-
u-ser_l schrieb:
ich formulier's mal um, damit es dem Lisp-Beispiel ähnlicher wird:
(1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ].
was ist daran kryptisch ? Das ist schön und elegant.
das ist verdammt schön und elegant. ich hatte mich deshalb damals auch sofort in smalltalk verliebt.
-
u-ser_l schrieb:
(1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ].
was ist daran kryptisch ?
So gut wie fast alles.
-
u-ser_l schrieb:
außerdem ist es in Smalltalk kürzer:
(loop for i from 1 to 10 sum i) (loop for i from 1 to 10 collect i) => 18 Wörter (1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ]. => 16 Wörter
die wörter zu zählen, würde ich mal nicht als maß nehmen. ich finde zum beispiel die syntax von Visual Basic in den OOP-sachen schöner als die von C++. da schreibt man alles sehr langatmig aus und kommt auf sehr sehr viele wörter. trotzdem fließt es mir aus den fingern und ich lese es wie einen roman, während bei C++ sowohl beim schreiben als auch beim lesen oft ein ruckeln zu verzeichnen ist.
-
volkard schrieb:
das ist verdammt schön und elegant. ich hatte mich deshalb damals auch sofort in smalltalk verliebt.
nanu ?
-
u-ser_l schrieb:
volkard schrieb:
das ist verdammt schön und elegant. ich hatte mich deshalb damals auch sofort in smalltalk verliebt.
nanu ?
versteh mich nicht falsch. ich liebe smalltalk nicht. ich mag es nichtmal wirklich. wir haben uns auseinandergelebt, sagt man da wohl. ich mag heute C++, aber ich hasse die syntax von C++. ist wohl sowas wie mit einer klugen toleranten fürsorglichen schönen ehefrau, die stinkefüße hat; Inschallah.
-
Nimm Python.
-
u-ser_l schrieb:
(loop for i from 1 to 10 sum i) (loop for i from 1 to 10 collect i) => 18 Wörter (1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ]. => 16 Wörter
aber die ausgabe fehlt oder?
// scala, mit ausgabe List.range(1,11).foreach(print) // ausgabe: 12345678910 print (List.range(1,11).foldRight(0)(_+_)) // ausgabe: 55
-
;fricky schrieb:
u-ser_l schrieb:
(loop for i from 1 to 10 sum i) (loop for i from 1 to 10 collect i) => 18 Wörter (1 to: 10) inject: 0 into: [ :s :i | s + i ]. (1 to: 10) collect: [ :i ]. => 16 Wörter
aber die ausgabe fehlt oder?
// scala, mit ausgabe List.range(1,11).foreach(print) // ausgabe: 12345678910 print (List.range(1,11).foldRight(0)(_+_)) // ausgabe: 55
Und du meinst C++ wäre kryptisch??
-
1:10 sum (1:10)