vergesst C++ ...
-
Ben04 schrieb:
ChockoCookie schrieb:
ich würde mir eine Basisklasse für 2^n bauen und dann davon Klassen ableiten lassen für 2^n+1 und dann von dieser Klasse wiedreum eine weitere Klasse ableiten. Naja eh ein komisches Beispiel :p.
Ich würde eher Traits nehmen.
Ich würde eher zu einer Policy basierten Lösung hin tendiren.
Ja, klar. Sorry, ich hab das verwechselt (nur die Namen
)
Ben04 schrieb:
Also kann man sich auch bei Python in den Fuß schießen und zwar ganz gewaltig!
Klar, in welcher Sprache kann man das nicht? Du kannst davon ausgehen, dass man in jeder Sprache Funktionen schreiben kann, die nicht ihren Zweck erfüllen.
Nur ob man das als Schwäche der Sprache werten darf ist fraglich.Ben04 schrieb:
Ich kenne keine Situation wo das von dir beschriebene Verhalten angebracht wäre.
Ich kann mir dafür keine Situation vorstellen, in der man einen solchen Fehler unabsichtlich machen würde. Und wenn, würde man ihn sofort herausfinden.
Ben04 schrieb:
Mit C oder C++ wäre dir das nicht passiert.
Ich habe ja gesagt, man muss in Python auch achtgeben. Aber die Sprache ist so gedacht, dass Typen nicht wichtig sind (ein Ziel der Objektorintierung). Stattdessen werden Methoden einfach durch den Namen bestimmt, ohne vorher Vererbungsmodelle erstellen zu müssen.
Allerdings kannst du sehr wohl bestimmen welchen Typ ein Objekt hat und von welchen Eltern es abgeleitet ist, nur musst du es meißtens nicht, weil du auf abstrakterer Ebene programmierst.
-
Also 27 Seiten mir jetzt durchzulesen, ist echt hart.
Die erste tuts auch.
Also Programmieren muss schon bissl schwierig sein, wie+
soll man denn sonst andere beeindrucken?
Dann kann ja bald jeder sein Windows selbst schreiben *lol*
-
volkard schrieb:
aber warum programmierst du nicht in basic?
Weil BASIC eine hoffnungslos veraltete Sprache ist, die ursprünglich entwickelt
wurde, damit Nicht-Programmierer leichter Programmieren lernen können.
Wenn ich mit einem nicht-proprietären BASIC-Dialekt schneller Software würde schreiben können, die genauso gut elegant,
wartbar, erweiterbar und verstehbar ist wie Python-Software, würde ich
BASIC nehmen. Augenblicklich scheint mir aber Python die bessere Wahl zu sein.Im Ggs. zu BASIC (und auch C++) enthält Python Objektorientierung nicht als Add-on, sondern als Grundlage.
falls du das beantworten kannst, weißte auch, warum ich nicht in python programmiere.
Du wirst gute Gründe dafür haben. Ich sage ja nicht, daß alles in Python
programmiert werden sollte, aber andererseits sehe ich auch nicht, warum
Dinge, die man ebensogut in Python wie in C++ herstellen könnte, nicht in
Python mit all den damit verbundenen Vorteilen programmiert werden.
Tradition spielt hier sicher eine gewisse Rolle - es dauerte ja auch lange,
bis COBOL weitgehend verschwunden ist, obwohl es mancherorts heute noch
benutzt wird.
-
O'Rakl schrieb:
Ben04 schrieb:
Also kann man sich auch bei Python in den Fuß schießen und zwar ganz gewaltig!
So, wie denn ? Ich habe noch nie ein Python-Programm abstürzen sehen.
Schlimmstenfalls stoppt die PVM mit Fehlermeldung/Exception und Zeilenangabe.Genau das ist ja das Problem! Erstens wird von Compiler Schwachsinn übersetzt und zweitens knallt es noch nicht einmal at runtime. Erst wenn der Kunde da sitzt und den Fall value = 1 durchspielt, den man vorher ja natürlich in den Betatests vergessen hat, kommen ganz merkwürdige Resultate raus.
Eine Sprache die es zulässt, dass Schwachsinn wüten kann ohne dem auch nur eine Schranke vorzuschieben lässt den nun einmal Programmier leicht sich selbst in den Fuß schießen. Das Gefährliche ist ja, dass er es noch nicht einmal merkt.
O'Rakl schrieb:
Ich kenne keine Situation wo das von dir beschriebene Verhalten angebracht wäre. Mit C oder C++ wäre dir das nicht passiert.
Bei generischen Algorithmen ist die Ein- und Ausgabe von Datentypen,
die erst zur Laufzeit fest liegen, nicht nur Gang und Gäbe, sondern
sogar Prinzip. In Python ist das nur so einfach, dass es jeder nutzen kann,
wogegen in C++ zur Nutzung von RTTI und STL ein Vorwissen im Umfang eines halben Informatik-Grundstudiums praktisch vorausgesetzt wird.In braucht man in C++ dafür weder STL noch RTTI. Templates schaffen das ohne Runtimeoverheat. Aber das ist ja nicht das Thema, da es sich in dem Beispiel nicht um einen generischen Algorithmus handelt ist alles was du diesbezüglich gesagt hast hinfällig.
Wieso sind generischen Algorithmen eigentlich auch in Codeform? Die müssten doch auch buildin sein da das ja nur Vorteile hat.
O'Rakl schrieb:
Wäre auch besser angebracht als Vergleich da man in Pyhton ja auch nur ein Konstrukt hat das für alle Situation herhalten muß.
Die Verbindung von Einfachheit und Allgemeinheit ist eben wahre Eleganz. Das ist in der Mathematik nicht anders als bei Programmiersprachen.
Halleluja! In der Mathematik geht es darum ans Ziel zu kommen, wie ist eigentlich egal. Bei Software ist das "wie" aber das Haupinteresse.
ChockoCookie schrieb:
Also kann man sich auch bei Python in den Fuß schießen und zwar ganz gewaltig!
Klar, in welcher Sprache kann man das nicht? Du kannst davon ausgehen, dass man in jeder Sprache Funktionen schreiben kann, die nicht ihren Zweck erfüllen.
Nur ob man das als Schwäche der Sprache werten darf ist fraglich.Dann sind wir uns ja einig, dass O'Rakls Argument, dass Phyton iditonsicher ist nicht weiter hält.
ChockoCookie schrieb:
Ich kann mir dafür keine Situation vorstellen, in der man einen solchen Fehler unabsichtlich machen würde. Und wenn, würde man ihn sofort herausfinden.
Ich schon : Primzahlenzerlegung. 1 wird sonder behandelt also hat man dann
def foo(value): if (value==1): return [1]; else: /* code */
Ich brauch nur die [] zu vergessen und fertig ist der Lack. Gut vielleicht kann man auch sagen 1 habe keine Primzahlenzerlegung aber das eigentliche Problem dürft klar sein.
O'Rakl schrieb:
Du wirst gute Gründe dafür haben. Ich sage ja nicht, daß alles in Python programmiert werden sollte,
Das vestehst du also unter "Vergesst C++"?
O'Rakl schrieb:
Dinge, die man ebensogut in Python wie in C++ herstellen könnte,
kann man in C++ oder Python schreiben da es ja keinen Vorteil bringt.
O'Rakl schrieb:
Python mit all den damit verbundenen Vorteilen programmiert werden.
Bisher hast du mir noch keinen einzigen klar gemacht. Also nochmal wieso sollte ich C++ vergessen und auf Python wechseln?
-
O'Rakl schrieb:
Ben04 schrieb:
Also kann man sich auch bei Python in den Fuß schießen und zwar ganz gewaltig!
So, wie denn ? Ich habe noch nie ein Python-Programm abstürzen sehen.
Schlimmstenfalls stoppt die PVM mit Fehlermeldung/Exception und Zeilenangabe.ähem und was macht c++ da großartig anders? es kracht auch mit exception und zeilenangabe falls code und debuginformationen verfügbar sind
-
Sovok schrieb:
O'Rakl schrieb:
Ben04 schrieb:
Also kann man sich auch bei Python in den Fuß schießen und zwar ganz gewaltig!
So, wie denn ? Ich habe noch nie ein Python-Programm abstürzen sehen.
Schlimmstenfalls stoppt die PVM mit Fehlermeldung/Exception und Zeilenangabe.ähem und was macht c++ da großartig anders? es kracht auch mit exception und zeilenangabe falls code und debuginformationen verfügbar sind
Übersetzt es nicht einmal.
std::list<boost::any>foo() { return 1; }
-
wie? mit python kann ich auch
asdfghj
schreiben und es kommt keine fehlermeldung?
-
Weil's einfach so schön passt: klick
-
O'Rakl schrieb:
So, wie denn ? Ich habe noch nie ein Python-Programm abstürzen sehen.
Schlimmstenfalls stoppt die PVM mit Fehlermeldung/Exception und Zeilenangabe.Was ist für dich denn der Unterschied zwischen "abstürzen" und "Schlimmstenfalls stoppt die PVM mit Fehlermeldung/Exception"?
O'Rakl schrieb:
Im Ggs. zu BASIC (und auch C++) enthält Python Objektorientierung nicht als Add-on, sondern als Grundlage.
Also ein gewisses komödiantisches Talent muss man ihm ja durchaus zugestehen.
Übrigens, C++ enthält Objektorientierung auch als Grundlage.
-
Ein paar Nachteile hat der C++-Weg mit den Libs allerdings schon. Und weil o'rakl sie nicht nennt ...:
Der ganze Schmus (also z.B. std::vector) wird jedesmal neu übersetzt. Das kostet Compilezeit und die ist in C++ z.T. wirklich nicht mehr lustig. Hinzu kommt, dass es kein anständiges Modulkonzept gibt und jede übersetzungseinheit jedesmal xxx Zeilen Headercode neu mitübersetzt. Vorkompilierte Header etc. bringen zwar was, lösen aber das Problem nicht. Ein compiler, der wie in Java den Code während der eingabe übersetzt und eine IDE, die mir die Fehler dann - wie in ner Text-Verarbeitung - unterringelt, ist so nicht zu machen. In C++ freu ich mich wie ein kleines Kind, wenn die Codevervollständigung die richtigen hints gibt.
Übliche Tricks, abhängigkeiten zwischen Übersetzungseinheiten zu vermeiden (forward-Deklaration) funzen nicht mehr, wenn man mit smart_ptr arbeitet. Da muss nämlich die Definition des verpackten Typs bekannt sein, damit der Dtor aufgerufen werden kann. Gut, dann kann ich mit pimpl arbeiten, aber das verdoppelt die Tipparbeit für die Definition der Schnittstelle, eine Schnittstellenänderung wird gleich noch unangenehmer und unübersichtlicher etc.. Das alles heist, dass ich mich neben sauberer Modellierung in der Sprache auch noch einen Haufen sachen kümmern muss, damit mir nicht jeder Compilerlauf, während ich grad Unit-Tests mache und da und dort Fehler ausbessere ne viertelstunde kostet. Und auch 3 Minuten sind eigentlich viel zu viel.Ein weiterer Nachteil ist die Arbeit mit dem Debugger. Welcher Debugger kann mir einfach mal schnell den Inhalt eines list<int>-Objekts anzeigen? Ganz zu schweigen von map<string, shared_ptr<Foo> >. Das schaffen die Werkzeughersteller bisher nichtmal für die STL-Konstrukte.
mE kann man C++ z.T. schon vorwerfen, dass es nicht so produktiv ist, wie andere Sprachen. Das liegt aber nicht an den Eigenschaften der Sprache an sich (mögliche Konstrukte, Einschränkungen oder Freiheiten), sondern
an mangelnder Unterstützung durch Werkzeuge bzw. daran, dass es die Sprache offensichtlich schwer macht, gute Werkzeuge zu entwickeln.Das Argument, dass boost nicht zählt, weil es nicht zum Standard gehört, ist me übrigens nichtig. Boost lässt sich auf den verbreiteten Plattformen auf denen es einen vernünftigen standardkonformen Compiler gibt, übersetzen. Auf exotischen Plattformen zwar vielleicht nicht, aber da gibts dann auch keine python-Implementierung
-
Ben04 schrieb:
Genau das ist ja das Problem! Erstens wird von Compiler Schwachsinn übersetzt und zweitens knallt es noch nicht einmal at runtime. Erst wenn der Kunde da sitzt und den Fall value = 1 durchspielt, den man vorher ja natürlich in den Betatests vergessen hat, kommen ganz merkwürdige Resultate raus.
Es knallt auch in Python zur runtime, wenn du eine Methode aufrufst, die der Typ nicht unterstützt.
Ausserdem hast du auch in C++ genügend Möglichkeiten Fehler einzubauen, die du ohne ausreichende Tests übersiehst.Ben04 schrieb:
In braucht man in C++ dafür weder STL noch RTTI. Templates schaffen das ohne Runtimeoverheat. Aber das ist ja nicht das Thema, da es sich in dem Beispiel nicht um einen generischen Algorithmus handelt ist alles was du diesbezüglich gesagt hast hinfällig.
Ja, aber auch für Templates muss der Typ zur Laufzeit feststehen.
Die einzige Chance, die du hast in C++ dynamische Typisierung zu betreiben, sind Virtuelle Funktionen. Und das ist im Vergleich zu Python doch sehr begrenzt.Ben04 schrieb:
Dann sind wir uns ja einig, dass O'Rakls Argument, dass Phyton iditonsicher ist nicht weiter hält.
Natürlich sind wir das. Ich finde es in der Tat schwer, neben ihm Python zu verteidigen, da einiges was er sagt irrelevant / nicht haltbar ist. Womit er aber nicht alleine ist.
Ben04 schrieb:
ChockoCookie schrieb:
Ich kann mir dafür keine Situation vorstellen, in der man einen solchen Fehler unabsichtlich machen würde. Und wenn, würde man ihn sofort herausfinden.
Ich schon : Primzahlenzerlegung. 1 wird sonder behandelt also hat man dann
def foo(value): if (value==1): return [1]; else: /* code */
Ich brauch nur die [] zu vergessen und fertig ist der Lack. Gut vielleicht kann man auch sagen 1 habe keine Primzahlenzerlegung aber das eigentliche Problem dürft klar sein.
Schon, aber sowas würde man sofort bemerken (wie gesagt), da die Python runtime excellente Fehlerinformationen liefert.
Ben04 schrieb:
Bisher hast du mir noch keinen einzigen klar gemacht. Also nochmal wieso sollte ich C++ vergessen und auf Python wechseln?
Die Gründe wieso ich Python mag sind:
- Die unglaublich mächtigen Sachen, die du mit der Sprache anstellen kannst und der daraus folgende hohe Abstraktionsgrad. Stell dir vor, C++ hätte eine RTTI, in der wirklich alles über das betreffende Objekt steht und du könntest sogar einiges davon ändern.
- Die umfangreiche Standard Bib
- List Comprehensions: [i+5 for i in myList]
-
Ja, aber auch für Templates muss der Typ zur Laufzeit feststehen.
Die einzige Chance, die du hast in C++ dynamische Typisierung zu betreiben, sind Virtuelle Funktionen. Und das ist im Vergleich zu Python doch sehr begrenzt.Aber mit std::list<int> kann ich halt sagen, dass da einfach nur ints drin sein dürfen. Und mit std::listboost::any kann ich sagen, dass da alles rein darf. Und mit std::list<boost::variant<int, string> >, dass da ints und strings reindürfen. Genau das ist der Vorteil der statischen Typisierung. Die dynamische Typisierung nimmt mir die Möglichkeit dieser Festlegung.
Ein bisschen mehr dynamik (rtti a la reflexions) würden natürlich trotzdem nicht schaden.
-
Die unglaublich mächtigen Sachen, die du mit der Sprache anstellen kannst und der daraus folgende hohe Abstraktionsgrad. Stell dir vor, C++ hätte eine RTTI, in der wirklich alles über das betreffende Objekt steht und du könntest sogar einiges davon ändern.
Toll. Sowas braucht man aber nicht.
-
Toll. Sowas braucht man aber nicht.
Du vielleicht nicht. Aber wenn Du was mit interprozesskommunikation machen willst, Deployment zur Laufzeit etc.. Dann brauchst Du es. Und eine 'general-purpose-Language' wie C++ es ist, sollte sowas durch die Sprache unterstützen.
Wenn O'rakl mit solchen Sachen kommen würde, dann könnte man ihm ja recht geben ...
-
groovemaster schrieb:
Was ist für dich denn der Unterschied zwischen "abstürzen" und "Schlimmstenfalls stoppt die PVM mit Fehlermeldung/Exception"?
Ganz einfach: Im letzteren Fall stürzt nur eine *virtuelle* Maschine ab.
Dabei entstehen weder Schäden am Speicher noch am Dateisystem.Groovemaster schrieb:
Also ein gewisses komödiantisches Talent muss man ihm ja durchaus zugestehen.
Die aber auch nicht, das muß der Neid Dir lassen
Groovemaster schrieb:
Übrigens, C++ enthält Objektorientierung auch als Grundlage.
So ein Käse.
C++ ist ein um OOP-Elemente erweitertes C und C ist bekanntlich keine objektorientierte Sprache. ursprünglich hieß C++ ja "C with
classes", was meinen Standpunkt beweist. C++ ist keine native OO-Sprache,
im Ggs. etwa zu Smalltalk oder Ruby.
-
O'Rakl schrieb:
Ganz einfach: Im letzteren Fall stürzt nur eine *virtuelle* Maschine ab. Dabei entstehen weder Schäden am Speicher noch am Dateisystem.
wie willste denn mit deiner anwendung in c++ durch nen absturz schäden am speicher oder dem dateisystem machen?
tip: es geht nicht.
langsam nervt diese ausgeburt der unwissenheit.
-
kartoffelsack schrieb:
Toll. Sowas [RTTI nur mehr] braucht man aber nicht.
Du vielleicht nicht. Aber wenn Du was mit interprozesskommunikation machen willst, Deployment zur Laufzeit etc.. Dann brauchst Du es.
wir schicken texte. schlimmstenfalls eine silple folge von zeilen mit name=wert. erklär doch mal schnell, warum das nicht geht.
-
kartoffelsack schrieb:
Vorkompilierte Header etc. bringen zwar was, lösen aber das Problem nicht.
warum lösen die das problem nich? die header werden dann schliesslich nur einmal übersetzt
kartoffelsack schrieb:
In C++ freu ich mich wie ein kleines Kind, wenn die Codevervollständigung die richtigen hints gibt.
probier mal visual assist x... macht n deutlich besseren job als die standardvervollständigung
-
volkard schrieb:
wie willste denn mit deiner anwendung in c++ durch nen absturz schäden am speicher oder dem dateisystem machen?
tip: es geht nicht.Oho
Ein Amok laufendes C++-Programm kann den Speicher so zumüllen, daß das OS
den Prozeß abbrechen muß. Eine "access violation"-Meldung weist auch auf eine versuchte Beschädigung (natürlich nicht im Hardware-Sinne, sondern im
Sinne der Speicher-Integrität) des Speichers hin. Ein Pointer, der durch Programmfehler auf falsche Adressen zeigt, und dabei einen Befehlsstring wie "del $" in "del *"
verändert, kann das Dateisystem ebenso beschädigen wie ein durch ein überlaufendes Array veränderter Return-Stack, auf dem sich solche Daten befinden.Dein Vertrauen in die Sicherheit der PC-Technik ehrt Dich, aber etliche
Sicherheitslücken, die auf überlaufenden C-Arrays und überschriebenen Returnstacks basieren, sprechen da eine etwas andere Sprache.langsam nervt diese ausgeburt der unwissenheit.
Papperlapapp
-
Offtpic:
Ich hab mir auf Optimizers Rat hin C# 3 mal angesehen und wurde überzeugt. Die erste Version war ja irgendwie mehr eine Testsprache oder so, jedenfalls nichts tolles. Die zweite hat versucht die groben Fehler auszubügeln. Mit der dritten haben sie es jetzt endlich geschaft ne ordentliche Sprache draus zu machen.Ich denke ich werde umsteigen.