2. Was ist ein Programm?

Ein Programm ist eine Abfolge von Anweisungen, die festlegen, wie ein Problem zu lösen ist. Man kann Anweisungen nach ihrer Funktion gruppieren:

  • Eingabe (das Programm besetzt Variablen mit Daten von der Platte, dem Netz, der Benutzerin)
  • Verarbeitung (Rechnen)
  • Ausgabe
Die Abfolge der einzelnen Anweisungen wird durch Kontrollstrukturen gesteuert. Üblicherweise unterscheidet man hier drei Typen:
  • Sequenz (lineare Abfolge von Anweisungen)
  • Selektion (Anweisungen nur in Abhängigkeit von bestimmten Bedingungen ausführen)
  • Iteration (Anweisungen mehrfach hintereinander ausführen)

Aus diesen Elementen kann man Algorithmen bauen und daraus Programme:

name = raw_input("Name? ")
if name:
  for c in name:
      print c
else:
  print "Spielverderber"

Ausführen von Programmen (Skripten) durch Aufruf des Python-Interpreters:

python erstes.py

wenn wir das Programm in die erstes.py geschrieben haben und in einer shell sind.

Shells

Wie ihr auf eurem System eine Shell bekommt, hängt davon ab, was euer System ist – unter Unix ist es meistens einfach, ein “Terminalfenster” zu bekommen, unter Windows gibts unter “Zubehör” oder ähnlich eine “Kommandozeilenaufforderung” oder ähnlich. Speziell unter Windows ist es gut möglich, dass die Shell den Python-Interpreter nicht findet. Es sollte dann möglich sein, das Programm mit “start erstes.py” laufen zu lassen, doch ist das nur eine Notlösung – findet heraus, wie ihr den Python-Interpreter in euren Pfad bekommt. Die TutorInnen helfen euch ggf. dabei.

Je nach dem, was für ein Entwicklungssystem benutzt wird, gehen auch andere Methoden (auch wenn ihr in jedem Fall sehen solltet, dass ihr mit der Shell zurechtkommt, schon allein, damit ihr nicht völlig von eurer speziellen Umgebung abhängig seid). In IDEs (Integrated Development Environments) gibt es beispielsweise einen Menüpunkt “Run” oder ähnlich.

Unter Unix kann man #!/x/y/z/python (dabei müsst ihr /x/y/z durch den Pfad zu eurem Python-Interpreter ersetzen, meist ist das /usr/bin – wenn es das nicht ist, solltet ihr selbst wissen, was es ist) oder #!/usr/bin/env python (hier sucht das System selbst nach dem Interpreter) in die erste Zeile schreiben, dann mit Kommando chmod +x erstes.py das System überreden, das Skript als ausführbare Datei zu akzeptieren und muss nur noch erstes.py schreiben, um das Programm zu starten.

Schließlich kann man in grafischen Benutzeroberflächen auch einfach auf das Datei-Icon klicken, hat dann aber gerne das Problem, dass die Ausgabe des Programms verschwindet, bevor sie zu lesen ist. Im allergrößten Notfall könnt ihr ein raw_input() an das Ende eures Skripts schreiben, dann wartet das System auf eine Eingabe, bevor es das Fenster schließt.

Interpreter und Code

Dass ihr ohne weitere Vorkehrungen ein Python-Programm nicht “einfach aufrufen” könnt, liegt daran, dass die Herzen von Computern (die CPUs, Central Processing Units oder einfach Prozessoren sehr schlicht gebaut sind. Sie wissen (fast) nichts von Schleifen und Variablen, nichts von Tastaturen und Monitoren – was, genau betrachtet, auch gar nicht so schlecht ist, denn die meisten Computer haben gar keine Tastaturen (etwa die in Autos, Kaffeemaschinen und Routern).

Was so eine CPU wirklich versteht, muss für Menschen immer irgendwie “repräsentiert” werden. Eine Darstellung, die recht nah an der Maschine ist, könnt ihr auf vielen Unix-Maschinen mit dem Programm xxd bekommen – das Programm zu Anzeigen eines Verzeichnisinhalts sieht damit etwa so aus:

> xxd /bin/ls | more
[...]
0002ba0: 0508 a188 a405 0889 1534 a005 08a3 30a0  .........4....0.
0002bb0: 0508 e919 fbff ff8b 1508 a405 08b8 0100  ................
0002bc0: 0000 85d2 7538 31db 83f8 0174 2a83 f802  ....u81....t*...
0002bd0: 7415 891d 98a4 0508 85db 0f84 f0fa ffff  t...............
0002be0: 31c0 e9e2 fcff ffc7 0424 0100 0000 e851  1........$.....Q
0002bf0: edff ff85 c074 dbbb 0100 0000 ebd4 8954  .....t.........T
0002c00: 2404 a1cc a005 08b9 806b 0508 894c 2408  $........k...L$.
[...]

(das ist nur ein kleiner Ausschnitt). Es ist klar, dass so (in “Hexcode”) niemand ernsthaft programmieren will. Deshalb haben InformatikerInnen seit langer Zeit versucht, Rechner dazu zu bringen, etwas menschen- oder jedenfalls anwendungsgerechtere Sprachen zu verstehen. Die Ergebnisse dieser Bemühungen sind vielfältig. Die Sprache, mit der wir uns hier beschäftigen, Python eben, ist dabei relativ weit vom Rechner abstrahiert (im nächsten Semester werden wir uns mit C beschäftigen, das näher an der Maschine bleibt – was nicht nur von Nachteil ist).

Weil aber Python eben nicht die Sprache ist, die der Rechner versteht, muss dem Rechner erklärt werden, was wir meinen, wenn wir “print” schreiben oder “for c in name”. Diese “Erklärung” bekommt der Rechner in Form eines Programms, das Python in das Kauderwelsch des Prozessors übersetzt, eines Interpreters (was auf Englisch auch nur Übersetzer oder Dolmetscher bedeutet). Also: Das Programm python, das wir oben aufgerufen haben, ist nichts als ein Dolmetscher zwischen Python (das wir jedenfalls im Prinzip ganz gut verstehen können) und dem, was der Rechner versteht.

Die Dateien mit dem Quellcode werden in der Regel in ganz normalen Editoren – etwa emacs, vi oder auch notepad – geschrieben, besagte IDEs bringen eigene Editoren mit. Word und Co könnten zwar im Prinzip auch verwendet werden, aber einerseits will mensch zum wirklichen Programmieren doch etwas mehr von einem Editor als die üblichen Office-Programme so bieten, und andererseits muss mensch aufpassen, dass diese Programme, die ihre Dokumente üblicherweise in wilden Binärformaten (was meist so aussieht wie das Kauderwelsch oben) speichern, tatsächlich ganz normalen, “nackten” Text schreiben. Also: tuts nicht.

Details in den Tutorien.

Ergebnis:

examples> python erstes.py
Name? Bla
B
l
a
examples> python erstes.py
Name?
Spielverderber

Da Programm python ein Interpreter ist, kann es Anweisungen auch interaktiv ausführen. Ein ganz kleines Programm:

examples> python
Python 2.2 (#1, Feb 11 2002, 12:19:15)
[GCC 2.95.3 20010315 (release)] on linux2
Type "help", "copyright"...
>>> print "Hello world"
Hello world

Gegensatz: Compiler. Während ein Interpreter etwa so funktioniert wie ein Simultandolmetscher und das, was ihr sagt, unmittelbar dem Rechner verständlich macht, funktioniert ein Compiler eher wie ein Übersetzer: Er nimmt eure Eingabe und übersetzt sie in einem Rutsch. Das Ergebnis ist eine Datei, die Kauderwelsch enthält, das der Rechner versteht – etwa wie ein menschlicher Übersetzer, der als Ergebnis ein Buch in der Zielsprache in Händen hält.

Compiler machen die Programmentwicklung mühsamer, führen aber in der Regel zu schneller laufenden Programmen. In Programmieren II werden wir uns damit auseinandersetzen.

(Weiterführend:) Die üblichen Python-Implementationen sind, das nur nebenbei, nicht eigentlich klare Interpreter, sondern Bytecode-Compiler, die sozusagen Maschinencode für eine gar nicht real existierende Maschine erzeugen. Diese Maschine wird dann auf dem realen Computer emuliert. Sinn der Sache ist, zwar einige Vorteile des Kompilierens zu behalten, aber die Beschränkungen realer Hardware nicht so deutlich zu spüren.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Macht euch (ggf. mit Hilfe eurer TutorInnen) mit eurem Python-System vertraut. Es schadet nichts, das zunächst auf den Rechnern bei uns im Pool zu machen, denn dort läuft alles so wie hier beschrieben. Gebt das Beispiel-Programm mit einem Texteditor ein, lasst das Programm laufen, seht nach, was es bei verschiedenen Eingaben so tut. Schreibt etwas wie "mein String", vor das c mit ersten print-Statement und seht, was dann passiert.

(2)

Ihr könnt im Python-Interpreter rechnen. Ruft also einfach nur das Python-Programm auf und probiert aus, was der Interpreter sagt, wenn ihr 4+5 oder 2.3/3 tippt. Probiert aus, was die Maschine sagt, wenn ihr demgegenüber print 2.3/3 sagt. Der Unterschied ist übrigens gerade der zwischen der “Repräsentation” und der “Ausgabe” des Ergebnisses – wir werden später darauf zurückkommen.


Markus Demleitner

Copyright Notice