7 2 Der Schnelleinstieg * Eine Programmiersprache können Sie auf verschiedene Art und Weise lernen. Sie können sich zuerst mit den Konzepten befassen und anschließend mit der Praxis oder umgekehrt. Damit Sie zunächst ein»gefühl«für das Programmieren bekommen, hat es sich bewährt, zunächst einige praktische Schritte zu tun, bevor die Konzepte erläutert werden. Vorher ist es jedoch erforderlich, zu wissen, was eine problemorientierte Programmiersprache und eine maschinennahe Sprache sind und was in einem Computersystem abläuft: Wie lernen? Zuerst einige Grundlagen»Programmieren Programme Compiler«(S. 8) Programme können auf unterschiedliche Art und Weise ausgeführt werden. Die Unterschiede zwischen compilierten und interpretierten Programmen lernen Sie hier kennen: Compiler vs. Interpreter»Skriptsprachen und Interpreter«(S. 17) Einiges Wissenswertes zur Programmiersprache Java finden Sie hier: Java»Die Sprache Java«(S. 22) Nach diesen Grundlagen kann es jetzt losgehen. Sie können das erste Java-Programm auf Ihrem Computersystem»zum Laufen bringen«: 1. Java- Programm»Das erste Java-Programm«(S. 25) Die meisten Programmiersprachen besitzen ähnliche Grundkonzepte. Einige dieser Grundkonzepte werden zunächst vermittelt und dann ihre Realisierung in Java gezeigt: Programmiergrundlagen»Konzepte der Programmierung«(S. 35) Gruppierung
8 2 Der Schnelleinstieg * Um komfortabel programmieren zu können, wird eine Programmierumgebung benötigt. Einen Überblick und den ersten Einsatz einer Java-Umgebung finden sie hier: Programmierumgebungen»Java-Entwicklungsumgebungen«(S. 64) Nach dem Durcharbeiten aller dieser Wissensbausteine haben Sie einen ersten Eindruck von der Programmierung in Java, haben Ihre ersten Erfahrungen mit dem Java-Compiler und einer Java-Entwicklungsumgebung gemacht und können einige kleinere Programme bereits selbst schreiben. 2.1 Programmieren Programme Compiler * Ein Computersystem besteht im Kern aus einem Prozessor und einem Arbeitsspeicher. Programme und Daten befinden sich im Arbeitsspeicher. Der Prozessor führt schrittweise die Befehle eines Programms im Arbeitsspeicher aus und manipuliert dabei die Daten. Die von einem Prozessor ausführbaren Programme sind in einer Maschinensprache geschrieben, die auf die Eigenschaften des jeweiligen Prozessors zugeschnitten ist. Programmierer verwenden dagegen problemorientierte Programmiersprachen, die dem Abstraktionsniveau von Menschen angepasst sind. Übersetzer genauer ausgedrückt Compiler übersetzen problemorientierte Programme in Maschinenprogramme. Programmieren ist faszinierend. Einem Computersystem zu sagen, was es zu tun hat, ist eine tolle Sache! Vinton G. Cerf, Miterfinder des Internets, hat dies einmal so ausge-
2.1 Programmieren Programme Compiler * 9 drückt:»programming is like playing God. Within the scope of the program you can do anything.«damit ein Computersystem das tut, was der Programmierer will, muss er ein Programm schreiben. Ein Programm ist dabei nichts anderes als eine Handlungsanleitung für ein Computersystem. Damit ein Computersystem ein Programm»versteht«genauer gesagt, es Schritt für Schritt ausführen kann muss es bestimmte Eigenschaften besitzen: Ein Programm muss in einer genau festgelegten Schreibweise dem Computersystem eindeutig und detailliert durch Anweisungen vorschreiben, was es Schritt für Schritt tun soll. Die Syntax, d.h. die Schreibweise der einzelnen Anweisungen, und die Semantik, d.h. die Bedeutung der einzelnen Anweisungen, wird für Programme in Programmiersprachen festgelegt. Es gibt problemorientierte Programmiersprachen (auch benutzernahe oder höhere Programmiersprachen genannt), maschinennahe Programmiersprachen und Maschinensprachen. Syntax & Semantik problemorientiert vs. maschinenah Problemorientierte Programmiersprachen wurden so konzipiert, dass es Menschen möglichst einfach haben, Programme zu schreiben. Maschinennahe Programmiersprachen sind dagegen so aufgebaut, dass ihre Programme nahezu unverändert in Maschinensprachen transformiert werden können. Programme in einer Maschinensprache können direkt von Computersystemen ausgeführt werden. Ein Computersystem besteht vereinfacht ausgedrückt aus einem Prozessor und einem Arbeitsspeicher, beides zusammen wird als Zentraleinheit bezeichnet. Die Zentraleinheit kommuniziert über eine Ein-/Ausgabesteuerung mit Prozessor & Arbeitsspeicher
10 2 Der Schnelleinstieg * Eingabegeräten wie Tastatur und Maus Ausgabegeräten wie Bildschirm, Lautsprecher und Drucker externen Speichern wie Festplatten, DVDs, CD-ROMs und über Netze mit anderen Computersystemen (Abb. 2.1-1). Abarbeitung eines Programms Beispiel 1 Ein Maschinenprogramm auch Objekt-Programm genannt wird in den Arbeitsspeicher transportiert (geladen). Der Prozessor liest jede Anweisung Befehl genannt und führt ihn aus. Daten werden ebenfalls im Arbeitsspeicher aufbewahrt. Der Prozessor kann die Daten lesen, speichern und über die Ein-/Ausgabesteuerung einlesen und ausgeben. Die Berechnung eines Warenwertes aus Einzelpreis mal Menge kann folgendermaßen aussehen: In einer problemorientierten Programmiersprache sehen die Anweisungen zur Berechnung wie folgt aus (Quell-Programm genannt): read(menge); read(preisnetto); read(mwst); WarenwertNetto = Menge * PreisNetto; WarenwertBrutto = WarenwertNetto * MWST / 100.0; print(warenwertbrutto); In einer maschinennahen Programmiersprache sehen die Befehle zur Berechnung so aus: INPUT Menge INPUT PreisNetto INPUT MWST LOAD Menge MUL PreisNetto STORE WarenwertNetto LOAD WarenwertNetto MUL MWST DIV 100.0 STORE WarenwertBrutto OUTPUT WarenwertBrutto
2.1 Programmieren Programme Compiler * 11 andere Computer Netzanschluss, z.b. Modem ISDN-Karte Netzwerk-Karte Eingabegeräte, z.b. Tastatur Maus Mikrophon Scanner digitaler Fotoapparat Videokamera Ausgabegeräte, z.b. Bildschirm Lautsprecher Drucker externe Speicher, z.b. Festplatte Speicherstick CD-ROM DVD Diskette Peripheriegeräte Drucker Laufwerke: DVD CD-ROM Diskette Scanner Fenster Tastatur Bildschirm Lautsprecher (integriert) Netzanschluss Maus Abb. 2.1-1: So sieht der grundsätzliche Aufbau eines Computers mit seinen Komponenten aus.
12 2 Der Schnelleinstieg * Vor der Ausführung im Prozessor wird ein maschinennahes Programm noch in ein Maschinenprogramm transformiert. Ein Maschinenprogramm wird in einem Binärcode dargestellt. Ein Binärcode kennt nur die beiden Zeichen 0 und 1 Binärzeichen genannt. Das Wort Binärzeichen wird als Bit bezeichnet, von englisch binary digit. Plattform Übersetzer Compiler to compile = zusammenstellen, sammeln Übersetzungsvorgang Maschinennahe Programmiersprachen und Maschinensprachen sind im Gegensatz zu problemorientierten Programmiersprachen immer auf eine Computer-Plattform zugeschnitten. Eine Plattform ist gekennzeichnet durch den jeweils verwendeten Prozessortyp z.b. Intel Pentium 4 und das eingesetzte Betriebssystem. Unterschiedliche Plattformen besitzen auch unterschiedliche maschinennahe Sprachen und Maschinensprachen. Damit ein Programmierer in einer problemorientierten Sprache programmieren kann, gibt es Übersetzer. Allgemein ist es die Aufgabe eines Übersetzers in der Informatik, alle Sätze einer Quellsprache, d.h. die Quell-Programme, in gleichbedeutende Sätze einer Zielsprache, die Ziel-Programme, zu transformieren. Ist das Quellprogamm in einer problemorientierten Programmiersprache geschrieben, dann bezeichnet man den Übersetzer als Compiler. Bei der Zielsprache kann es sich dabei um eine maschinennahe, eine»maschinennähere«sprache oder eine Maschinensprache handeln.»maschinennähere«sprache bedeutet, dass die Sprache sich stärker am Aufbau eines Computersystems orientiert als die Sprache, aus der übersetzt wird. Abb. 2.1-2 veranschaulicht den Übersetzungsvorgang.
2.1 Programmieren Programme Compiler * 13 Abb. 2.1-2: Der Mensch schreibt Programme in einer problemorientierten Programmiersprache. Ein solches Programm wird von einem Compiler in ein maschinennahes Programm übersetzt. Nach der Transformation in ein Maschinenprogramm wird es vom jeweiligen Prozessor ausgeführt. Ein Compiler übersetzt also die problemorientierte Pro- Beispiel 2 grammdarstellung im Beispiel 1 in die darunter angegebene maschinennahe Form. Der Einsatz eines Compilers hat folgende Vor- und Nachteile: Die übersetzten Programme nutzen die jeweiligen Prozessor- bzw. Plattformeigenschaften optimal aus und erreichen dadurch eine hohe Abarbeitungsgeschwindigkeit. Für jeden Prozessortyp muss das Programm mit einem anderen Compiler neu übersetzt werden. Genau genommen unterscheiden sich die Compiler nicht nur bezüglich des Prozessortyps, sondern bezüglich der jeweiligen Computer-Plattform. Das übersetzte Programm läuft nur auf dem jeweiligen Prozessortyp bzw. der jeweiligen Plattform, d.h. das übersetzte Programm ist nicht plattformunabhängig. Vorteil Nachteile
14 2 Der Schnelleinstieg * Oft gibt es für verschiedene Prozessortypen bzw. Plattformen nur Compiler unterschiedlicher Hersteller, die sich teilweise unterschiedlich verhalten. Programmiersprachen sind oft nicht plattformunabhängig definiert, so dass pro Prozessortyp bzw. Plattform die übersetzten Programme voneinander abweichen. Vom Problem zum Programm Beispiel 3 Programme sind in der Regel sehr umfangreich und komplex. Liegt fest, welches Problem durch ein Programm gelöst werden soll, dann werden Sie meist nicht sofort das fertige Programm hinschreiben. Oft wird die Problemlösung zunächst in Form eines Algorithmus hingeschrieben. Ein Algorithmus ist semiformal, d.h. er ist im Gegensatz zur Umgangssprache genauer beschrieben, aber noch nicht vollständig detailliert, wie dies eine Programmiersprache erfordert (Abb. 2.1-3). Umgangssprachlich in Form eines Algorithmus würde das Beispiel 1 folgendermaßen aussehen: 1. Lese Menge, PreisNetto und MWST ein 2. Berechne: WarenwertNetto = Menge * PreisNetto 3. Berechne: WarenwertBrutto = WarenwertNetto * MWST / 100 4. Gebe WarenwertBrutto aus
2.1 Programmieren Programme Compiler * 15 Umgangssprache komplex mehrdeutig menschliche Tätigkeit Algorithmische Sprache semiformal noch nicht vollständig detailliert menschliche Tätigkeit Problemorientierte Programmiersprache exakter Formalismus meist genormt unabhängig von einem bestimmten Prozessor Aufgabe des Compilers Maschinennahe Sprache primitiv abhängig vom jeweiligenprozessor Problem Algorithmus Programm (Quell-Programm) Maschinennahes Programm Maschinensprache direkt vom Prozessor ausführbar Maschinen- Programm (Objekt-Programm) Abb. 2.1-3: Ausgangspunkt für ein Programm ist ein zu lösendes Problem bzw. eine zu lösende Aufgabe. Als erstes wird die Problemlösung umgangssprachlich als Algorithmus formuliert. Anschließend erfolgt die Umsetzung in den strengen Formalismus (Syntax) einer Programmiersprache. Ein Compiler übersetzt dann ein solches problemorientiertes Programm in ein Maschinenprogramm.
16 2 Der Schnelleinstieg * Glossar Algorithmus (algorithm) Intuitiv lässt sich der Begriff Algorithmus folgendermaßen definieren: Ein Algorithmus ist eine eindeutige, endliche Beschreibung eines allgemeinen, endlichen Verfahrens zur schrittweisen Ermittlung gesuchter Größen aus gegebenen Größen. Die Beschreibung erfolgt in einem Formalismus mit Hilfe von anderen Algorithmen und, letztlich, elementaren Algorithmen. Ein Algorithmus muss ausführbar sein, d.h. ein Prozessor, der den Formalismus kennt und die elementaren Algorithmen beherrscht, muss ihn abarbeiten können. Bei der Ausführung eines Algorithmus werden Objekte manipuliert, insbesondere erfolgt eine Ein- und Ausgabe von Objekten. Arbeitsspeicher (RAM; random access memory) Medium zur kurzfristigen Aufbewahrung nicht zu umfangreicher Information in einem Computer; Bestandteil der Zentraleinheit. Betriebssystem (operating system) Spezielles Programm eines Computersystems, das alle Komponenten eines Computersystems verwaltet und steuert sowie die Ausführung von Aufträgen veranlasst. Syn.: OS Compiler (compiler) Ein kompliziertes Programm, das Quell- Programme, geschrieben in einer problemorientierten Programmiersprache, in Objekt-Programme (Sprachvorrat des automatischen Prozessors) umwandelt; Sonderfall eines Übersetzers. Computersystem (computer system) 1 Computer (Hardware) und Programme (Software). 2 Einheit von Anwendungssoftware, Systemsoftware und Hardware. Plattform (platform) Hardware- Architektur eines bestimmten Modells oder einer bestimmten Familie von Computersystemen, z.b. Windows-Plattform. Eine Plattform ist in der Regel eine Kombination aus Betriebssystem und Prozessortyp (Prozessor). Software wird in der Regel für eine Plattform entwickelt (siehe auch: Systemsoftware). Syn.: Computer-Plattform, computer platform Problemorientierte Programmiersprache (problem oriented programming language) Programmiersprache, deren Sprachvorrat und Sprachkonstruktion problemnahe Formulierungen von Algorithmen ermöglicht; Programme müssen von einem Compiler in die Maschinensprache des jeweiligen Prozessors umgesetzt werden, damit eine automatische Abarbeitung möglich ist. Alternativ können Programme auch durch Interpreter analysiert und ausgeführt werden. Syn.: Höhere Programmiersprache, Benutzernahe Programmiersprache Programm (program) 1 Streng formalisierte, eindeutige und detaillierte Handlungsanleitung bzw. Vorschrift, die maschinell ausgeführt werden kann. 2 Eine Folge von Anweisungen in einer Programmiersprache oder in einer Maschinensprache. Die Anweisungen werden von einem Prozessor abgearbeitet. Prozessor (processor; centralprocessing unit) 1 Allgemein: Eine Maschine, die die Anweisungen eines Programms abarbeiten kann
2.2 Skriptsprachen und Interpreter * 17 2 Speziell: Der Teil der Zentraleinheit, der Programmanweisungen aus dem Arbeitsspeicher liest, ihre Ausführungen vornimmt, zu verarbeitende Informationen aus dem Arbeitsspeicher liest sowie Zwischenergebnisse und Ergebnisse im Arbeitsspeicher ablegt. Zentraleinheit (central unit) Teil eines Computers, in der die eigentliche Informationsverarbeitung stattfindet; besteht aus Prozessor und Arbeitsspeicher. 2.2 Skriptsprachen, Zwischensprachen und ihre Interpreter * Ein Programm, geschrieben in einer problemorientierten Programmiersprache, kann compiliert oder interpretiert werden. Ein Compiler kann ein Programm in eine maschinennahe Programmiersprache übersetzen oder in eine Zwischensprache, die dann interpretiert wird. Ein Programm kann auch direkt durch einen Interpreter ausgeführt werden. Programmiersprachen lassen sich in drei Gruppen gliedern, in Abhängigkeit von der Art und Weise wie ihre Programme ausgeführt werden: Programmiersprachen, deren Programme durch einen compilierte Programme Compiler in eine maschinennahe Sprache bzw. eine Maschinensprache übersetzt und dann ausgeführt werden. Zu dieser Gruppe gehört z.b. die Sprache C++. Programmiersprachen, deren Programme Anweisung für Anweisung interpretiert und wenn die jeweilige Anweisung syntaktisch korrekt ist sofort ausgeführt werden. Es erfolgt keine Übersetzung in eine maschinennahe Sprache oder eine Maschinensprache. Solche Sprachen heißen Skriptsprachen. Interpreter analysieren die Anweisun- interpretierte Programme