Was macht eine gute Programmiersprache aus? Marc Ruef | 27.10.2008 Die Diskussion darüber, welche Spielkonsole, welches Betriebssystem und welche Programmiersprache denn nun die Beste ist, ist wohl so alt wie die Menschheit selbst (früher hat man wohl über Keulen und Schwerter gestritten). Obschon ich selbst mich vehement einem solchen Disput verweigere, empfinde ich die Betrachtung der Betrachtung als höchst interessant. Nehmen wir als Beispiel Programmiersprachen. Was macht denn nun eigentlich eine gute Programmiersprache aus? Dieser scheinbar simple Frage kann nicht mit einer allgemeingültigen Antwort entgegnet werden. Es gibt eine Vielzahl an Dingen, die bei der Programmierung, also der Nutzung der jeweiligen Sprache, als Vorteil verstanden werden kann. quoteEinfachheit: Eine Programmiersprache sollte einfach zu lernen und einfach anzuwenden sein. Auf komplexe Ideen und Konstrukte sollte verzichtet werden, um sich intuitiv in der jeweiligen Sprache bewegen zu können. Je eher die Programmiersprache der menschlichen Sprache entspricht, desto einfacher ist für die meisten Menschen der Zugang zu ihr. Höhere Programmiersprachen, wie zum Beispiel SQL, bieten sich hier an. Einheitlichkeit: Eine Programmiersprache sollte bezüglich ihrer Sprachelemente und Konstrukte eine verständliche Einheitlichkeit aufweisen. Funktionsnamen, Argumentreihenfolge und Arität sollten einem klar strukturierten Muster folgen. Assembler bietet sich hier naturbedingt an. Bei den höheren Sprachen kann vor allem Perl überzeugen, wohingegen PHP seit jeher mit Inkonsistenzen (z.B. ähnliche Funktionen mit unterschiedlicher Argumentreihenfolge) zu kämpfen hat. Orthogonalität: Eine Programmiersprache sollte die freie Kombinierbarkeit unabhängiger Konzepte anbieten. Traditionell wurde dieses Konzept durch Algol 60 eingeführt und setzt sich bei vielen höheren Programmiersprachen fort. Systemnähe: Eine Programmiersprache sollte einen systemnahen Einfluss erlauben. Durch direkten Zugriff auf die Komponenten des Betriebssystems oder gar direkt der Hardware sollen effiziente und komplexe Manipulationen durchgesetzt werden können. Viele traditionelle Sprachen wie Assembler und C bieten diese Möglichkeit an. Die meisten höheren Programmiersprachen erlauben systemnahe Zugriffe über API-Calls (z.B. VB/.NET). Abstrahierbarkeit: Eine Programmiersprache sollte sich wiederholende Abläufe in abstrahierter Weise durchführen lassen. Gerade Sprachkonstrukte wie for und while gelten als wichtige Elemente professioneller Sprachen. Aber auch effiziente Funktionen, wie zum Beispiel zur Sortierung eines Arrays, erlangen hier Wichtigkeit. Sprachen mit einer Vielzahl an Funktionen (z.B. PHP) oder eleganter Objektmanipulation (z.B. Ruby) werden hier bevorzugt. Verständlichkeit: Eine Programmiersprache sollte die versändliche Umsetzung einer Applikation zulassen. Die jeweiligen Mechanismen, ihre Funktionsweise sowie die zu erwartenden Rückgaben müssen klar definiert sein. In ANSI C wird zum Beispiel die Diffusion zwischen einer Zuweisung mit = und einem Vergleich mit == kritisiert. In PHP (http://www.php.net/manual/en/language.operators.comparison.php) (seit Version 4) wird gar zusätzlich eine Typenprüfung mit === realisiert. Kaskadierung: Eine Programmiersprache sollte in der Lage sein, komplexe und für den Entwickler nicht zwingend erforderliche Informationen zu verstecken bzw. kaskadieren. So ist heutzutage nur in wenigen Situationen der direkte Zugriff auf Speicherbereiche, wie sie in C mit malloc() angegangen werden, erforderlich. Modularität: Eine Programmiersprache sollte eine Modularität mitbringen, um einzelne Routinen unkompliziert ersetzen und kombinieren zu können. Die Konzepte dedizierter Funktionen, separater Quelltext-Dateien und externer Bibliotheken (Libraries) sind gerade bei grösseren Projekten von Vorteil. Die meisten professionellen Programmiersprachen bieten diese Möglichkeiten an. Entweder wird dies mittels der IDE oder durch spezifische Anweisungen (z.B. include bei PHP) umgesetzt. Sicherheit (safety und security): Eine Programmiersprache sollte die möglichst einfache und effiziente Entwicklung sicherer Programme erlauben. Während der Entwicklung, der Übersetzung oder Nutzung sollten Mechanismen vorhanden sein, die semantische und logische Fehler des Entwicklers erkennen, melden oder abfangen können. Professionelle Entwicklungsumgebungen (z.B. Eclipse) und Compiler (z.B. gcc) können simple Probleme erkennen. Zusätzliche Software zur Codeprüfung kann komplexere Sicherheitsprobleme ausmachen. Moderne Sprachen sehen sich in der Lage Exceptions abzufangen und darauf zu reagieren (z.B. mittels try/catch in Javascript oder "On Error GoTo" in Visual Basic). Aussagekraft: Eine Programmiersprache sollte die Entwicklung von Applikationen erlauben, die aussagekräftige Resultate liefern können. Operationen sollten klar definiert und die Endbarkeit der Software eindeutig sein. Dies verhindert ineffiziente oder gar fehlende Resultate. Effizienz: Eine Programmiersprache sollte eine effiziente Entwicklung und Programmausführung erlauben. Die Entwicklung wird durch komfortable Entwicklungsumgebungen vereinfacht. Und durch eine zusätzliche Optimierung während der Übersetzung soll eine möglichst effektive Ausführung erreicht werden. Lang und oft genutzte Sprachen, wie zum Beispiel C, können mit hervorragenden Compilern (z.B. gcc) aufwarten. Bezüglich der Ausführungseffizienz sollten kompilierte Sprachen (z.B. C) den interpretierten Sprachen (z.B. PHP und Tcl) immer vorgezogen werden. Komfort: Eine Programmiersprache sollte die möglichst einfache und komfortable Entwicklung und Wartung von Programmen erlauben. Entwicklungsumgebung: Eine Programmiersprache sollte über eine möglichst effiziente und komfortable Entwicklungsumgebung genutzt werden können. Durch die zusätzlichen Features wird die Anwendung besonders einfach, wodurch die Performance bei der Programmierung zusätzlich erhöht werden kann. Gerade bei der Entwicklung grafischer Oberflächen sollte mit WYSIWYG-Editoren gearbeitet werden können. In dieser Hinsicht konnte sich die .NET Reihe von Microsoft einen Namen machen. Popularität: Eine Programmiersprache sollte möglichst verbreitet und beliebt sein. Dies kann einerseits ein Garant dafür sein, dass hier auf ein solides Produkt gesetzt wird. Zusätzlich erhöht es die Verständlichkeit, die gerade bei Open-Source Projekten unabdingbar wird, um die Unterstützung der Community zu erlangen. Desweiteren kann darauf vertraut werden, dass die erforderliche Laufzeitumgebung und Bilbiotheken vorhanden sind. Sprachen wie C, Perl und Python werden hier gerne bevorzugt./quote Da die Bedürfnisse nicht in gleichem Masse gegeben und durch eine einzige Sprache abgedeckt werden können (gewisse Anforderungen widersprechen sich untereinander), gibt es keine "beste Programmiersprache". Eine Programmiersprache ist und bleibt ein Werkzeug, das eine spezifische Aufgabe bewältigen können soll. Die Wahl des Werkzeugs richtet sich damit nach den Anforderungen des Entwicklers sowie des durch ihn angegangenen Problems. Diese hohe Individualität wird beim Streit um Programmiersprachen gerne vergessen. Ist doch sie massgeblich dafür verantwortlich, dass dieser keinen allgemeinen Nutzen zu bringen in der Lage ist.