Crescent schrieb:
C++ macht mich nach dem Überfliegen eines Tutorials schon wahnsinnig. Keine Garbage Collection, kein Duck Typing, kein anständiges Exception Handling.... überhaupt keine Komfortfeatures. Arrays lassen sich nur mit einem Datentyp füllen, die Größe des Arrays muss vorher angegeben werden. Dynamische Listen existieren nicht einmal. Das was C++ als "dynamisch" bezeichnet ist, dass man zur Laufzeit die statische Größe des Arrays festlegen kann. Ohoho!
Das ist keine Hochsprache. Das ist ein objektorientierter Assembler, ein verdammter!
herrjeh, ein Tutorial "überflogen" und schon ne Meinung
Ja, C gilt als portabler Assembler weil es hardwarenah ist, weil es relativ direkt auf die hardware übersetzt wird und damit keine künstlichen Bremsen drin hat.
Normale Arrays sind tatsächlich ein low-level-Konzept, simple Address-Arithmetik um verflucht schnell auf Werte zugreifen zu können. Damit die Runtime nicht bei jedem Zugriff den Index mit der Array-Grösse vergleichen muss, muss sich natürlich der Programmierer ein paar Gedanken mehr machen. Dadurch wirst du ein besserer Coder und dein Programm wird schneller - oft deutlich schneller!
Bei einem simplen array-geschubse wie der Berechnung der
Edit-Distanz zweier Strings hat meine Version in C++ knapp 10% der Laufzeit einer äquivalenten Java-Version benötigt. 900% overhead für Index-Prüfung und Garbage Collection!
Dazu sind Arrays tatsächlich mächtiger als deine "Komfort"-Objekte. Du kannst mit normalen Arrays wenn du Lust hast auch auf Speicherbereiche zuzugreifen, zu denen eigentlich nichtmal ein Array angelegt wurde - z.B. auf den Inhalt einer mmap()'ed Datei. Weil ein Array eben so trivial definiert ist: eine Folge von Speicherbereichen. Das geht in deinem tollen python nicht, ohne den Dateiinhalt mindestens einmal umzukopieren - was sowohl mehr CPU-Zeit als auch mehr Coding-Aufwand bedeutet.
Und wenn du doch mal ein array brauchst, was deine Zugriffe peinlich genau kontrolliert, Exceptions wirft und sich bei Bedarf vergrössert, dann implementier dir halt schnell eine entsprechende Klasse. Das hat sogar schonmal jemand gemacht, versuch's mal mit std::vector. Gerüchten zufolge soll es auch fertige Listen-Implementierungen geben. Aber nöö, Herr C. schaut sich nur die Standard-C-Features von C89 an und moniert dann, dass C++ im Jahre 2008 keine Listen kann.
Über statische vs. dynamische vs. ententypisierung können wir ewig diskutieren, jedes System hat seine vor- und nachteile. Statische Typisierung ist gut zur Verifikation und code-dokumentation (also bei grösseren Projekten eigentlich nicht wegzudenken), die anderen Varianten sind brauchbar für kurze scripts, rapid prototyping und ähnliches. Wenn du mit duck typing Mist baust fliegt's dir halt erst zur runtime um die Ohren.
Jetzt aus Gewohnheit dem einen gegenüber die anderen Varianten zu verdammen wäre voreilig.
Dass man in Arrays nicht reinschmeissen kann, was man will, sehe ich als Vorteil um gewisse Code-Auswüchse zu verhindern. Hält dich aber niemand davon ab, ein array zu nutzen, was beliebige Objekte aufnehmen kann. Nennt sich dann glaub ich
void *[] - ist bloss weitestgehend nutzlos. In jeder Sprache.
ach ja: Rauchen schadet ihrer Gesundheit.