CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik) Programme Erstellen und Ausführen Seite 1 Th Letschert Programme Erstellen Lebenszyklus der Software – Software werden in mehreren voneinander abgegrenzte Phasen erstellt. – Man erhält einen Softwarelebenszyklus, einen so genannten Software Life Cycle. – Es gibt keinen allgemein akzeptierten Ablauf des Softwarelebenszyklus Einigkeit herrscht nur über die prinzipiellen Tätigkeitsklassen Analyse: Was ist überhaupt zu tun Entwurf: Wie wollen wir es machen Implementierung: Programm(e) schreiben Test: Prüfen Wartung: Verbesserungen, WeiterEntwicklungen Das klassische Wasserfall-Modell: Zeitliche Abfolge der Phasen das Spiral-Modell: In einander verschränkte Phasen Seite 2 Programme Erstellen Phasen in der SW-Entwicklung Wie wird der Text (Quellcode) der Programme erstellt und gepflegt Problemanalyse (Anforderungs- / Systemanalyse) – Analyse des Problemfeldes und der Aufgabenstellung – Ergebnis: Anforderungsbeschreibung (= Pflichtenheft) Systementwurf – Aufteilung der Aufgabe/Lösung in so genannte Module aufgeteilt – Ergebnis: Systemspezifikation Programmentwurf – Module werden zu Programmstrukturen ausgearbeitet – Ergebnis: mehrere Spezifikationen Implementierung und Test – Module werden programmiert und getestet (verifiziert) – Ergebnis: aus getesteten Modulen zusammengesetztes Programm Betrieb und Wartung – Pflege der Software: Fehlerbeseitigung, Erweiterungen und Änderungen Seite 3 Programme Übersetzen und Ausführen Programm-Ausführung Wie wird der Text (Quellcode) der Programme zu Aktionen eines Computers Programm – Festlegung von Aktionen – in einer exakt festgelegten Notation Interpreter – liest das Programm und befolgt dessen Anweisungen – Varianten Hardware (CPU, Prozessor) Programm wird durch Hardware ausgeführt die Basis aller Programmausführung Software (Programm) Programmausführung durch ein Programm Seite 4 Programmausführung durch Hardware Rechner – Aufbau und Arbeitsweise externer Speicher Rechner – Prinzipieller Aufbau – Externer Speicher (Festplatte): Enthält Daten und Programme – Arbeitsspeicher / RAM: Enthält Daten und Programme mit denen – Prozessor: führt Anweisungen (Befehle) aus Prozessor (CPU) – – – – Lädt Befehle (Sequenzen von Bits) aus Arbeitsspeicher in Register Lädt Operanden (Sequenzen von Bits) in Register Führt Befehle aus: ändert Bit-Sequenzen in Registern Speichert Werte in Registern im Hauptspeicher Arbeitsspeicher CPU Hauptspeicher CPU 3 Befehl 1 Daten Daten 2 Befehl Befehl Befehl Daten Dasten Daten 4 ... ... Seite 5 1. Befehl laden 2. Daten laden 3. Befehl ausführen 4. Daten speichern Programmausführung durch Hardware Steuerwerk ALU Register Prozessor Aufbau ALU (Arithmetic Logical Unit) Rechenwerk für mathematische / logische Operationen (Arbeits-) Register Speicherplätze für Daten innerhalb des Prozessors. Die ALU rechnet mit den Werten, die sich in den (Arbeits-) Registern befinden. Steuerwerk Kontrolle der Ausführung, nutzt dabei spezielle Register Befehlszählerregister Befehlsregister … Bus / Datenleitung Busse (= “Leitungen“) verbinden die CPU mit anderen Komponenten Datenbus: Austausch von Daten mit dem Arbeitsspeicher (RAM) Adressbus: Übertragen der Speicheradressen. Steuerbus: Ansteuerung der Peripherie-Anschlüsse Seite 6 Bus RAM E/A-System Programmausführung durch Hardware Prozessor-Register Prozessor-interne Speicherplätze für binäres Datum bestimmter Länge (z. B. 32-Bit) Arbeitsregister werden – vom Speicher geladen – mit arithm. / logischen Operationen manipuliert – in den Speicher geschrieben Steuerregister – Befehlszähler: Adresse des nächsten Befehls – Befehlsregister: Befehl der gerade ausgeführt wird – ··· Registergröße (z.B. 32, 64 Bit) beeinflusst Leistungsfähigkeit des Prozessors – Pro Befehl manipulierbare Datenmenge – Größe des adressierbaren Speichers Seite 7 Programmausführung durch Hardware Funktionsweise Prozessor 1. Das Befehlszählerregister des Steuerwerks enthält die Adresse des nächsten Maschinenbefehls. Die Adresse des Befehls wird über den Adressbus an den Arbeitsspeicher übermittelt. 2. Der Befehl wird aus dem Arbeitsspeicher über den Datenbus in das Befehlsregister geladen. Mittels Dekodierlogik wird der Befehl analysiert und die Ausführung angestoßen. 3. Der Befehl wird ausgeführt; abhängig vom jeweiligen Befehl wird dabei zusätzlich das Lesen von Daten aus dem Arbeitsspeicher, die Ansteuerung von Peripherieschnittstellen, das Rechnen in der ALU oder die Durchführung eines Sprungs im Programm erforderlich. Der Status der jeweiligen Operation wird im Statusregister (Flagregister) angezeigt. 4. Falls ein Sprung stattfand, wird das Befehlszählerregister auf die entsprechende neue Adresse gesetzt, ansonsten wird das Befehlszählerregister um 1 erhöht. 5. Der Prozessor fährt wieder mit dem 1. Schritt fort. Seite 8 Befehl holen Operand holen Befehl dekodieren Operation ausführen Befehlszähler ändern Programmausführung durch Hardware Arbeitsspeicher / RAM – Enthält alle Daten und Befehle eines Programms in Ausführung – Direkter Zugriff auf Byte-Adressen CPU greift direkt auf einzelne Speicherstellen zu Byte-, Wort-/ Doppelwort lesen / schreiben (Von Platte kann nur in großen Blöcken gelesen werden) – RAM Der Arbeitsspeicher besteht im Wesentlichen aus Speicherbausteinen, die man als RAM (Random Access Memory = Speicher mit wahlfreiem Zugriff ) bezeichnet. Bei allen RAM-Bausteinen gilt, dass ihr Inhalt „flüchtig“ ist, d.h. dass sie nur so lange den gespeicherten Wert behalten, wie sie mit Strom versorgt werden. Nach Abschalten des Rechners sind Daten im Arbeitsspeicher verloren. – Zwei Arten von RAM: DRAM (Dynamic RAM) langsam, kostengünstig SRAM (Static RAM) schnell, teurer (meist für Register und Cache-Speicher) Seite 9 Programmausführung durch Hardware Peripherie alle Geräte, die an den Rechner angeschlossen sind. Für den Prozessor i.A. nicht direkt zugreifbar. Eingabe – Maus, Tastatur, Scanner, ··· Ausgabe – Drucker, Graphikkarte / Bildschirm, ··· Ein- und Ausgabegeräte: Netzkarte, ··· Massespeicher Gerät, das zur Speicherung von Daten dient – Magnetische Speicher Festplatten, floppy-disc – Optische Speicher CD, DVD – Halbleiter-Speicher USB-Stick SSD (solid state drive) Platte „Festplatte“ in Halbleiterbausteinen Seite 10 Programme Übersetzen und Ausführen Maschinencode / Assemblercode Maschinenbefehle Bit-Folgen mit festgelegter Bedeutung (für Menschen unles- / unschreibbar) Spezifisch für jeden Prozessortyp Assembler (symbolischer Maschinencode) Für Menschen les- / schreibbare Darstellung der Maschinen-Befehle. Urform der Programmiersprachen. Nutzung: In Speziellen Situationen / als Zwischenstadium Beispiel (Intel 80x86) 100000111100001000001111 Maschinenbefehl : addiere 0F zu Register EDX 83C20F Maschinenbefehl in Hex add edx,0Fh entsprechender Assemblerbefehl add edx,0Fh Assembler Seite 11 100000111100001000001111 Programme Übersetzen und Ausführen Höhere Programmiersprache Strukturierte Anweisungen, Datentypen, ... Bedingungen, Schleifen, Funktionen, Datentypen, Ausdrücke .... haben keine direkte Entsprechung in Maschinencode Werden durch Compiler in Sprünge und einfache Operationen umgesetzt Compiler Übersetzt höhere Programmiersprache in Assemblercode oder direkt in Maschinencode Beispiel a = a+1 Anweisung in höherer Programmiersprache load edx,0Fh add edx,0x01 store edx,0Fh Maschinenbefehl in Assembler-Notation a = a+1 Quell-Programm Compiler add edx,0Fh Assembler Assembler-Programm 100000111100001000001111 Maschinenrogramm Seite 12 Programme Übersetzen und Ausführen Compilierte Höhere Programmiersprache – Ausführung – Eingeben: Der Programmtext wird mit Hilfe eines Editor-Programms vom Entwickler eingetippt und in einer Datei abgespeichert – Übersetzen: Der Compiler (ein Programm) übersetzt den Text in Maschinencode und speichert ihn in einer Datei – Binden: Der Binder (engl. Linker, ein Programm) kombiniert (verbindet) das Maschinenprogramm mit dem Maschinencode aus Bibliotheken für Standardkomponenten zu einem ausführbaren Programm (eine Datei). – Laden: Das Betriebssystem lädt das Maschinenprogramm aus der Datei (Festplatte) in den Hauptspeicher. – Starten: Die erste Adresse des Programms wird vom Betriebssystem in das Programmregister (= Befehlszähler) der CPU geladen – Ausführen: Die CPU lädt einen Befehl des Maschinen-Programms nach dem anderen und führt ihn aus. Seite 13 Programme Übersetzen und Ausführen Interpreter (Interpretierer) Der Programmtext wird nicht in ein Maschinenprogramm übersetzt damit dann die CPU das Maschinenprogramm ausführen (interpretieren) kann sondern: Der Programmtext wird direkt (ohne Übersetzung) von einem anderen Programm ausgeführt – dem Interpreter (-Programm) a = a+1 Quell-Programm 100000111100001000001111 Interpreter-Programm (Maschinencode) Seite 14 Daten Befehle Programme Übersetzen und Ausführen Interpreter ist ein Programm, das in Maschinencode übersetzt wurde (oder selbst interpretiert wird) a = a+1 Quell-Programm Daten AnwendungsProgrammierer 100000111100001000001111 Befehle Interpreter-Programm (Maschinencode) Assembler a = a+1 Quell-Programm Compiler add edx,0Fh Assembler-Programm SystemProgrammierer Seite 15 Compiler und Assembler sind natürlich auch Maschinenprogramme, die ... Programme Übersetzen und Ausführen Interpretierte Höhere Programmiersprache – Ausführung – Eingeben: Der Programmtext wird mit Hilfe eines Editor-Programms vom Entwickler eingetippt und in einer Datei abgespeichert – Ausführen: Die CPU lädt einen Befehl des Interpreter-Programms nach dem anderen und führt ihn aus. Dabei werden die Anweisungen des Quellprogramm als Daten gelesen und „ausgeführt“. Seite 16 Programme Übersetzen und Ausführen Virtuelle Maschine Maschine die sich aus – der realen Maschine (CPU) plus – Interpreter-Programm ergibt Das Interpreter-Programm allein wird oft als „virtuelle Maschine“ bezeichnet. 100000111100001000001111 Interpreter-Programm (Maschinencode) a = a+1 Quell-Programm Ausführung Programmierer virtuelle Maschine Seite 17 Programme Übersetzen und Ausführen Virtualisierung – Ein Grundprinzip der Informatik Eingabedaten Hardware + Software Software Programm spezielle Maschine virtuelle Maschine Ausgabedaten Seite 18 Programme Übersetzen und Ausführen Virtualisierung – Ein Grundprinzip der Informatik wird mehrfach geschachtelt angewendet Eingabedaten Hardware + Software Programm: Interpreter in Maschinensprache Software spezielle Maschine: virtueller (gedachter) Computer der eine „höhere“ Sprache versteht + Software Programm virtuelle Maschine Software spezielle Maschine virtuelle Maschine Ausgabedaten Seite 19 Java-Programme Übersetzen und Ausführen Übersetzen und Ausführen Java kombiniert Compiler und Interpreter Java-code – Schritt 1: Übersetzen Das Quell-Programm (Java) wird übersetzt Aber nicht in Machinecode Sondern in „Bytecode“ = Code für die virtuelle Maschine JVM – Schritt 2: Interpertieren Ein Interpreter-Programm (Die JVM) wird von der realen Maschine ausgeführt und führt dabei selbst die übersetzten Anweisungen des Quellpropgramms aus Compiler virtuelle Maschine Bytecode JVM Betriebssystem CPU / HW reale Maschine Bildquelle: http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html Seite 20 Java-Programme Übersetzen und Ausführen Java : Compilieren + Interpretieren Vorteil: – Keine Anpassung des Compilers notwendig – Übersetzte Programme überall lauffähig Nachteil: Ausführung langsamer – Direkte Ausführung von Maschinencode ist schneller als die indirekte Ausführung mit einem Interpreter-Programm Motivation für Compilation + Interpretation – Compiliert: Compiler / Bibliotheken müssen an Plattform angepasst werden, Nur Quellcode kann transferiert werden – Compiliert + Interpretiert: Ablaufumgebung (JVM) muss an Plattform angepasst werden, Bytecode kann transferiert werden – Java-Programme können während ihres Laufs von beliebigen Quellen (Internet !) weitere Programmteile („Klassen“) laden und sofort ausführen – ohne selbst übersetzen zu müssen (zu langsam) und – ohne dass die Quelle eine übersetzte Version bereithalten muss (geht nicht, da ladende Maschine unbekannt). Bildquelle: http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html Seite 21 Java-Programme im Dateisystem Datei – Java-Code in Quelltext-Datei – Dateiname: KlassenName.java – Datei kann mehrere Klassen enthalten, davon darf nur eine public sein Verzeichnis – enthält die Bestandteile eines Pakets: Klassen des Pakets: Java- / Class-Dateien Sub-Pakete Paket Klasse1 Sub-Paket Klasse2 logische Struktur Verzeichnis ~ Paket Paket-Zugehörigkeit – einer Klasse durch Package-Deklaration: package <Paket-Name>; in der Datei – eines Pakets (Relation Paket/Sub-Paket): Hierarchische Paketnamen: <Paket>.<Sub-Paket>.<Sub-Sub-Paket> Programm – keine direkte Repräsentation – ergibt sich aus den geladenen Klassen Seite 22 Klasse1.java Java-Datei Klasse1.class Class-Datei Unter-Verz. ~ Sub-Paket Klasse2.java Java-Datei Klasse2.class Class-Datei Verzeichnis-Struktur Java-Programme Übersetzen und Ausführen Programm erstellen Verzeichnis erstellen: myPackage Datei erstellen (beliebiger Text-Editor): MyClass und in diesem Verzeichnis in der Datei MyClass.java speichern Programm übersetzen Kommando z.B.: javac myPackage/MyClass.java erzeugt die Datei myPackage/myClass.class Programm ausführen Kommando z.B.: java myPackage.MyClass Editor Editor package myPackage; package myPackage; public final class MyClass { public final { public staticclass void MyClass main(final String[] args) { public static void main(final String[] args) { System.out.println("Hallo Java"); System.out.println("Hallo Java"); } } } } Hallo Java Hallo Java Seite 23 Compiler Compiler (javac) (javac) JVM JVM (java) (java) Java-Programme Übersetzen und Ausführen Pfad und Klassenpfad Pfad, engl. Path ein Ausdruck der dem System hilft Programme zu finden C:\Programme\Java\jdk1.6.0_01\bin könnte der Pfad zu den Programmen javac und java sein. Klassenpfad, engl. Classpath ein Ausdruck der java (also der JVM) hilft die Klassendateien zu finden als Kommando- (Programm-) Argument: java -cp /pfad/zum/Verzeichnis myPackage.MyClass z.B.: java -cp /home/thomas/classes myPackage.MyClass default: aktuelles Verzeichnis der Klassenpfad endet immer vor den Paket-Verzeichnissen bla Klassenpfad blubber classes myPackage MyClass. class Seite 24 siehe auch: http://docs.oracle.com/javase/tutorial/getStarted/index.html Java-Programme Übersetzen und Ausführen Jar-Archiv Sammlung von Java-Dateien Class-Dateien und eventuell Quell-Dateien (zip-codierte Archiv-Datei) Verwendung: Transport und Installation von java-Code ~ ausführbare Datei oder Bibliothek Erzeugung mit Kommando (Programm) jar. Beispiel: jar -cvf myJarArchive.jar myPackage erzeugt ein Archiv des Verzeichnisses mypackage Nutzung als „Klassen-Bibliothek“, Beispiel: jar -cvf myJarArchive.jar myPackage java -cp myJarArchive.jar myPackage.MyClass als „ausführbare Datei“, Beispiel: jar -cvfe myJarArchive.jar myPackage.MyClass myPackage java -jar myJarArchive.jar Manifestdatei: enthält Infos zum Archiv. z.B.: Angabe Haupt-Klasse Seite 25 Java-Programme Übersetzen und Ausführen Getrennte Verzeichnisse für Quell- und Binärdateien javac -d <Zielverzeichnis> <Quelldatei> z.B.: javac -d bin src/hallo/HalloWelt.java Jar-Datei erzeugen: Archiv Klasse Verzeichnis eventuell mehrere Verzeichnisse cd bin jar -cvfe HalloWelt.jar hallo.HalloWelt hallo Jar-Datei aus einem anderen als dem aktuellen Verzeichnis bin heraus erstellen jar -cvfe HalloWelt.jar hallo.HalloWelt -C bin hallo Jar-Datei ausführen: Gibt Verzeichnis des nachfolgenden Kommando-Arguments an java -jar HalloWelt.jar HalloWeltProject + src | + hallo | + HalloWelt.java + bin + hallo + HalloWelt.class Seite 26 Java-Programme Übersetzen und Ausführen Ausführbare Jar-Datei mit Eclipse erstellen Rechts-Klick auf auf das zu exportierende Projekt: → Export → Runnable JAR file auszuführende Klasse angeben (Launch configuratution) Zielverzeichnis und Datei angeben → Finish Ausführbare Java-Datei ist erstellt und kann (z.B. mit Doppelklick) ausgeführt werden. Zu Jar-Dateien siehe auch: http://docs.oracle.com/javase/tutorial/deployment/jar/ Seite 27