Nach diesem Streifzug durch einige einführende Beispiele stellt sich die Frage, was "Programmieren" überhaupt sein soll?
Die einfachste Antwort ist, dass es die
Übersetzung eines Algorithmus in eine für die Maschine (aka "Computer") verständliche Form ist.
Was ist dann ein Algorithmus?
Das ist eine Vorschrift, wie ein ein gegebenes Problem mittels klar definierter Anweisungen gelöst werden kann.
Wichtig ist, dass jeder Schritt explizit und direkt abläuft, und sie jeweils auf eindeutigen und klaren Definitionen basieren. Jede Ausführung des Algorithmus basiert auf Eingabedaten, welche die jeweilige Instanz des zu lösenden Problems bestimmen. Nur auf Basis dieser Daten kann das Ergebnis berechnet werden. Abschließend sollte die Ausgabe des Ergebnisses wieder in einer für den Menschen lesbaren Form geschehen (Textdatei, Grafik, ...).
Eine Programmiersprache ist das Zwischenstück, um einem Computer so einen Algorithmus beizubringen. Es handelt sich damit um das Kernelement, warum Computer überhaupt für den Menschen nutzbar wurden und warum sie so eine hohe Flexibilität aufweisen.
Mittels der Programmiersprache muss es möglich sein,
sowohl die Eingeabedaten als auch den Ablauf des Algorithmuses repräsentieren zu können.
Intern verarbeitet ein Computer ausschließlich binär codierte Daten und Befehle,
welche für den Menschen nicht aussagekräftig sind.
Dies sind die sogenannten "Bits", welche True
/False
bzw. 1
/0
Werte annehmen können.
8er Gruppen von Bits sind Bytes und Gruppen von Bytes werden zum Repräsentieren von Text, Zahlen und Rechenoperationen verwendet.
Daher ist es wichtig zu verstehen, dass der Zweck einer Programmiersprache darin besteht, eine für den Menschen lesbare Form des Programmes anzugeben, welche dann in eine für die Maschine verständliche Form übersetzt oder interpretiert wird.
Um den Ablauf des Algorithmus im Detail programmieren zu können, muss eine imperative Programmiersprache Kontrollstrukturen (engl. "control structures") bereitstellen. Der lineare Ablauf einer Liste von Befehlen wird dabei zu einem komplexeren Ablauf, welcher aus
besteht.
Da sich während des gesamten Ablaufs Teilstrukturen wiederholen können, gibt es für prozedurale Programmiersprachen die Möglichkeit, den gesamten Code in kleinere Blöcke zu separieren und nach Bedarf aufzurufen. Das wird "Funktion" genannt.
Die Kunst besteht darin, diese Basiselemente geschickt zu kombinieren, damit das Programm für alle zulässigen Eingabewerte das richtige und gewünschte Ergebnis ausgibt.
Daten in einem Programm bestehen aus elementaren Basistypen und daraus zusammengestellten Datenstrukturen.
In Python sind die wichtigsten Basistypen:
True
oder False
.None
ist der Wert, der für nichts/leer steht.231425232
3.1415
, mit Basis und Exponenten, also 3e9
steht für $3 \times 10^9$.Darüber hinaus gibt es auch noch komplexe Zahlen, z.B. 2+3j
(j
ist die Wurzel aus -1)
Eine gute Repräsentation der Daten ist die zweite elementare Zutat für ein Programm. Im elementarsten bestehen Daten aus binären Datenblöcken, welche durch eine Namensgebung für den Programmierer eine Bedeutung bekommen (Variablenwert und Variablenname). Diese Datenblöcke können zu komplexeren Strukturen zusammengesetzt werden:
Werden bestimmte Datenstrukturen immer wieder verwendet,
so bietet die Programmiersprache Python sogenannte "Klassen" (engl. class
) an,
um diese Strukturen einen Namen zu geben und auf Abruf immer wieder verwenden zu können.
Dies sind benannte Strukturen, welche neben den Daten auch darauf abstimmte Funktionen beinhalten können - diese Funktionen nennt man dann "Methoden".
So eine benannte Datenstruktur ist dann ein Datentyp,
welcher erlaubt komplexere Konzepte in einem für den Menschen verständliche Art zu implementieren --
wobei gleichzeitig die darunterliegende Binärstruktur für den Computer verständlich bleibt.
Ein Bruch besteht aus einem Nenner und einem Zähler,
welche jeweils Ganzzahlen sein sollen.
Ein Datentyp "Bruch
" fasst nun diese beiden Ganzzahlen zusammen.
Eine mit diesem Datentyp assoziierte Funktion "add
" würde es erlauben,
zwei Brüche korrekt miteinander zu addieren,
indem add
als Argument einen anderen Bruch erhält und die Rückgabe dieser Methode ein neuer Bruch
-- eben die Summe -- ist.