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. Wie lernen? Vorher ist es jedoch erforderlich, zu wissen, was eine problemorientierte Programmiersprache und eine maschinennahe Sprache sind und was in einem Computersystem abläuft: 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. JavaProgramm »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 Programmierumgebungen 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: »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- Basistext 9 2.1 Programmieren – Programme – Compiler * 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. Syntax & Semantik Es gibt problemorientierte Programmiersprachen (auch benutzernahe oder höhere Programmiersprachen genannt), maschinennahe Programmiersprachen und Maschinensprachen. 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 Basistext 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 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. Beispiel 1 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 Basistext 11 2.1 Programmieren – Programme – Compiler * 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. Basistext 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 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. Übersetzer 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. Compiler to compile = zusammenstellen, sammeln 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. Übersetzungsvorgang Abb. 2.1-2 veranschaulicht den Übersetzungsvorgang. Basistext 13 2.1 Programmieren – Programme – Compiler * 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 Programmdarstellung im Beispiel 1 in die darunter angegebene maschinennahe Form. Beispiel 2 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. Vorteil 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. Nachteile Basistext 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 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). Beispiel 3 Umgangssprachlich in Form eines Algorithmus würde das Beispiel 1 folgendermaßen aussehen: 1. 2. 3. 4. Basistext Lese Menge, PreisNetto und MWST ein Berechne: WarenwertNetto = Menge * PreisNetto Berechne: WarenwertBrutto = WarenwertNetto * MWST / 100 Gebe WarenwertBrutto aus 2.1 Programmieren – Programme – Compiler * Umgangssprache 15 Problem komplex mehrdeutig menschliche Tätigkeit Algorithmische Sprache Algorithmus semiformal noch nicht vollständig detailliert menschliche Tätigkeit Problemorientierte Programmiersprache Programm (Quell-Programm) exakter Formalismus meist genormt unabhängig von einem bestimmten Prozessor Aufgabe des Compilers Maschinennahe Sprache primitiv abhängig vom jeweiligenProzessor Maschinensprache direkt vom Prozessor ausführbar Maschinennahes Programm MaschinenProgramm (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. Basistext 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 QuellProgramme, 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). Basistext 2 Einheit von Anwendungssoftware, Systemsoftware und Hardware. Plattform (platform) HardwareArchitektur 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; central processing unit) 1 Allgemein: Eine Maschine, die die Anweisungen eines Programms abarbeiten kann 17 2.2 Skriptsprachen und Interpreter * 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 Compiler in eine maschinennahe Sprache bzw. eine Maschinensprache übersetzt und dann ausgeführt werden. Zu dieser Gruppe gehört z.B. die Sprache C++. compilierte Programme 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 Basistext