Welche Programmiersprache ist die richtige für mich?

Wenn man programmieren lernen möchte, so stellt sich immer die Frage nach der richtigen Programmiersprache. Fragt man in Foren oder in seinem Umfeld herum, so erfährt man vorrangig, welche Programmiersprachen bei den jeweiligen Personen beliebt sind. Dies muss jedoch nicht zwangsläufig die richtige Programmiersprache für Dich sein.

Daher soll auf eine Antwort der Frage hier vollständig verzichtet werden, sondern es soll Dir eher etwas Grundlagenwissen vermittelt werden, damit Du selbst entscheiden kannst, welche Sprache Du lernen möchtest.

Dafür stellen wir mögliche Kriterien auf und geben entsprechend der Kriterien zu einigen Sprachen Informationen. Nicht alle Kriterien müssen für Dich wichtig sein, Du musst für Dich entscheiden, welches Kriterium für Dich welchen Stellenwert hat und wie sich das bei Dir in der näheren Zukunft verändern wird.

Kriterium I: Du als Programmierer

Wichtigstes Kriterium bist Du selbst, lehn Dich zurück und versuche möglichst genau zu definieren, warum und was Du programmieren möchtest.

Eigenschaften, die Du mitbringen solltest

  • Neugierde
    Grundsätzlich solltest Du eine gewisse Neugierde mitbringen, wie Dinge funktionieren.
  • Verständnis für Abläufe
    Du musst in der Lage sein, Handlungen in der richtigen Reihenfolge zu sortieren und aufzuschreiben, wie beispielsweise ein Rezept beim Kochen. Du wirst lernen müssen, Dich ganz klar auszudrücken: Beim Kochen von Spaghetti, setzt man nicht das Wasser auf den Herd, um es zu erhitzen, sondern man füllt das Wasser in einen Topf und setzt den Topf mit dem Wasser anschließend auf den Herd. Computer fragen nicht nach und wundern sich auch nicht, wenn die Küche nass ist, weil das Wasser auf dem Herd nicht stehen blieb und dafür der Herd verglüht, weil kein Topf auf der Platte steht. Computer machen genau das, was Du ihnen befiehlst.
  • Spaß am logischen Denken
    Programmierung ist rein logisch, Du solltest also auch Spaß daran haben, logische Schlussfolgerungen zu ziehen.
  • Frustrationstoleranz
    Programmieren zu lernen ist gar nicht so einfach, es bedeutet viel auszuprobieren und viele Experimente werden nicht das Ergebnis liefern, das Du erwartest. Dann muss man manchmal sehr lange ausprobieren und lesen, bis man verstanden hat, wie es richtig geht. Dann heißt es sich wieder zurückzulehnen und zu gucken, ob man einen Ablauf noch nicht richtig verstanden oder eine falsche Schlussfolgerung gezogen hat.

Deine Motivation zu Programmieren

  • „Programmieren ist cool“
    Programmieren kann sehr viel Spaß machen, doch lass Dir bitte nichts von amerikanischen Fernsehserien vormachen, wo Hacker drei Befehle in den Computer tippen und so mit ihren Programm sämtliche Sicherheitssysteme umgehen. Das hat nichts mit Programmierung oder Informatik zu tun. Programmierung ist eher vergleichbar mit einem aufwendigen Strategiespiel, Knobelspiel oder Puzzle. Zur professionellen Programmierung kann man viele Techniken erlernen, die ein konzentriertes und strukturiertes Vorgehen verlangen. Als Spiel betrachtet, bietet die Informatik viele Wege, die man gehen kann, das Spiel ist beliebig erweiterbar.
    Programmierung ist weniger cooles Hacking, als konzentriertes Puzzlen.
  • „Ich möchte den Computer besser verstehen“
    Wenn Dich der Aufbau von Computern interessiert, solltest Du eine Sprache wählen, die maschinennah zu programmieren ist. Dies sind beispielsweise Assembler, C, C++ oder Pascal/Delphi.
  • „Ich möchte meine Freunde mit 3D Effekten beeindrucken“
    Dein Wissen anzuwenden steht Dir selbstverständlich auch in diesem Bereich frei. Allerdings beginnt niemand mit den Einstieg in 3D-Programmierung. In der Regel beschränkt man sich zunächst darauf, Testprogramme zum Erlernen der Grundkonzepte von Programmierung zu schreiben und das bedeutet vorrangig eher Texte einzulesen und auszugeben. Auch damit kann man nette Dinge machen, bis man allerdings soweit ist, dass man 3D Effekte schreibt, vergeht noch viel Zeit (Jahre). Das solltest Du berücksichtigen; Deine Motivation sollte also aus den 3D Effekten kommen und nicht darin begründet liegen, jemanden zu beeindrucken. Spiele werden häufig in C++ geschrieben, 3D-Effekte lassen sich allerdings auch mit Delphi, C# oder Java erzeugen und darstellen.
  • „Ich habe da eine Idee für ein Programm“
    Sehr gut, mit einem Ziel vor Augen hat man automatisch bereits eine Richtung vorgegeben in die man gehen muss. Mit den nachfolgenden Kriterien kannst Du vielleicht bereits eine geeignete Sprache für Deine Idee finden. Wenn Du weitere Entscheidungshilfen benötigst, beschreibe Deine Idee doch im Forum (Board: Algorithmen und Konzepte) und hole Dir weitere Meinungen ein.
  • „Ich muss es für Beruf oder Schule lernen“
    In dem Fall bekommst Du vermutlich die Sprache auch vorgegeben.

Kriterium II: Lernaufwand

Es gibt Programmiersprachen, die schwer zu erlernen sind und Sprachen, die mit wenig Wissen schnell zu Ergebnissen führen. Gut und effektiv programmieren zu lernen dauert Jahre, aber natürlich ist es nicht so, dass man in dieser Zeit keine Software entwickeln könnte. Wer schnell sichtbare Ergebnisse benötigt, sollte sich mit Sprachen auseinandersetzen, die bereits viel fertige Funktionalität mitbringen. Diese Funktionalität kann man vergleichsweise einfach erreichen und man man muss auch nicht wissen, wie die Sprache das selbst implementiert hat.

Zu den Sprachen, die viel eingebaute Funktionalität mitliefern gehören (unter anderem) Basic, C#, Java, PHP und Python. Diese Funktionalität ist bei C#, Java und Python in der Regel in sogenannten Frameworks untergebracht, die ein Rahmenwerk um die Sprache bilden, das man mit einfachen Anweisungen der Sprache hinzufügen kann, während in Basic und PHP die Funktionalität sofort erreichbar ist. C und C++ liefern eher wenig Funktionalität mit. Sie müssen in der Regel explizit installiert, der Compiler muss konfiguriert und im Quelltext in die Sprache eingebunden werden. Das ist in C#, Java und Python ähnlich üblich. Das klingt kompliziert, aber wenn man es ein paar Mal gemacht hat, ist es Routine. Beim Kochen entspricht es etwa dem Einkauf einer neuen Küchenmaschine - auch die muss erstmals aufgebaut und in die Steckdose gesteckt werden, bevor man sie verwenden kann. Um die ersten Grundzüge zu lernen, bringen jedoch alle Sprachen alles Erforderliche sofort mit.

Besonders C und C++ haftet der Ruf an, schwer erlernbar zu sein, während Python den Ruf hat, als Einsteigersprache gut geeignet zu sein. Meiner Erfahrung nach, lassen sich alle Sprachen vergleichbar lernen, da das Paradigma hinter allen hier vorgestellten das Gleiche ist: Imperativ. Das bedeutet, dass Befehle wie in einem Rezept aufeinander folgen und in der Reihenfolge abgearbeitet werden. Es gibt weitere Paradigmen, also Programmiersprachen, die anderen Konzepten folgen. Diese Sprachen sind jedoch im Alltag eher Exoten und seltener anzutreffen. Weiterhin setzen sie eine etwas andere Denkweise beim Programmieren voraus. Die meisten Anfänger verstehen bereits, was es bedeutet ein Rezept abzuarbeiten bzw. aufzuschreiben. Die imperative Programmierung (zu der auch die objektorientierte Programmierung zählt), ist bisher das mit Abstand erfolgreichste Konzept und für einen Einstieg sehr gut geeignet. In allen imperativen Sprachen werden Bedingungen beschrieben, wie: „Wenn Nudeln vorhanden sind dann koche Nudeln, sonst koche Reis.“ Entsprechend dieser Auswertung wird auf das eine oder andere Teilrezept ausgewichen.

In C/C++ sind mehr Dinge erlaubt als in anderen Sprachen und man muss damit klar feststellen, dass C/C++ dadurch gerade zu Beginn erlaubt, viel mehr Fehler zu machen. Die Möglichkeit mehr Fehler zu machen bedeutet in der Regel, dass auch mehr Fehler gemacht werden. Dies wird dann häufig so ausgelegt, dass die Sprache schwerer zu erlernen ist. Das Erlernen einer Programmiersprache ist jedoch nicht nur das Erlernen dessen, was man tun darf, sondern eben auch, was man nicht tun darf.

Schlussendlich muss man in allen Sprachen die gleiche Menge an Informationen lernen, während C/C++ den Anfänger manchmal verzweifeln lässt, weil alle Fallen offen liegen und man bereits schon mit kleinen Testprogrammen auch mal hereinfällt. Andere Sprachen verstecken die Fallen besser. Dies kann sich durchaus als Nachteil erweisen, weil eben nicht so offensichtlich ist, wo man als fortgeschrittener Programmierer mit einem größeren Programm nun reingefallen ist. Man muss in allen Sprachen lernen, was man darf und was man nicht darf. Es ist zu überlegen, ob man sich zutraut, am Anfang viele Fallen in kleinen und einfachen Programmen zu lernen oder ob man erst Erfolge sehen möchte, um später in größeren Programmen die Fallen kennen zu lernen.

Neben den Grundkonzepten, die alle Sprachen unterstützen, unterstützen PHP (ab Version 5), Python, C#, C++ und Java auch die objektorientierte Programmierung. Generische Programmierung wird von C# (ab Version 2), C++ und Java (ab Version 1.5) unterstützt, automatische Codegenerierung über Templates wird unter den alltäglichen Sprachen nur von C++ bereitgestellt.

Hier bedeuten mehr Möglichkeiten natürlich auch mehr Lernaufwand. Wer die Möglichkeiten nicht benötigt, muss sie aber auch nicht lernen.

Kriterium III: Erweiterbarkeit

Sprachen wie Basic und PHP haben bereits viele Befehle eingebaut, so dass der Zugriff auf diese Befehle ohne weiteren Aufwand durch den Programmierer möglich ist. Dies ist natürlich ein Vorteil beim Lernaufwand, da alle eingebauten Befehle sofort zur Verfügung stehen. Derartige Sprachen sind jedoch oftmals nur schwierig oder gar nicht erweiterbar. Basic ist zum Beispiel meist gar nicht, oder nur umständlich erweiterbar.

Sprachen wie C#, Java und Python haben relativ einfache Mechanismen, um weitere Befehle hinzuzufügen und im Internet finden sich reichlich Erweiterungen.

Auch bei C/C++ sind Erweiterungen möglich. Tatsächlich sind die meisten Erweiterungen sogar für C und C++ entwickelt worden. Jedoch ist die Verwendung einer solchen Erweiterung für einen Einsteiger beim ersten Mal oftmals schwierig. Im Gegensatz zu anderen Sprachen bringt C/C++ von Haus aus eher wenig Funktionalität mit. Die Einbindung neuer Funktionalität ist sehr flexibel, aber im Vergleich zu anderen Sprachen auch etwas aufwendiger.

Besonders Java und Python sind in ihren Möglichkeiten jedoch eingeschränkt. Hier ist es später notwendig, Erweiterungen zu schaffen, die über den Horizont der Sprache hinausgehen. In diesem Fall landet man nahezu zwangsläufig wieder bei C/C++.

Kriterium IV: Syntax und Semantik: Die Sprache

Basic gehört zu den ältesten Programmiersprachen, die Syntax ist aus heutiger Sicht sehr eingeschränkt. Um die ersten Schritte zu machen, reicht Basic, allerdings wenn man wirklich programmieren möchte, wird man relativ schnell auf eine modernere Syntax (der Aufbau des Programmquelltextes, die richtige Reihenfolge der Befehle und Satzzeichen usw.) wechseln. Es gibt auch objektorientierte Basics, allerdings gehört das nicht zu den ursprünglichen Konzepten für die Basic konzipiert wurde. Die Semantik (die Bedeutung des Programmquelltextes) in Basic ist teils nicht eindeutig, was von Einsteigern allerdings in der Regel nicht bemerkt wird (als Beispiel wird '=' zum Vergleich benutzt, sowie als Zuweisungsoperator). Eine nicht eindeutige Semantik führt dazu, dass die gleiche Anweisung an unterschiedlichen Stellen unterschiedliche Aufgaben erledigt.

In der Syntax haben Sprachen, wie Java und C# sehr viel von C/C++ übernommen und auch PHP sieht man an, dass reichlich Anleihen bei C/C++ gemacht wurden. Pascal und Delphi stammen nicht direkt von C/C++ ab, sie haben jedoch mit Algol60 ebenfalls eine gemeinsame Wurzel.

Deutlich besser als Basic aufgebaut sind Sprachen wie Java, C# oder Python und Delphi. Sie erlauben und erwarten Programmierung nach modernen Standards, die natürlich ebenfalls gelernt werden wollen.

C/C++ schlägt hier ebenfalls etwas aus der Art. Während die Sprache zum einem ausdrucksstärker als alle vorgenannten Sprachen ist, verlangt C/C++ auch mehr Verständnis vom Entwickler, damit sich dieser exakt ausdrücken kann. Die C/C++ Syntax bietet deutlich feinere Ausdrucksmöglichkeiten und erlaubt es so, auf alle Dinge detailliert Einfluss zu nehmen und so optimiertere Programme herzustellen, als es mit allen vorgenannten Sprachen möglich ist. Die Möglichkeiten von C++ gehen hier jedoch soweit, dass selbst die wenigsten professionellen C++-Programmierer sie durchgehend alle präsent im Kopf haben. Der Detailreichtum ist also im Alltag nicht erforderlich, aber gibt einem noch Handlungsspielraum, falls man ihn benötigt, wo andere Programmiersprachen ihn nicht mehr bieten können.

Neben Programmiersprachen, die Quelltexte übersetzen, gibt es auch sogenannte „Visuelle“-Programmiersprachen. Daher kommt auch der Name des Visual Studios bzw. Visual C++. Wirklich „visuell“ sind diese Compiler aber nicht - mehr als einen Dialog kann man hier nicht zusammenklicken. Bei visuellen Programmier“sprachen“ werden die Anweisungen gewissermaßen gezeichnet. Ein Beispiel für eine visuelle Sprache ist Labview, die im wissenschaftlichen Bereich verwendet wird. Ihr Einsatz ist allerdings selten. Sie haben sich im Alltag nicht durchgesetzt, da die Tastatur bisher das schnellste Eingabemedium für komplexe Eingaben ist. Seit etwa 2000 wird die Beschreibungssprache UML als Standard für zukünftige Programmierung ausgerufen. Davon konnte ich bisher nichts feststellen, UML wird bisher eher zur Planung und Dokumentation verwendet.

Kriterium V: Lesbarkeit

Lesbarkeit ist eine rein subjektive Sache. Die ursprünglichen Basic Quelltexte sind verhältnismäßig schlecht zu lesen. Moderne Basic Dialekte sind vergleichbar mit C und werden strukturiert (eingerückt) aufgebaut. Optisch ist das vergleichbar mit einer Gliederung, bzw. einem Inhaltsverzeichnis, wo an einem Hauptkapitel Unterkapitel angefügt werden.

Alle anderen hier behandelten Sprachen werden üblicherweise eingerückt, was die Lesbarkeit erhöht. Pascal und Delphi sind wie Basic sehr wortreich, während in C++ mehr mit Kürzeln (z.B. Klammern) gearbeitet wird. Durch die Klammerung ergibt sich eine andere optische Struktur, während sich Pascal und Delphi optisch eher als Text präsentieren.

C# und Java haben eine ähnliche Syntax wie C++, entsprechend sind die Quelltexte ähnlich zu lesen. C++ ist hier der älteste Vertreter, die Quelltexte von C# und Java sind gerade im Vergleich zu C++ auf Windows leichter zu lesen. Auch in C++ lassen sich Quelltexte sauber formatieren, die Sprache bietet aber mehr Möglichkeiten, unsauberer zu formatieren, so dass man sich für einen sauberen Quelltext etwas mehr Mühe geben muss.

Python unterscheidet sich in der Optik etwas, die Sprache ist auch strukturiert aufgebaut und Einrückungen gehören in Python zur Syntax: es muss also zwangsweise eingerückt werden, während es in den anderen Sprachen nicht verlangt wird. Das komprimiert den Quelltext, es muss also weniger Text gelesen werden, um sich einen Überblick zu verschaffen.

Visuelle Programmiersprachen, wie auch UML sollen dabei die Lesbarkeit erhöhen. Das tun sie auch, allerdings meist nur im kleinen Rahmen. Die automatisch generierte Übersicht, gewissermaßen ein Inhaltsverzeichnis für eins meiner Projekte, benötigt günstig zusammengeschoben und nicht allzu groß ausgedruckt die Fläche von 4*3m. Ich müsste also alleine für das Inhaltsverzeichnis neu tapezieren. Dabei ist noch kein Ablauf dokumentiert. Die Übersicht geht hier also einfach in der schieren Größe der Zeichnungen verloren, falls man keinen Monitor mit einer 5 Meter großen Diagonalen und entsprechender Auflösung besitzt.

Kriterium VI: Garbage Collection

Eine Garbage Collection sammelt angeforderte Ressourcen (etwa Speicher oder Zugriffsrechte auf Hardware-Komponenten) und gibt sie frei, wenn sie nicht mehr verwendet werden. Eine Garbage Collection hilft dem Entwickler also dabei, Ressourcen auch dann freizugeben, wenn er selbst nicht daran gedacht hat. Die Garbage Collection hat allerdings auch Nachteile, denn sie kostet Rechenzeit, arbeitet nicht in allen Fällen zuverlässig (und diese Fälle sind meist kompliziert und müssen vom Entwickler berücksichtigt werden) und der Programmierer hat nicht die Kontrolle darüber, wann genau die Ressourcen abgebaut werden. Dies kann zu unerwarteten Verzögerungen führen, die bei Action-Spielen, Airbag-Steuerungen und sonstigen zeitkritischen Anwendungen zu unerwünschten Nebeneffekten führen kann. C#, Java, Python und gewisse Basic-Implementationen bieten Garbage Collection, in C/C++, Pascal/Delphi und den meisten Basic-Varianten muss man sich um die Rückgabe von Ressourcen selbst kümmern. Dafür hat man allerdings auch die volle Kontrolle darüber, wann Ressourcen zurückgegeben werden und damit wieder für andere Programme zur Verfügung stehen. Eine Garbage Collection ist für die nächste C++ Generation angekündigt, die C++-Variante für .NET verfügt über gemanagte Zeiger, hier wird also bereits mit einer Garbage Collection gearbeitet, wenn .NET Objekte verwendet werden.

Kriterium VII: Verfügbarkeit

Es gibt viele verschiedene Basic-Dialekte, die meist nicht wirklich kompatibel zueinander sind. Legt man sich auf einen Dialekt fest, kann man das gewonnene Wissen nur zum Teil auf einen anderen Dialekt übertragen. Bekannte Dialekte sind VisualBasic von Microsoft, PureBasic und BlitzBasic. Es gibt freie, wie auch proprietäre (käufliche) Basic-Dialekte.

Pascal ist eine aussterbende Sprache, es gibt freie Compiler. Delphi ist die objektorientierte Pascalversion. Delphi wird nur von einem Hersteller wirklich unterstützt und verliert Marktanteile. Delphi ist proprietär, man muss daher eine Lizenz erwerben. Es gibt für „ObjectivePascal“ allerdings auch freie Compiler.

Auch Python wird vorrangig auf python.org entwickelt, es gibt jedoch Reimplementationen auf .NET und Java. Es wird seit vielen Jahren weiterentwickelt. Python hat einen guten Ruf und wird immer populärer.

Java ist in der Anwendungsprogrammierung im Geschäftsumfeld ganz weit vorn. Neben Suns Java gibt es eine nicht 100%ig kompatible Implementierung von GNU, Microsoft hat ihre Java Entwicklungen eingestellt. Java selbst ist kostenlos verfügbar.

C# ist ein Microsoft-Produkt, zusätzlich gibt es allerdings auch einen Compiler für das Mono-Projekt. Wirklich verwendet wird C# aber vorrangig für Windows mit installiertem .NET Framework.

C/C++ Compiler gibt es reichlich, auch für Nicht-(Mehr)-Mainstream-Plattformen, wie Amiga, Atari, Sun. Man kann davon ausgehen, dass es für jedes Betriebssystem und jeden Prozessor entsprechende C/C++-Compiler gibt. Das gilt ebenso für Klein-Computer, wie sie in Waschmaschinen, Steuerschaltungen, Handys etc. vorkommen. Am bekanntesten ist der GNU C/C++ Compiler, der in verschiedenen Versionen für nahezu jedes Betriebssystem und viele Prozessoren verfügbar ist, auch Microsoft bietet mit Visual C++ einen Compiler für Windows an, der mitsamt des Visual Studio als Express-Version kostenlos verfügbar ist. Für kommerzielle Produkte muss Visual Studio jedoch pro Entwickler lizenziert werden. Auch Intel bietet einen sehr effizienten C/C++-Compiler gegen entsprechende Vergütung an.

Kriterium VIII: Portabilität

Möchte man ein Programm von einem Betriebssystem auf ein anderes portieren, so benötigt man eine Sprache, die dies unterstützt.

Basic fällt hier komplett heraus, schließlich ist Basic nicht einmal untereinander kompatibel. Purebasic existiert auf verschiedenen Plattformen, wobei allerdings nicht auf allen Systemen alle Befehle funktionieren. Es besteht also die Möglichkeit ein Programm zu schreiben, das auf verschiedenen Systemen läuft, man kann es allerdings nicht garantieren.

Delphi existiert ausschließlich auf Windows, eine Linux-Version (genannt Kylix) wurde schnell wieder eingestampft. Damit fällt Delphi für portable Programmierung weg. C# läuft sich auf Windows, wie auch über Mono auf anderen Plattformen. Dennoch ist C# zurzeit eigentlich nur auf Windows ein Thema, die Mono-Plattform ist halt noch keine vollständige .NET Implementierung. Java bietet eine hohe Portabilität, allerdings um den Preis, dass Java (wie C# auch) nicht auf Linux, Mac oder Windows läuft, sondern auf einer eigenen virtuellen Maschine. Man installiert also bei beiden Sprachen ein Betriebssystem zusätzlich zum Betriebssystem. Java ist in den unterschiedlichen Versionen ebenfalls nicht vollständig kompatibel, sodass man vom Anwender teils erwartet, mehrere Java-Installationen zu installieren. Weiterhin ist man mit Java sehr eingeschränkt, da man nicht direkt ans Betriebssystem herankommt. Muss man doch ans Betriebssystem, muss man den Umweg über C++ über das JNI (Java Native Interface) gehen, womit man sämtliche Unterstützung von Java im Bereich Portabilität verliert. Es lassen sich aber durchaus auch große Projekte wie OpenOffice (kann Java einbinden) oder Eclipse portabel entwickeln.

Python läuft auf allen drei Plattformen und gilt als gut portabel. Was nicht portabel ist, kann wie in Java über C/C++-Libraries erreicht werden.

C/C++ selbst existiert auf den drei Hauptplattformen, wie auch auf nahezu allen weiteren Plattformen (z.B. BSD, Solaris, Amiga, Atari). Die Grundfunktionalität ist überall verfügbar. Da C++ allerdings über wenig Grundfunktion verfügt, lässt sich mit den Grundfunktionen kein nennenswertes portables Programm schreiben. Mit Hilfe von portablen Frameworks entstehen auch hier große Projekte, wie z.B. der Opera-Webbrowser, Firefox, Code::Blocks und vieles mehr. C++ ist standardisiert, in der Praxis weisen aber vor allem ältere Compiler noch ziemlich große Unterschiede zueinander auf. Code zu schreiben, den wirklich alle Compiler schlucken und der auch richtig funktioniert ist daher nicht so einfach. Einen Compiler zu wechseln ist heutzutage allerdings kein großer Aufwand mehr. Das Problem umgehen die meisten Entwickler damit, dass sie einen Compiler (z.B. den GNU C++-Compiler) auf allen Plattformen einsetzen.

Kriterium IX: Geschwindigkeit

Programmiersprachen werden häufig in interpretierende bzw. nativ ausführende (also zu kompilierende) Sprachen unterschieden. Tatsächlich lassen sich Sprachen in 10 unterschiedliche Sprachtypen unterscheiden. Die wichtigsten sind hier Batchsprachen, die zur Laufzeit gelesen und interpretiert werden, dazu gehören alte Basic-Dialekte oder PHP. Moderne Interpretersprachen kompilieren den Quelltext und interpretieren das Kompilat. Dazu gehört beispielsweise Python oder Perl, aber auch erste Versionen von Java. C/C++, Pascal/Delphi und z.B. PureBasic sind nativ kompilierende Sprachen, sie erzeugen eine ausführbare Datei. Hier muss kein Interpreter geladen und auch nichts nachkompiliert werden, das Programm ist sofort nach dem Laden lauffähig. Aktuelle Java-Versionen und .NET Sprachen wie C# kompilieren in einen ByteCode, der als Programm ausgeliefert wird. Der benötigte Bytecode wird beim Programmstart auf das jeweilige System nativ kompiliert. Da zwischenzeitlich immer wieder andere Teile benötigt werden, kann es passieren, dass während des Programmablaufs zwischenzeitlich kurz kompiliert werden muss. Hierfür läuft im Hintergrund ein sogenannter Just-In-Time-Compiler, der der eigentlichen Anwendung natürlich immer wieder Rechenzeit wegnimmt. Zusätzlich zum Just-In-Time-Compiler kann in C#, Java, PHP und Python zwischenzeitlich die Garbage Collection anlaufen. Daher eigen sich diese Sprachen nicht bei Problemen, bei denen die Programme zeitkritisch reagieren müssen.

Die unter normalen Bedingungen schnellsten Programme liefert C++. Dennoch können Java und C# Programme durch eine (geschwindigkeits-)optimierte Speicherverwaltung schneller ablaufen, wenn das Programm sehr häufig Speicher anfordert und freigibt. C++ ist aber so flexibel, dass die Speicherverwaltung von Hand nachoptimiert werden kann, so dass auch hier C++ Java wieder überholen kann. Ebenfalls ganz vorne dabei sind nativ kompilierte Sprachen, wie Pascal, Delphi, aber auch PureBasic. Hier wäre Purebasic nochmals hervorzuheben, da es den GNU-Codegenerator nutzt, der ebenfalls C++-Programme schreibt. Die höchste Geschwindigkeit ist vermutlich mit C++ und dem Intel Compiler zu erreichen. Beiläufig sei hier erwähnt, dass C++-Programme nicht langsamer sind als C-Programme, evtl. sogar noch schneller (durch inline-Funktionen).

Den nativen Sprachen folgen in nicht großem Abstand die Just-In-Time kompilierenden Sprachen (C#, Java). Die JIT-kompilierenden Sprachen bewegen sich im Bereich von etwa gleich schnell bis 10 mal langsamer als native Sprachen. Mit sehr großem Abstand liegen Bytecode interpretierende Sprachen (Java ohne JIT-Compiler, Python, Perl) dahinter. Programme, die nativ im Millisekunden-Bereich liegen, verbrauchen hier gerne mehrere Sekunden Rechenzeit. Sie liegen also im Bereich von Faktor 1000-10000. Zu den langsamsten Vertretern gehören die Sprachen, die Quelltext interpretieren müssen (PHP, Basic). Hier bewegt man sich im Bereich von 2000-20000 langsamer als nativ kompilierende Sprachen.

Interpretierende Sprachen eignen sich also eher für Skripte, Abfragen (wo der Computer vorrangig auf den User wartet) und Automatisierung von kleineren Aufgaben, aber nicht um wirkliche Berechnungen durchzuführen. Programme, die hoch optimiert rechnen müssen, sind ausschließlich auf nativen Sprachen zu entwickeln, für die hoch optimierende Compiler existieren, wie die Intel C++ und Fortran Compiler.

(Fortran (FORmular TRANslator) ist eine Sprache aus den 1950er Jahren, die früher für viele mathematische Berechnungen verwendet wurde, aber selbst in ihrer letzten Version aus den 90er Jahren weit entfernt von moderner Programmierung zurückbleibt).

Kriterium X: Startgeschwindigkeit

Hier geht es darum, wie lange das fertige Programm braucht, um anzulaufen. Hier sind nativ kompilierende Sprachen (C/C++, Delphi) als erstes am Start; das Programm wird geladen und läuft. Als zweites laufen Interpreter an: Hier wird erst der Interpreter geladen, anschließend das Programm und dann kann abgearbeitet werden. Als nächstes kommen Bytecode interpretierende Sprachen an den Start, die Interpreter und Programm laden, den Quelltext nach Bytecode kompilieren müssen und dann ausführen. Java und .NET Sprachen laden hier zunächst die virtuelle Maschine und den Just-In-Time-Compiler, dann das Programm im Bytecode-Format, welches anschließend nativ kompiliert werden muss und dann geht es endlich los.

Die Startgeschwindigkeit ist gerade bei kleineren Programmen ausschlaggebend. Auch wenn PHP sehr langsam abläuft, kann ein PHP-Skript hier bereits lange fertig sein, bevor Java überhaupt das Programm startet.

Kriterium XI: Weitergabe

Hier kommt ein weiterer Vorteil nativ kompilierender Sprachen (C++, Delphi, Purebasic) hervor: Es ist möglich, ein Programm in einer Datei auszuliefern, während interpretierende Sprachen (PHP, Python, Basic) auf den Interpreter angewiesen sind. Bei Sprachen wie Java und C# sind zunächst große Installation zusätzlich zum eigentlichen Programm erforderlich, auch wenn man nur ein ganz kleines Programm ausführen möchte.

Bytecodes (Java, C#) und nativ ausführbare Programme (C/C++, Pascal/Delphi, Purebasic) kann man nicht wieder in Quelltext überführen, allerdings kann man die Prozessoranweisungen wieder menschenlesbar übersetzen. Native Programme sind dabei allerdings alles in allem vollkommen unlesbar, da sie viel zu viele Maschinenanweisungen enthalten, als dass man daraus ein Programm in akzeptabler Zeit wiederherstellen könnte.

Bei interpretierenden Sprachen (PHP, Perl, Python, Basic) gibt man den Quelltext direkt weiter, sodass fremde Entwickler den Quelltext modifizieren oder für Zwecke weiterverwenden können, die man selbst nicht gewünscht hat. Diese Sprachen sind also aus Prinzip OpenSource, auch wenn das nicht immer gewünscht ist.

Bei der Weitergabe zeigt sich ein Vorteil der Virtual Machine: C# und Java-Programme werden als Bytecode kompiliert. Der Bytecode kann anschließend verteilt werden und läuft anschließend auf allen Systemen, auf denen die benötigte Virtual Machine verfügbar ist. Nativ kompilierende Sprachen benötigen für jedes Betriebssystem eine hergestellte Version, so dass eine Windows-Version nicht auf Linux oder Mac läuft. Teils ist es sogar erforderlich, für unterschiedliche Linux-Distributionen unterschiedliche Versionen zu kompilieren.

Kriterium XII: Einsatzgebiete

Nativ kompilierende Sprachen finden sich eigentlich überall: In der Anwendungsentwicklung, Spieleentwicklung, Betriebssystem- und Treiberentwicklung, aber auch Shell-Befehle und Plugins werden häufig in C/C++ geschrieben. Auch Webanwendungen laufen in C++ extrem schnell, wie die Webseite www.tauschzone.de eindrucksvoll zeigt, welche eine Seite in der Regel in weniger als einer Millisekunde zusammenstellt.

Java und C# sind vorrangig zur Anwendungsprogrammierung gedacht, aber auch Websysteme werden in diesen Sprachen realisiert (JSP, bzw. ASP), zur Treiberentwicklung oder Betriebssystementwicklung sind diese Sprachen allerdings überhaupt nicht geeignet. Auch wenn Möglichkeiten bestehen, interessante Grafikausgaben zu leisten, werden für Spiele und gerade reaktionsschnelle Spiele mit 3D-Grafik native Sprachen bevorzugt. VisualBasic kompiliert heutzutage ebenfalls nach .NET, so dass die Einsatzgebiete denen von C# entsprechen.

Interpretersprachen werden meist genutzt, um kleine und kleinste Projekte umzusetzen. Python ist hier eine Ausnahme, die durchaus auch für größere Projekte geeignet ist, dafür aber auch auf sehr viel Funktionalität in C/C++-Libraries setzt, um schnell genug zu laufen. Interpretersprachen sind so durchaus in der Lage graphische Oberflächen anzubieten. PHP, Perl und Python werden auch für Webprojekte verwendet und dort häufig gesehen. PHP ist auf nahezu allen Webservern installiert, aber auch C++-Programme sind über die CGI-Schnittstelle leicht verfügbar.

Interpretierende Basics sind für heutige Anforderungen kaum noch zu verwenden.

Fazit

Verschiedene Programmiersprachen haben verschiedene Anforderungen an den Entwickler, bieten aber auch unterschiedliche Möglichkeiten. Während C++-Programme auf allen Plattformen hocheffizient arbeiten und die Sprache zu den mächtigsten und ausdrucksstärksten Sprachen zählt, erwartet Sie vom Entwickler ein gutes Verständnis, wie Computer arbeiten. Als Allrounder ist C++ eine wichtige Grundlage für nahezu alle anderen Programmiersprachen und in nahezu allen Einsatzgebieten anzutreffen.

Basic-Dialekte sind sehr leicht zu lernen, bieten aber auch sehr wenig Unterstützung für größere Projekte und sind allgemein stark eingeschränkt. Moderne Basics wurden um weitere Konstrukte ergänzt, sodass beispielsweise PureBasic in einer Liga mit C spielt (keine OOP Unterstützung, daher nicht mit C++ vergleichbar). Für Hobbyprogrammierer kann Purebasic damit eine gute Alternative darstellen. VisualBasic entspricht in den Möglichkeiten in etwa C#, wird jedoch von C# deutlich verdrängt, zumal C# syntaktisch deutlich moderner und sauberer ist. Basic-Dialekte, die sich ausschließlich an die ursprünglichen Konstrukte halten, sind heutzutage absolut unbrauchbar.

Pascal ist als Sprache tot, Delphi stirbt weg. Es existiert noch eine Community um diese Sprachen und Pascal wird auch noch als Einstiegssprache an Schulen unterrichtet. Pascal war als Lehrsprache konzipiert worden und hat entsprechend eine saubere Syntax, die sich in der Realität aber nicht durchsetzen konnte. Beide Sprachen sind letztendlich Sackgassen, die eine Umkehr zu einer anderen Sprache früher oder später notwendig machen.

Wer Anwendungen, beispielsweise mit Datenbankunterstützung, schreiben möchte, wie es in der Industrie häufig benötigt wird, ist mit Java und C# gut bedient. Anbindungen an andere Sprachen existieren jedoch ebenso. Für Webprogrammierung ist PHP sehr beliebt, Python wird beliebter und auch Ruby ist im Kommen. Perl und Python sind auch für Shell-Skripte gut geeignet.

Hintergrund

geschrieben im August 2008 von Sascha 'Xin' Atrops. Meine erste Programmiersprache war 1986 Commodore Basic V2 auf dem Commodore 64. Über diverse Basic-Dialekte und m68k-Assembler fand ich zu C. In der Schule lernte ich Pascal, während ich mir privat C++ beibrachte. Während des Informatikstudiums kamen x86-Assembler, Delphi, Java und Prolog dazu, während ich für Webseiten PHP verwendete. Während des Studiums gab ich Tutorien für Linuxprogrammierung mit C und C++. Im Beruf kamen C#, JavaScript und neuerdings auch Python hinzu. Seit 2001 beschäftige ich mich mit dem Design von Programmiersprachen und arbeite neben der Arbeit als Softwareentwickler an einem Sprachen- und Compilerkonzept für meine Programmiersprache Genesys.

Weiterführende Informationen

Programming languages for beginners
C#: MSDN: Die Sprache C# im Detail

Charles Petzold, ein erfahrener Programmierer und bekannter Autor vieler Bücher zur Windows-Programmierung bei Microsoft Press, spricht sich auf seiner Webseite gegen das Erlernen von Programmiersprachen über visuelle Elemente aus, wie es dem Entwickler in Visual Studio gewissermaßen aufgedrängt wird. Dem stimme ich (Sascha Atrops) zu, daher verlinke ich seinem Blog-Eintrag zu dem Thema hier. Wer programmieren lernen möchte, lernt es eben nicht dadurch, dass er einen Button auf ein Window-Form schiebt.