Dienstag, 5. Januar 2010

Und ihr dachtet C ist für Nerds

Vorgestellt: esoterische Programmiersprachen

Okay, viele von euch wissen, dass ich derzeit eine Ausbildung zum Programmierer mache. Wenn die meisten Leute an Programmierer denken, dann haben sie das Bild eines pubertierenden, aknegeplagten 16-18 Jährigen im Kopf, der in seinem Leben nichts anderes als den Computer kennengelernt hat. Das liegt aber meistens nur an den klischeehaften Negativbeispielen, als die sich manche tatsächlich in die Öffentlichkeit trauen.

Wozu braucht man sowas kompliziertes wie eine Programmiersprache überhaupt?

Zuerst einmal: Computer sind dumm! Punkt. Sie wirken nur so schlau, weil die Programme die sie ausführen eigentlich die Schlauen sind. Der Computer führt sie nur stur aus und spurt je nach dem, was ihm die Programme sagen was er machen soll.

Ein gerne herangezogenes Beispiel der Funktionsweise von Programmiersprachen ist das sog. Hallo Welt-Programm, das in fast jeder Sprache umgesetzt werden kann. Ein Beispiel in C++ (wer eine genaue Erklärung haben will soll einen Kommentar hinterlassen):

#include <iostream>
using namespace std;
int main ()
{
   cout << "Hello, world!\n";
}

Ergebnis: Eine schwarze Box mit dem Schriftzug Hello, world!

Okay, vielleicht ist er nicht ganz so dumm. Es gibt noch immer Situationen in denen er sagen kann “Öh, kann ich nicht machen, darf ich nicht machen” und das ist dann der Moment in dem ein Programm in unserem Verständnis abstürzt. Ärgerlich, aber weniger eine Laune der Informationstechnik.

Viel mehr ist es ein Fehler der sich entweder aufgrund der Logik der Programmiersprache (eine Einschränkung bzw. Regel der Paradigmen der betreffenden Sprache) eingeschlichen hat oder einfach ein Fehler der dem Programmierer zur “Design-Zeit” nicht aufgefallen ist. Bestes Beispiel hierfür ist eine Division durch 0. Eine solche Division muss nicht mal direkt auftreten, sondern kann das Resultat einer Verkettung von Berechnungen sein. Tritt eine solche auf stürzt das Programm ohne weitere “Vorsichtsmaßnahmen” von Seiten des Programmierers schlicht ab, weil es nicht mehr weiter weiß und verwirrt ist. Wenn der Debugger (die Fehlerpolizei der Sprache)schlau genug ist, wird es das Programm mit einer Fehlermeldung beenden. Helfen tut das dem Anwender natürlich nichts.

Viel ekliger sind allerdings Endlosschleifen. Eine Schleife in einer Programmiersprache dient dazu, eine Reihe von Anweisungen an das Programm mehrmals durchzuführen. Passt man bei der Formulierung einer Schleife nicht auf, steigt die Wahrscheinlichkeit einer solchen Endlosschleife. Und wer jetzt mitgedacht hat weiß schon, warum Endlosschleifen eklig sind: sie hören nie auf sich zu wiederholen. Das äußert sich dem Anwender meist dadurch, dass er stundenlang auf eine Sanduhr gucken darf oder das Programm selbst nach mehrmaligem Klicken keine Reaktion mehr zeigt. Der Grund ist nicht etwa, dass es nichts mehr tut, wie es auf den ersten Blick scheint, eher das Gegenteil: es arbeitet sich zu Tode. Und genau das passiert bei Endlosschleifen, das Programm “hängt sich auf”.

Auf die reale Welt bezogen sähe eine Endlosschleife etwa so aus: Ihr sucht in einem Glossar das Stichwort “Endlosschleife” und findet es mit dem Verweis “Endlosschleife – siehe Endlosschleife”. Rein logisch gesehen würdet ihr jetzt sagen “Soll das jetzt ein Witz sein?” aber auf sowas kommt ein Computer von selbst nicht. Würde ein Computer in dem selben Glossar nach dem Eintrag “Endlosschleife” suchen und den Eintrag finden mit einem Verweis “siehe Endlosschleife” sucht er erneut nach Endlosschleife, findet den Eintrag, folgt dem Verweis, sucht nochmal, findet den Eintrag, folgt dem Verweis, sucht nochmal…

Ihr seht, das kann man endlos fortsetzen und deshalb sind Endlosschleifen eklig!

Aber ich schweife ab. Kurz und bündig: Man braucht Programmiersprachen, um den Computer so schlau zu machen für wie schlau wir ihn sonst auch halten!

Okay, aber was ist jetzt eine “esoterische” Programmiersprache?

Esoterische Programmiersprachen dienen keinem praktischen Nutzen. Sie sind eher ein Akademiker-Scherz oder haben ein theoretisches Ziel. Als Akademiker-Scherz kann man die Sprache Brainfuck sehen.

Ein Hallo Welt-Programm in Brainfuck:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.

Ergebnis: Eine schwarze Box mit dem Schriftzug Hello, world!

Würdet ihr mir glauben, dass diese scheinbar sinnfreie Anreihung an Plus- und Minuszeichen tatsächlich ein Programm ist? Wahrscheinlich nicht, weil es nicht nach dem Codebeispiel aussieht, das ich euch zu Anfang gezeigt habe. Welches kranke Hirn hat sich diese Sprache nur ausgedacht, mögt ihr euch vielleicht denken? Kleiner Tipp für Fernsehwerbungskundige: “Werr hatt’s errfunden?” Das Ziel hinter Brainfuck war sog. Turing-Vollständige Sprache zu kreieren, die einen möglichst kleinen Compiler hatte (das Programm, das aus diesem Wirrwarr ein Programm macht, dass man mit einem Doppelklick starten kann – ganz recht: Ein Programm, das ein Programm macht). Alles so klein wie möglich zu halten ist eine beliebte Erbsenzählerei unter Programmierern, um nicht zu sagen eine beliebte Disziplin.

Dagegen einfacher und eher zur Belustigung, ein Hallo Welt-Programm in LOLCODE:

HAI
     CAN HAS STDIO?
     VISIBLE "HAI WURLD!"
 KTHXBYE

Ergebnis: Eine schwarze Box mit dem Schriftzug HAI WURLD!

Persönlich finde ich LOLCODE reizend, weil es meinen Humor ganz gut trifft: Hauptsache sinnlos! Außerdem wurde diese esoterische Programmiersprache von den lolcats abgeleitet, die ich ebenfalls zum Schießen finde!

Und wozu jetzt das ganze hier?

Ich hoffe ich konnte den ein oder anderen davon überzeugen, dass es vieeeeel schlimmer geht, was Programmiersprachen angeht und dass programmieren auch ganz lustig sein kann.

In dem Sinne,
Cheers