Aufbau einer Programmiersprache

Die meisten Programmiersprachen haben einfache Grundregeln. Es gibt zwar hunderte, wenn nicht tausende von Programmiersprachen, doch der Großteil zeichnet sich dadurch aus, sich auf ein spezielles Problem spezialisiert haben. Die Ideen hinter den Programmiersprachen sind begrenzt.

Präprozessor / Makros

In vielen Umgebungen finden sich Präprozessoren oder Makros. Das sind im Prinzip nur Wortersetzungen: Findet man ein spezielles Wort, tauscht man es durch etwas anderes aus. In C ist dieser Präprozessor auch in der Lage, Unterscheidungen zu treffen, so dass sich das C/C++ Programm, das später ausgeführt wird, unterschiedlich zusammensetzt - zum Beispiel für das eine oder andere Betriebssystem spezialisiert.

#include <stdio.h>
#ifdef _WIN32
  /* Programmteile für Windows */
#else
  /* Programmteile für Unix */
#endif
#pragma

Diese Befehle werden ausgeführt, bevor der C/C++-Compiler den Sourcecode in die Finger bekommt. Man kann damit den Quelltext verändern, bevor das Programm kompiliert wird.

Schlüsselwörter

Programmiersprachen kennen üblicherweise eine Auswahl von Schlüsselwörtern. Manche Sprachen kennen hunderte sehr spezialisierter Schlüsselwörter, andere nur eine kleine Auswahl, die sich entsprechend kombinieren lassen. Die Sprache C beispielsweise verfügt über nur 32 Schlüsselwörter:

Schlüsselwörter
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while

Datenbeschreibungen

Auszeichungen

Unter einer Auszeichnung versteht man keinen Orden, es wird im Sinne von 'Beschreiben' verwendet. Es gibt Auszeichnungssprachen bzw. Beschreibungssprachen, die dem verarbeitenden Programm beschreiben, wie etwas aufgebaut wird. HTML zum Beispiel beschreibt dem Browser, wie eine Webseite aussehen soll. LaTeX beschreibt, wie ein Text-Dokument (Brief, Buch, …) gedruckt werden soll. Um wirkliche Programme ablaufen zu lassen, sind diese Auszeichnungssprachen aber nicht gedacht.

Datentypen

Computer können nur Daten speichern - wissen aber nicht, welche Bedeutung diese Daten haben. Um zu verhindern, dass Daten mit unterschiedlicher Bedeutung einfach vermischt werden (das berühmte Apfel mit Birnen vergleichen), erhalten sie Datentypen - eben Äpfel und Birnen. Beim Computer unterscheidet man vorrangig aber zwischen zählbaren und rationalen Zahlen (also Zahlen mit Komma).

In HTML wären die Datentypen vergleichbar mit Texttypen: beispielsweise Überschrift, normaler Text, vorformatierter Text.

Attribute

Attribute beschreiben die Datentypen detaillierter. So kann man Datentypen besondere Eigenschaften zusprechen bzw. versagen. Eine zählbare Zahl kann ein Vorzeichen haben oder eben nicht. Man kann ihr sagen, dass sie nur sehr klein sein darf und sie daher wenig Platz im Speicher benötigt oder dass man damit sehr weit zählen möchte, dafür aber dann auch mehr Speicher benötigt. Darf eine Zahl geändert werden oder ist sie konstant? Würde man die Zahl Pi laufend verändern, so würde das vermutlich zu keinem guten Ende führen. Also kann man mit einem Attribut festlegen, dass die Zahl Pi unveränderlich ist.

Auch hier der Vergleich zu HTML: Stünde der Datentyp für eine Überschrift, dann ist das Attribut, ob die Überschrift eine Kapitel oder Unterkapitelüberschrift wäre. Teilweise können Attribute, die sich nicht widersprechen auch kombiniert werden - zum Beispiel „veränderbare große Zahlen ohne Vorzeichen“.

Daten


Mit Datentypen und Attributen können Daten ausgezeichnet/beschrieben werden. Damit sind keine existierenden Daten gemeint, sondern eben, wie Daten aussehen, wenn man damit arbeitet. Schließlich arbeitet ein Programm in der Regel nicht nur mit einem Datensatz, sondern mit sehr vielen unterschiedlichen. Die Beschreibung ist gewissermaßen eine Kuchenform. Je nach Kuchenform fließt der Teig in eine eckige oder runde oder lammförmige Form. Nimmt man Teig für Marmorkuchen, kommt am Schluss ein Marmorkuchen heraus, nimmt man Teig für Zitronenkuchen, kommt am Schluss Zitronenkuchen aus dem Backofen. Der Teig steht somit für die zu verarbeitenden Daten, die dem Backofen in einer Form verabreicht werden, mit der der Backofen umgehen kann.

Mit den genannten Schlüsselwörtern können wir nun also beschreiben, wie ein Kuchen auszusehen hat, nur backen können wir ihn noch nicht. Dafür müssen wir den Teig, also die Daten, manipulieren. Handlungen, um Daten zu manipulieren, nennt man Operation. Die eigentliche Operation wird mit Hilfe eines Operators durchgeführt.

Damit man die Daten überhaupt im Speicher wiederfinden kann, gibt es Konstanten und Variablen, die im Prinzip nichts anderes sind, als Namen für bestimmte Daten. Die Zahl Pi zum Beispiel würde man „Pi“ nennen und dieser Name „Pi“ sagt der Programmiersprache, wo im Speicher die Daten stehen, die - wenn man sie als rationale Zahl betrachtet - den Wert 3,1415… darstellen. Wie gesagt - dem Computer ist vollkommen egal, was das für Daten sind. Wenn man ihm erklärt, dass die Zahl „Pi“ ein Buchstabe ist, würde er auch einen Buchstaben drucken… sehr unwahrscheinlich, dass dabei der griechische Buchstabe erscheinen würde… Es ist also wichtig, dass die Programmiersprache weiß, um welchen Datentyp es sich handelt, wenn sie im Speicher ein paar Einsen und Nullen betrachtet, wo der Name „Pi“ behauptet, dass da etwas sinnvolles stehen soll.

Operatoren

Operatoren sind gewissermaßen die Verben (Tu-Wörter) in einer Programmiersprache. Mit Operatoren kann man Fragen stellen (ist der Backofen heiß?) und Daten manipulieren (backe!). Da ein Computer allerdings nur Zahlen manipulieren kann, stehen in einer Programmiersprache erstmal nur Rechenoperationen zur Verfügung, zum Beispiel 'Addieren' und 'Multiplizieren', aber auch das Kopieren von Daten (Zuweisen). Mathematische Operatoren werden meistens durch entsprechende Symbole ausgedrückt, z.B. '+' für Addition. '*' für Multiplikation.

Man kann viele Operationen zusammenfassen, wie man es in der Mathematik auch macht. Diese Aneinanderreihung von Operationen heißen wie in der Mathematik 'Funktion' und erhalten wie Variablen und Konstanten einen Namen. Eine Funktion ist wie ein Operator: Wie 1+2 einen Wert zurückliefert, nämlich 3, liefert eine Funktionen einen Wert zurück mit dem anschließend weitergerechnet werden kann. So kann man sich eigene Operatoren selbst programmieren, die einen frei wählbaren Namen besitzen dürfen. Zum Beispiel einen „Backe“-Operator, der aus Daten vom Datentyp Teig neue Daten vom Datentyp Kuchen macht.

Man kann allerdings auch Operationen zusammenfassen, ohne dass man etwas zurück gibt. So könnte man ein beispielsweise für den Kuchen das Rezept in seine Handlungen unterteilen und diesen Handlungsablauf unter dem Namen backen zusammenfassen. Dies nennt sich Prozedur. Bei einer Prozedur werden Daten, die irgendwo stehen, bearbeitet und fertig. Eine Funktion liefert ein Ergebnis zurück, mit dem man weiterarbeiten kann.

Eine Funktion ist so ein vollwertiger Operator und lässt sich mit anderen Operatoren kombinieren, zum Beispiel: 1+2*3 Damit Operatoren in der richtigen Reihenfolge ausgeführt werden (hier Punkt vor Strichrechnung), gibt es für Operatoren eine Prioritätenliste. Zum Beispiel: Vor dem Essen Händewaschen! Natürlich kann man sich mit Klammern über Regeln hinwegsetzen und zum Beispiel die Punkt-Vor-Strichrechnung-Regel außer Kraft setzen: (1+2)*3 und auch mit Mutti kann man manchmal ja verhandeln. ;-) Bei Funktionen umklammert man die Eingabe: backe( Kuchenteig ), als Resultat bekommt man einen essbaren Kuchen zurück. Da man Operationen kombinieren kann, kann man das Resultat aus backe(), nämlich den fertigen Kuchen, gleich weiter verwerten:

esse( backe( Kuchenteig ) )

Dies hier könnte bereits gültiger C-Code sein, wenn man C beigebracht hat, was esse(), backe() und Kuchenteig ist. Und das geht bei Bedarf tatsächlich mit den 32 oben genannten Schlüsselwörtern.

Kontrollschlüsselwörter

In der Informatik ist es etwas einfacher auf Sonderbedingungen einzugehen, also auf Dinge, die kontrolliert werden müssen. So könnte man bei der Zubereitung des Teigs vielleicht einige Sonderbedingungen haben. Zitronen und Marmorkuchen benötigen viel Wasser, während ein Kuchen mit Apfelstücken weniger Wasser benötigt, weil ja in den Apfelstücken bereits Wasser enthalten ist.

Kontrollstrukturen erlauben Fallunterscheidungen: Wenn Fruchtkuchen, dann 300ml Milch zum Teig hinzufügen, sonst 400ml Milch zum Teig hinzufügen.

Kontrollstrukturen ermöglichen es anhand der zu verarbeitenden Daten, Handlungen auszuführen oder wegzulassen. Das ist vergleichbar mit Abenteuerbüchern, wo man eine Seite liest und anschließend eine Entscheidung treffen muss. Je nachdem wie man sich entscheidet, muss man auf der einen oder anderen Seite weiter lesen, um den Fortgang der Geschichte zu erfahren. Der Autor hat sich für alle Entscheidungen, die Du treffen kannst, eine Geschichte ausgedacht, aber entsprechend Deiner Entscheidungen werden Teile des Buches übersprungen. Das Buch ist gewissermaßen das Programm, entsprechend der Eingaben werden manche Teile des Programms abgelaufen, andere dagegen nicht.

Schlüsselwörter, die zur Kontrolle des Programmflusses dienen, geben keinen Rückgabewert zurück. Das unterscheidet sie von Operatoren.

Operatoren und Kontrollstrukturen sind Sprachelemente, die eine reine Auszeichnungssprache wie HTML nicht besitzt. Daher spricht man bei HTML auch nicht von 'Programmierung', sondern nur von 'Beschreiben'.

Ein Programmabschnitt, der einen Handlungsablauf abstrahiert, nennt man Algorithmus. Ein Kuchenrezept ist ein Algorithmus, denn da steht drauf, was man tun muss, um mit gegebenen Parametern (Milch, Mehl, Eier) ein Resultat (Kuchen) zu erzeugen.

Mit Operatoren und Kontrollstrukturen lassen sich Algorithmen schreiben, die auf unterschiedliche Daten eingehen können und passgenaue Lösungen anbieten können, wenn die Daten nicht wie üblich sind. Ein Kuchen kann in 30 Minuten gebacken werden oder man schreibt einen besseren Algorithmus und pickst mal rein, um zu sehen, ob der Teig innen schon fest ist.

Fazit

Zum Programmieren beschreiben wir die Daten, die wir mit Hilfe von Operatoren manipulieren wollen. Wie die Daten richtig zu manipulieren sind, können wir durch geschickte Fragestellungen kontrollieren.

Das Formulieren von Algorithmen ist die Kunst, die ein Software-Entwickler erlernen muss. Die Programmiersprache liefert die Worte, aber entscheidet nicht darüber, ob der Programmierer sich in der gewählten Programmiersprache rhetorisch geschickt ausdrücken und schöne und effiziente Algorithmen formulieren kann.

Es gibt verschiedene Programmiersprachen für verschiedene Probleme. Ein Abenteuerbuch ist anders geschrieben als ein Rezept und ein Rezept ist anders geschrieben als die Fehler-Tabelle für ein elektronisches Gerät (Symptom: LED aus? ⇒ Problem: kein Strom ⇒ Lösung: Stecker einstecken). Wenn man programmieren möchte, muss man sich also entscheiden, was man beschreiben möchte: ein Kuchenrezept, einen Abenteuerroman oder ein Expertensystem, das mit einem Frage-Antwortspiel ein Problem identifiziert (das heißt in der Informatik tatsächlich so).

Entsprechend sucht man sich die passende Programmiersprache aus.