Es ist um einiges kürzer als Assembler! Lasst uns gemeinsam schnell mal schauen, was das alles bedeutet:
Der Header #include <iostream> sagt der Maschine: »In diesem Programm möchte ich die Datei ›iostream‹ hinzufügen (include).« Die eigentlich komplizierte Funktion, die ich in meinem Programm aber nicht erneut programmieren möchte, ist standardmäßig bereits vorhanden. Es gibt Ordner, in denen sich die unterschiedlichen Befehle befinden. Diese Ordner nennt man name spaces, also »Namensräume«. Wenn ich also einen Befehl brauche, muss ich zuerst den name space benennen und dann den Befehl.
int main (void) bedeutet, jetzt kommt der Hauptteil (main) meines Codes. Dieser Hauptteil wird zwischen den Klammern { } geschrieben und von der Maschine Zeile für Zeile ausgeführt.
std::cout << »Hello World!«; bedeutet: »Zeige den Text ›Hello World!‹ auf dem Bildschirm an.« Dafür soll die Maschine in der Datei iostream im name space std (für Standard) den Befehl cout (c für console und out für output) suchen und alles, was zwischen den Anführungszeichen steht, anzeigen. Das Semikolon zeigt an, wo der Befehl zu Ende ist.
std::cin.get (); bedeutet: »Warte, bis der Nutzer eine Eingabe über die Tastatur gemacht hat, bevor du das Programm beendest.« Dafür soll die Maschine den Befehl cin.get (c für console, dann in für input und get für »holen«) suchen und so lange anzeigen, bis eine Eingabe vom Nutzer erfolgt. Das ist also nur ein Haltepunkt, den ich hier einbaue, damit der Nutzer überhaupt die Möglichkeit hat, den Text zu lesen, sonst würde sich das Programm sofort nach dem Ausführen schließen.
return 0; bedeutet schließlich: »Du brauchst nichts mehr anzeigen und darfst das Programm beenden.«
Wenn ich weiß, dass ich mich im selben name space bewege, kann ich den Code folgendermaßen vereinfachen:
Abbildung 8: Beispielcode 2 in C++
Damit sage ich gleich am Anfang, dass ich immer den name space std nutzen möchte. Dann lege ich los mit meinem Code und schreibe alle Befehle nacheinander, ohne dass ich in jeder Zeile die Suche nach std einfügen muss.
Dieses Beispiel zeigt, dass ich der Maschine Schritt für Schritt alles erklären muss. Wenn man eine neue Kollegin oder einen Praktikanten einarbeiten muss, ist das ganz ähnlich. Am Anfang ist es ein riesiger Aufwand, weil man alle Aufgaben ganz genau erklären muss. Man muss ihm oder ihr die ganzen unternehmensspezifischen Begriffe und Abkürzungen erklären, man muss ihnen beibringen, wo sie was finden und wen man nach Informationen fragen oder um Hilfe bitten kann. Aber irgendwann ist die Einarbeitung beendet und sie können ihre Aufgaben selbst durchführen und uns entlasten. Die Mühe hat sich gelohnt.
Diese Einarbeitung geht beim Programmieren aber auch einfacher, und zwar mit der Sprache Python. Diese Sprache hat eine reduzierte und auf Übersichtlichkeit optimierte Syntax, dadurch lässt sich Programmcode deutlich einfacher und knapper formulieren als in den anderen Sprachen.
Wenn wir unsere Nachricht »Hello World!« in Python schreiben wollen, programmieren wir das folgendermaßen:
Abbildung 9: Beispielcode in Python
Hier sage ich der Maschine einfach nur, fast wie einem Menschen: »Schreibe die Nachricht ›Hello World!‹ auf dem Bildschirm.« Mit »Print« ist hier nicht das Drucken mit einem Drucker gemeint, sondern die Ausgabe auf der Konsole, also auf dem Bildschirm.
Das sieht jetzt aber wirklich viel einfacher aus, stimmt’s? Das ist der Grund, warum Python sehr gehypt wird. Dabei ist das eine grundsätzliche Richtung, in die sich die höheren Programmiersprachen heute entwickeln: Coden wird immer menschenfreundlicher.
Wenn es darum geht, Roboter zu programmieren – insbesondere die für Kinder geeigneten –, gibt es inzwischen sogar visuelle Sprachen. Diese Sprachen nutzen Module mit unterschiedlichen Funktionen, die der Roboter ausführen soll, wie zum Beispiel »Mache einen Schritt nach vorne«, »Hebe den rechten Arm« oder »Lächle«. So können die Kinder über Symbole und Bilder Befehle erteilen, ohne sich über Syntax oder Architektur Gedanken machen zu müssen. Scratch habe ich schon erwähnt, es gibt aber auch andere, wie zum Beispiel Cognimates2, mit einer Oberfläche, die in Abbildung 10 zu sehen ist.
Abbildung 10: Oberfläche von Cognimates, Roboterprogrammiersprache für Kinder
Das ist der Moment, in dem Maria mich erleichtert anschaut. Programmieren wird bald für viele möglich sein, auch für sie. Sollte sie endlich mal den richtigen Typen finden und Kinder kriegen, könnten sie alle zusammen kleine Roboter programmieren. Darauf freut sich Maria jetzt schon. In diesem Moment vibriert ihr Handy, natürlich eine neue Tinder-Nachricht. Tom schreibt: »Heute Abend am Brandenburger Tor?«
Maria: »Der hat sie doch nicht alle! Das soll unser erstes Date sein, und er will mich am Brandenburger Tor treffen?«
Ich, ganz Tinder-Idiotin: »Das ist doch schön, warum bist du so genervt?«
Maria: »Das bedeutet nur eins: Er will sich in den Menschenmassen verstecken, checken, ob ich seine ästhetischen Ansprüche erfülle, und falls nicht, einfach abhauen.«
Ich: »Oh! Das geht ja gar nicht … Aber woher weißt du das? Gibt’s da etwa auch einen Code für?«
Maria: »Tja, habe ich auch schon mal gemacht!« Sie sieht mich an und lacht.
Nicht nur Maschinen haben ihre besondere Syntax, Tinder-Nutzer scheinen auch komische Regeln zu befolgen, die nur sie verstehen. Wenn man sich für das erste Date auf einem öffentlichen Platz verabredet, dann bedeutet das, dass jemand dem Braten nicht traut und sicher sein will, schnell wegrennen zu können. Aha! Das klingt für mich wie ein »Erstes Date«-Algorithmus!
Fühlst du ihn auch, den Algorithmus?
Algorithmen sind nichts anderes als eine Reihung von einzelnen Schritten, um eine bestimmte Aufgabe zu lösen. Es handelt sich um eindeutige Handlungsvorschriften zur Lösung eines Problems. Für die Maschine ist ein Algorithmus etwas Abstraktes, deswegen brauchen wir Code, um die Handlungsvorschriften zur Lösung des Problems für die Maschine verständlich zu machen. Ein Algorithmus hat also keine Form, es kann mündlich mitgeteilt werden, in Form eines Flussdiagramms (wie in der nächsten Abbildung) oder in Form von Code. Bei Maria und ihren Tinder-Dates, zum Beispiel, geht es darum, den anderen auf Äußerlichkeiten zu bewerten, bevor das Treffen stattfindet. Der »Erstes Date«- Algorithmus könnte also so aussehen:
Abbildung 11: Der »Erstes Date«-Algorithmus
Hier sind die Schritte aufgelistet, die Tom abarbeiten möchte, wenn er Maria zum ersten Mal trifft. Ähnlich wie in diesem Beispiel, führen wir alle täglich solche Algorithmen durch. Ein Koch- oder Backrezept ist ein klassischer Algorithmus, auch dort werden die einzelnen Schritte nacheinander festgelegt. Da die Kochkünste nicht bei allen gleich ausgeprägt sind, ist es wichtig, die Schritte genau und eindeutig zu beschreiben, damit es zu keinen Missinterpretationen kommen kann. Im besten Fall ist das Rezept so geschrieben, dass es vollkommen egal ist, wer kocht, und das Ergebnis immer ein gleich leckeres Essen ist. Dafür sollten die Schritte immer in derselben Reihenfolge umgesetzt werden, und das Kochen sollte auch mal ein Ende haben – »Ordnung muss sein« und »In der Kürze liegt die Würze«. Damit hätten wir die vier erforderlichen Eigenschaften für einen guten Algorithmus erfüllt:
1 Determiniertheit: Bei jeder Ausführung mit gleichen Zutaten und Handlungen kommen wir zum gleichen Ergebnis. Wenn wir das Rezept für Reiscurry befolgen, kommt am Ende immer ein Reiscurry dabei heraus.
2 Determinismus: Zu jedem Zeitpunkt, von vorne bis hinten, ist immer klar,