Der Thread ist zwar schon etwas älter, aber ich bin heute mal zufällig drauf gestoßen und möchte auch meinen Senf dazugeben, da ich das Thema doch sehr interessant finde. Ich werde mich dabei mal auf drei Programmiersprachen konzentrieren: Eine, die ich hasse, eine, die ich mag und eine, die ich liebe.


Sprache, die ich hasse: C/C++

OH GOTT! Ich weiß gar nicht, wo ich anfangen soll. Noch nie hat mir irgendeine technische Sache so viel Kopfzerbrechen bereitet, wie C bzw. C++. Es gibt so vieles, was ich daran hasse, dass ich nichtmal einen Text darüber schreiben will, sondern lieber einfach eine Liste nehme:

  • Fangen wir erstmal bei dem an, was schon des öfteren genannt wurde: Die Speicherverwaltung. Eigentlich ist fehlende Speicherverwaltung durchaus etwas, womit ich leben kann, da meine erste Programmiersprache Pascal war und ich eigentlich schon daran gewöhnt bin, mich selbst darum zu kümmern. Das Problem ist nur, dass das in C/C++ so fucking kompliziert ist und darüber hinaus auch noch jeder blöde Scheiß es erfordert. Am schlimmsten empfand ich hier strings (also ich meien damit char*, weil mit cstrings habe ich nie wirklich gearbeitet). Die Teile sind sowas von unflexibel und es ist quasi unmöglich, damit irgendwelche komplizierteren Operationen durchzuführen, ohne die ganze Zeit Speicher zu reservieren und wieder freizugeben. Und selbst die String-Funktionen aus den Standard-Libraries sind größtenteils eher mittelmäßig und helfen nicht so wirklich weiter.
  • Ein weiterer Kritikpunkt - und vielleicht mein größter - ist die hässliche Syntax. Mal ehrlich: Wenn man jedes mal, wenn man einen Funktionspointer deklarieren will, erst nochmal auf Google nachgucken muss, wie das funktioniert, dann hat eine Programmiersprache eindeutig etwas falsch gemacht. Obwohl ich schon des öfteren Funktionspointer gebraucht habe, weiß ich selbst heute noch nicht aus dem Kopf, wie die funktionieren. Überhaupt ist die Pointer-Syntax in C/C++ eher suboptimal. Man weiß nie so recht, wozu das Reference-Zeichen gerade gehört (z.B. bei so Fällen wie "const* char" vs "const char*") und wenn man structs oder classes hat, die selbst wiederum Pointer enthalten, kommt man irgendwann gar nicht mehr drumherum, tausend Klammern in seinem Code zu verwenden. Da hat es Pascal doch wesentlich besser gemacht. Tatsächlich musste der Dereferencer dafür einfach nur auf die andere Seite gepackt werden. Jedenfalls sind sämtliche Arten von Pointern (also auch Funktionspointer) in Pascal leichter zu deklarieren und zu nutzen.

    Auch hässlich finde ich die Syntax von Type-Casts. Mittlerweile habe ich mich durch C# zwar schon an deren Nutzung gewöhnt, aber zumindest am Anfang musste ich immer Umdenken, als ich sie benutzt habe. Ich war es nunmal von Funktionen gewöhnt, dass immer erst der Funktionsname und dann in Klammern die Paramater kommen, also z.B. "Function(a)". Bei Type-Casts musste das aber natürlich genau umgedreht werden in "(int)a". Das sieht nicht nur hässlich aus und macht den Source Code noch unübersichtlicher, als er eh schon ist, es ist auch noch absolut un-inovativ. Naja, wenigstens hat C++ es später dann ermöglicht, die Type-Casts tatsächlich in Funktionsform (also "int(a)") zu verwenden. Schade, dass C# das dann wieder rausgenommen hat.
  • Weiterhin mag ich an C++ nicht die Header-Files. Was soll deren Nutzen sein? Die erfordern es nur, dass ich alles zweimal schreiben muss. Wenn ich aber mal einen kleinen Forward vergessen oder eine Deklaration an die falsche Stelle packe, spackt der Compiler sofort wieder rum und nichts funktioniert. Absolut unspaßig!
  • Auch recht kompliziert in C/C++ (auch, wenn das wohl teilweise an den IDEs liegen mag) ist das Einbinden von Libraries. Insbesondere dann, wenn man diese vorher auch noch selbst kompilieren muss. Das liegt vielleicht auch daran, dass es einfach so viele Arten von Libraries gibt und dann auch noch so viele Arten, diese einzubinden. Für mich entscheidend sind eigentlich nur dynamische und statische Einbindung. Aber wie viele Versuche es mir alleine hier immer wieder abverlangt, beispielsweise die MinGW-Libraries statisch in mein Programm einzubinden, damit ich einem Freund ein Programm schicken kann oder so. Es ist immer wieder das gleiche: Für das Einbinden der Libraries muss ich mich nach irgendwelchen Anleitungen richten, weil ich es von selbst nicht hinbekomme, und dann, sobald ich einem Freund das Programm schicke, funktioniert da wieder nichts, weil irgendwelche Libraries fehlen, sodass ich dann erstmal wieder suchen muss, wohl der Fehler liegt. Bullshit!
  • Was mir an C++ auch nicht gefällt ist dass es bisher einfach noch keine so wirklich richtig gute IDE dafür gibt. Gut, bisher habe ich nur mit zwei IDEs wirklich viel gearbeitet, nämlich Code::Blocks und Visual Studio. Beide hatten aber größere Defizite und es hat keinen Spaß gemacht, mit ihnen zu arbeiten. Visual Studio ist für C# eigentlich eine grandiose IDE, für C++ ist das aber einfach nur ein verbuggter Haufen Scheiße, der lieber eigene Regeln erfindet anstatt sich an irgendwelche C++-Standards zu halten. Code::Blocks hat da (zumindest meiner Erfahrung nach) wesentlich weniger Bugs und ist dazu noch plattformunabhängig, hat dafür aber auch bei weitem nicht denselben Funktionsumfang. Ich meine mich beispielsweise zu erinnern, dass Debugging in Code::Blocks immer eine recht unangenehme Angelegenheit war und nicht einmal funktioniert hat, wenn man im Pfad zum Projekt irgendwo ein Leerzeichen hatte. Dann wurden selbst Breakpoints einfach übersprungen. Insgesamt ziehe ich Code::Blocks aber trotzdem Visual Studio vor.
  • Unicode-Support. Ich kann es einfach nicht verstehen, dass es selbst zu Zeiten des Internets immer noch so kompliziert ist, ordentlichen Unicode-Support in C++ zu bekommen. Ohne externe Libraries geht da einfach gar nichts. Die paar Funktionen, die in den Standard-Libraries drin sind, unterstützen erstens fast immer nur UTF16 und decken zweitens auch nur Code Points bis FFFF ab. In Zeiten der Internationalität geht sowas einfach gar nicht. Oh, und habe ich schon die Bugs in Visual Studio erwähnt? Visual Studio kann nur Resource Files im UTF16-Format kompilieren. Bei anderen Formaten kommt es zu unsinnigen Fehlermeldungen. Selbst dann, wenn der eigentliche Source Code in UTF8 oder ASCII geschrieben ist. Das ist natürlich besonders praktisch, wenn man, weil man nur die kostenlose Version von Visual Studio benutzt, einen externen Resource Editor benutzt, der natürlich davon ausgeht, dass Source Code und Resource Files bei eurem Projekt im selben Format gespeichert sein sollen und die Resource Files dann automatisch als UTF8 abspeichert, bloß weil euer Source Code in UTF8 gespeichert ist. Das heißt ihr schreibt eure Resource Files entweder direkt manuell in Textform oder ihr müsst jedes mal ihr Format konvertieren, wenn ihr den Resource Editor verwendet habt.


Sprache, die ich mag: Free Pascal

Ähnlich wie R.D. kam ich beim Abitur erstmalig mit Pascal in Berührung. Es war meine erste richtige Programmiersprache, in der ich auch größere und kompliziertere Programme (einschließlich eines Tetris-Klons) geschrieben habe. Was Funktionalität angeht hat Pascal gegenüber C++ eigentlich keine all zu großen Vorteile. Eher sogar ein paar Nachteile. Die Sprachen sind von der Funktionalität her ungefähr auf einem Level. Pascal punktet gegenüber C++ aber definitiv in Sachen Benutzerfreundlichkeit. Die Syntax ist stets sauber und nachvollziehbar und man kann selbst nach mehreren Jahren noch problemlos mit Pascal arbeiten, ohne vorher erstmal ein paar Stunden zu googlen, wie man nochmal X/Y deklariert. Vor allen Dingen die Pointer-Arithmetik ist in Pascal sehr viel sauberer, unkomplizierter und verständlicher, als in C++. Um mal ein Beispiel anzubringen:

Pascal-Version:
Code:
DreifachPointerInt^^^ = 0;
StructPointer1^.StructPointer2^.StructPointer3^.VariableInt = 0;
In C++ sähe das ganze ungefähr so aus:
Code:
*(*(*DreifachPointerInt)) = 0;
(*StructPointer1).(*StructPointer2).(*StructPointer3).VariableInt = 0;

Oder Alternativ bei Structs und Classes:
StructPointer1->StructPointer2->StructPointer3->VariableInt = 0;
Gut. Ich weiß nicht genau, ob die Klammern im ersten Fall wirklich notwendig sind, trotzdem finde ich die Syntax in Pascal sauberer und nachvollziehbarer.

Weiterhin sind in Pascal String-Operationen sehr viel unkomplizierter, als in C. Gut, die unterstützen zwar in der Basis-Version dafür auch nur bis zu 255 Zeichen, dafür muss man sich aber nicht um die Speicherverwaltung kümmern und kann nach Belieben Strings addieren, Strings abschneiden, die Länge von Strings ermitteln, Strings durchsuchen etc.

Und das ganze ist ja nur die Basis-Version von Pascal. Free Pascal ist ja die moderne Variante davon, die konstant weiterentwickelt wird und auch tatsächlich mit modernen Funktionen aufwartet wie Klassen, modernen Datentypen und nativem UTF8-Support. Besonders die neuen String-Typen AnsiString und UTF8String sind eine sinnvolle Weiterentwicklung der Sprache. Sie funktionieren genauso, wie die Strings in der Basis-Version (das heißt man kann genauso problemlos und leicht mit ihnen arbeiten), nutzen aber intern Pointer, sodass sie beliebig lang sein können. Und darüber hinaus gibt es mit lazarus auch noch eine recht gute IDE, die Free Pascal unterstützt.

An und für sich würde ich Free Pascal in lazarus jederzeit C/C++ in Visual Studio oder Code::Blocks vorziehen. Einziges Problem: Das benutzt einfach kein Schwein mehr. Deshalb gibt es für Free Pascal auch kaum gute Ressourcen im Internet, besonders keine guten Libraries. Für meinen Tetris-Klon musste ich beispielsweise die die schon recht veraltete Version 4.2 von Allegro nutzen. Selbst jetzt ist die aktuellste Pascal-Version von Allegro Version 4.4. Für C++ hingegen ist schon seit langer Zeit die deutlich leistungsfähigere und überlegene Version 5 draußen. Das war auch letzten Endes der Grund, weshalb ich mich dafür entschieden habe, C++ zu lernen. Mein Herz hängt allerdings noch sehr an Free Pascal.


Sprache, die ich liebe: C#

Was soll ich dazu noch sagen? Wenn C++ ein Kuchen wäre, dann wäre C# derselbe Kuchen, bloß dass man ausnahmslos alle schlechten Stellen abgeschnitten und den Kuchen anschließend mit Schokolade und Sahne ummantelt hätte. Anders ausgedrückt: C# basiert auf C++, verzichtet aber auf jeglichen Scheiß, der unnötig ist und Programmierer nur frustriert und hat dafür unzählige neue Funktionen. Saubere Syntax, hohe Benutzerfreundlichkeit automatische Speicherverwaltung, keine blöden Header-Files (unter außer ein paar Using-Direktiven auch sonst nichts, was in diese Richtung geht und alles übermäßig verkompliziert), leichte Einbindung von Libraries, sehr flexibles und innovatives Klassen-System, das .NET-Framework, keine Pointer mehr (außer man braucht sie unbedingt), nativer UTF8-Support und nicht zuletzt eine der leistungsfähigsten und besten IDEs überhaupt. Ich denke ich lehne mich nicht zu weit aus dem Fenster, wenn ich behaupte, dass C# so ziemlich das beste ist, was Microsoft jemals geschaffen hat; zumindest für einen Programmierer. Das ist einfach eine Programmiersprache, in der Programmieren Spaß macht und bei der höchstens 5% des Programmierfrusts von der Sprache selbst verursacht werden, während das bei C++ so um die 75% sind.


TL;DR
C++: FFFFFFFFFFUUUUUUUUUUU...
Free Pascal: Me gusta!
C#: BOAH, GEIL!