2008-01-11 digital life Die perfekte Programmiersprache Zwischen Regelwerk und Kreativität Im Laufe meines bisherigen Computerlebens hatte ich Kontakt zu allen möglichen Konfigurations-, Auszeichnungs- und vor allem auch Programmiersprachen. Dabei macht man sich schon so seine Gedanken, wie man denn seine ganz persönliche "perfekte" Program- miersprache aussehen lassen würde. Hier soll es nicht um Anwendungsbereiche oder statische vs. dynamische Typisierung und dergleichen gehen. Vielmehr blicke ich hier auf das was der User sieht: Wie sieht die Syntax aus? Welche Konventionen gibt es? Was ist mit Coding Style? Ich befasse mich mit irgendsoetwas wie: geschweifte Klammern vs. begin/end (C vs. Pascal) Einrückung definiert Block vs. Worte/Zeichen definieren Block (Python vs. !Python) Tab-Pflicht vs. beliebiger Whitespace (Makefile vs. Rest) = vs. := und == vs. = (C vs. Pascal) Das ist nur Style ... lediglich das Gesicht der Sprache. Das hat nichts mit dem Charakter zu tun (also nicht mit wahrer Schönheit!). Das ist eigentlich auch nichts von Bedeutung, da es nur eine Sache der Gewöhnung ist. Um diese Dinge zu ändern, müssen nur Textersetzungen im Compiler- code gemacht werden. Das ist wie eine andere Haarfarbe oder so. Das genau macht es aber für mich so interessant. Es ist wie das fertige Auto, das nur noch lackiert werden muss. Die Frage, ob die Syntax gut aussieht ist (fast) komplett unabhängig von der Frage, ob eine Sprache gut oder schlecht ist. Die Wahl der Schlüsselworte und sonstigen Syntax-Zeichen ist einfach unabhängig von der Sprache an sich. Als wenn man einer Puppe einfach das eine oder das andere Kleidchen anzieht. Der Entwickler/Vater der Sprache entscheidet das einfach ... nach Lust, Keyboard-Layout, Ästetik oder Verwandschaft mit anderen Sprachen. Bei grundlegenden Konzepten einer Sprache ist das anders. Diese bestimmen den Charakter der Sprache. Sie machen eine Sprache wirklich gut oder schlecht. Wobei man dabei auch nochmal differenzieren muss, zwischen Konzepten die anwendungsbereichsabhängig sind, und welchen, die davon unabhängig sind. Unabhängige Konzepte sind die, die man auf allen (herkömmlichen) Anwendungsgebieten entweder bevorzugen oder meiden würde. Ein Beispiel dafür ist (für mich) der Unterschied zwischen Perl und Python. (Zugegeben, ich programmiere keine der beiden Sprachen, und so sind meine Informationen nur aus zweiter Hand.) Perl is schon regelrecht legendär für seine beliebig vielen Wege auf denen ein Problem gelöst werden kann. Dieser kreative Ansatz en- det dann leider auch nicht zu selten darin, dass der eine Perl- Programmierer nicht lesen kann, was der andere geschrieben hat. (Nicht dass ich Perl-Hacken nicht als Kunst sehen würde - keineswegs. Es entspricht nur nicht dem was ich mir von einer optimalen Programmiersprache wünsche.) Ruby (mit dem ich ein wenig liebäugle (wegen anderer Konzepte)) folgt hier leider dem Stil von Perl. (Ein simples Beispiel ist 'unless', das nichts anderem als einem 'if not' entspricht.) Anders dagegen Python, das eben nicht vier Möglichkeiten anbietet, wenn auch eine genug ist. Im Bezug auf dieses Sprachkonzept würde ich mich jederzeit für eine Sprache in der Art von Python entscheiden, egal in welchem Anwendungsgebeit ich unterwegs bin. Die zweite Art der grundsätzlichen Konzepte ist die, in denen gegensätzliche Konzepte in jeweils unterschiedlichen Anwen- dungsgebieten gut sein können. Als Beispiel kann man statische und dynamische Typisierung anführen. Je nach Situation würde ich eine Sprache der einen oder der anderen Art wählen um ein Pro- gramm zu erstellen. Diese Unterschiede sind meiner Meinung nach recht uninteressant, weil man damit nicht seine perfekte Programmiersprache definieren kann. Man kann sie damit nur in bestimmte Anwendungsgebiete einordnen. Doch nochmal zurück zum Aussehen der Syntax. Ich möchte jetzt doch noch erzählen, was mir gefällt und was nicht. (Natürlich bin ich da vorbelastet und kombiniere doch nur die besten Teile bestehender Sprachen. Aber wem geht es da nicht auch so?) Als Basis würde ich wohl C wählen, das in meinen Augen übersichtlich und schön zu lesen ist. (Nicht im Bezug auf Pointer und so, aber im Bezug auf die Syntax als Ganzes.) Mir gefallen die geschweiften Klammern optisch sehr gut. Leider habe ich das falsche Keyboard-Layout um sie praktisch tippen zu können. Was mir an Pascal besser gefällt als an C sind die Zuweisungs- und Vergleichsoperatoren. Da ich so gut wie kein Pascal mehr programmiere, dafür aber recht viel C/C++/PHP, trifft mich hier auch die Macht der Gewohntheit. Dennoch finde ich := und = lo- gischer und eingänglicher als die C-Äquivalente = und ==. An Kommentaren sind auf jeden Fall zwei Arten notwendig, wie sie viele Programmiersprachen ja haben. Für beliebige Blöcke gefällt mir /* */ recht gut, und das lässt sich am Nummernblock auch richtig gut tippen. (Bei Notebooks wird es schon schwieriger.) Für Einzeilenkommentare würde ich # leicht bevorzugen gegenüber //. Wobei // halt schon besser zu /* */ passt ... ... ach mann, ich komme einfach nicht von dem C-Zeug los :-/ Grundsätzlich ist mir eine freie Whitespacebehandlung wichtig ... naja, wie in C halt. (Makefiles sind für mich das beste Gegen- beispiel ... wobei man das vielleicht auch als den größten Bug des Jahrhunderts bezeichnen könnte.) Aber was ich auch unbedingt vorteilhaft finde, ist eine sonst recht strenge Syntax. Denn wenn sich die Programmierer anpassen müssen, wird der Code lesbarer. Perl, Ruby, PHP sind da in meinen Augen keine guten Beispiele. Bei C würde ich mir unter anderem wünschen, dass bei if, while, usw. geschweifte Klammern gesetzt werden müssen. Genauso halte ich mehrfache Deklarationen in einer Zeile (z.B. int i, j, k;) für schlechten Stil. Und da sind wir auch schon beim Coding-Style und den Konven- tionen. Hier sollte eines klar werden: je strenger die Syntax ist, desto weniger Konventionen (an die man sich halten _kann_) braucht man, da der Compiler schon vorgibt, wie der Code aussehen muss (um lesbar zu sein). Man bräuchte wohl hunderte Regeln, um Perl-Code einheitlich zu bekommen. C-Sourcen dagegen sehen auf den ersten Blick jeden- falls immer gleich aus. Und wäre C nicht so low-level (und gäbe es nicht so viele Möglichkeiten für Obfuscation), dann wäre auch der Rest verständlicher. Um alles nochmal zusammenzufassen: realativ strenge Syntax (Wiedererkennungwert), variable Whitespaces (Freiheit des Programmierers), sprechende Sonderzeichen statt Worten (optisch schneller fassbar), wenig reserviertes Zeugs und einen Weg, wenn einer genügt (einfacher Code), ... das sind Dinge die eine perfekte Sprache meiner Vorstellung nach bieten sollte. http://marmaro.de/apov/ markus schnalke