2. Entwurf von Algorithmen

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmierung Zusammenfassung
Advertisements

(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Imperative Programmierung -Entwicklungswerkzeuge
Java: Grundlagen der Sprache
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
DVG Einführung in Java1 Einführung in JAVA.
Einführung in die Programmiersprache Java
Dateien Datei = File (engl.) Mögliche Inhalte einer Datei
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
2.4 Rekursion Klassifikation und Beispiele
Programmieren in C Einführung
Frühjahrs-/Sommersemester 2013
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/ Übungsaufgabe vom Logische Ausdrücke 1.true & false | true 2.(10>2)
Wann ist eine Funktion (über den natürlichen Zahlen) berechenbar?
Einführung. Ziel der Veranstaltung  Vermittlung von Grundkenntnissen in C++  Solide Basis für anschließende Weiterentwicklung  Fähigkeit, kleine Programme.
Java Programme nur ein bisschen objektorientiert.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Tutorium Software-Engineering SS14 Florian Manghofer.
1 freedroidz – spielend Programmieren lernen. 2 Was ist freedroidz?
Tobias Sammet 8DY1 Programmieren Tobias Sammet 8DY2 Programmierung ● = das Schreiben eines Computerprogramms ● Dient zur Lösung eines.
Wiederholte Programmausführung
Praktische Informatik 1
Programmieren und Problemlösen
Objektorientiertes Modellieren und Programmieren mit Java
Praktische Informatik 1
Konstruktoren.
Programmieren in C Einführung
Eine Präsentation von Sandro Schluep und Leon Wink.
Objective C Universität zu Köln
2.4 Rekursion Klassifikation und Beispiele
Hello World! Javakurs 2013 Arne Kappen
Datentypen: integer, char, string, boolean
Musterlösung zur Klausur "Diskrete Mathematik" vom
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Einführung in die Programmierung
Objective C Universität zu Köln
Algorithmen.
Hintergrund Autoren von der PH Bern:
Referenzen In c kennen wir gewöhnliche Variablen und Pointer.
Technische Informatik II
Programmieren Was ist das? Wozu brauch ich es? Wie funktioniert es?
Coden mit Python Was sind deine Erfahrungen mit Programmieren?
Titel: Quelle: Übungsart: Titel: Quelle: Uhr Die Uhr lesen lernen
SS 04 Christiane Rauh Christian Hellinger
Arten von Kontrollstrukturen
Einführung in die Programmierung
Schleifen mit der Turtle
Einführung in die Programmierung
Algorithmen.
Programmierung eines Computers (Funktionsweise)
Polymorphie Überladen
1. Die rekursive Datenstruktur Liste 1.3 Rekursive Funktionen
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
2. Vererbung und Kapselung
«Delegierter» Methoden Schablone Funktionszeiger
1. Die rekursive Datenstruktur Liste 1
2. Die rekursive Datenstruktur Baum 2.2 Suchen und Einfügen
Datenstrukturen und Softwareentwicklung
9. Vererbung und Polymorphie
Komplexität und Berechenbarkeit
Wahlteil 2009 – Geometrie II 1
Pflichtteil 2016 Aufgabe 6: Gegeben ist die Gerade
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
Datentyp- umwandlung.
Einführung in die Programmierung
Einführung in die Programmierung
RGB-LED Projekt INGOLSTADT.
 Präsentation transkript:

2. Entwurf von Algorithmen 2.1 Algorithmen, Programmiersprachen und Programme 2.2 Systematischer Entwurf von Algorithmen 2.3 Schrittweise Verfeinerung 2.4 Programmierung

2.1 Algorithmen, Programmiersprachen und Programme Algorithmus: Ein Verfahren zur systematischen, schrittweisen Lösung eines Problems Beschrieben in: Umgangssprache Programmiersprache mathematischem Formalismus (z. B. Turing-Maschine) … Church-Turing-These "All reasonable definitions of 'algorithm' are equivalent."

Beispiele für Algorithmen Prozess Algorithmus Typische Schritte im Algorithmus Pullover stricken Strickmuster Linke Masche stricken, rechte Masche stricken Modellflugzeug bauen Montage-anleitung Leime Rippe A an Holm B Kleider nähen Schnittmuster Nähe Saum spiele Musik Notenblatt kochen Rezept Zutaten (4 Personen) 400 g Tomatensoße, 1/2 l Wasser, 3 Teelöffel Chilipulver, 1 1/2 l Minutenreis, 1/2 kg zerstoßene Tortilla-Chips, 1/2 kg klein geschnittener Cheddarkäse Anleitung: vermenge Tomatensoße, Wasser, Chilipulver in einem mittelgroßen Topf und bringe es zum Kochen. Rühre den Reis ein, decke den Topf ab, nehme ihn vom Feuer und lasse ihn 10 Minuten stehen. Streue Tortilla-Chips und Käse darüber. Serviere das Essen, wenn gewünscht, mit Salat-blättern und saurer Sahne.

Algorithmen als fundamentales Konzept Der Entwurf von Algorithmen ist ein kreativer Prozess, der nicht auto-matisiert werden kann. Er ist unabhängig von der Programmiersprache, unabhängig von der Rechner-Hardware. Beispiel 1: Stundenplan eines Gymnasiums Beispiel 2: Summiere alle Zahlen zwischen 1 und 100. Lösung 1 1+2+3+4…+99+100 = 5050 Lösung 2 (1+100)+(2+99)+…(50+51) = 50*101 = 5050 Die Effizienz eines Algorithmus ist ein wichtiges Kriterium.

Richtlinien für den Algorithmenentwurf Ist das Problem lösbar? Welche Schritte müssen ausgeführt werden, um einen korrekten Algo- rithmus zu erhalten? Korrektheit heißt: Der Algorithmus erzeugt ein Resultat (ist endlich). Das Resultat ist korrekt.

Beispiele Unlösbares Problem Halteproblem Finde einen Algorithmus, der feststellt, ob ein beliebiger Algorithmus in endlicher Zeit irgendein Ergebnis liefert (also anhält). Sehr komplexes Problem Problem des Handlungsreisenden (traveling salesman) Für eine beliebige Topologie: Finde den kürzesten Weg, der alle Städte verbindet, die der Handlungsreisende aufsuchen soll.

Schwierigkeiten beim Algorithmenentwurf Es existiert keine präzise Definition des Problems. Spezialfälle kommen vor, die nicht betrachtet wurden. Es ist schwer zu zeigen, dass der Algorithmus für alle möglichen Ein-gabedaten korrekt abläuft.

Beispiele für Schwierigkeiten (1) Beispiel 1: Wegbeschreibung am Laden rechts abbiegen geradeaus bis zur nächsten Kreuzung rechts abbiegen dritte Querstraße links An welchem Laden? (UNPRÄZISE)

Beispiele für Schwierigkeiten (2) Beispiel 2: Finde Süden mit der Uhr Richte den kleinen Zeiger auf die Sonne. Berechne die Winkelhalbierende zwischen dem kleinen Zeiger und 12.00 h. Die Winkelhalbierende zeigt nach Süden. Ausrichten des kleinen Zeigers durch Drehen am Stellknopf oder Drehen der gesamten Uhr? (UNPRÄZISE) Funktioniert nicht auf der Südhalbkugel! (Sonderfall vergessen)

Beispiele für Schwierigkeiten (3) Beispiel 3: Repariere Wasserhahn Wasserhahn aufdrehen warten, bis kein Wasser mehr fließt Hahn abschrauben Dichtung gegen neue Dichtung auswechseln Hahn anschrauben Hahn zudrehen Haupthahn öffnen Endet nicht; Schritt 2 unendlich; es wurde vergessen, zu Anfang den Haupthahn zuzudrehen.

Folgerung Der Entwurf von Algorithmen muss auf systematische Weise diszipliniert durchgeführt werden. Methoden zum systematischen Entwurf und zur Ana- lyse von Algorithmen (Komplexität und Korrektheit) sind hilfreich. In einem zweiten Schritt wird der Algorithmus als Computerprogramm for- muliert. Dieser Schritt wird als Programmierung bezeichnet. Durch die Verwendung einer in Syntax und Semantik wohldefinierten Sprache wird sichergestellt, dass die einzelnen Anweisungen unmissverständlich sind auf dem Zielrechner ausführbar sind (Mächtigkeit, Detaillierungsgrad).

for(int i=0; i<10; i++) printf(“Hello World“); Play(nextAudiofile); Programmierung Ein Programm ist eine Folge von Anweisungen, die einem Computer sagen, was er tun soll. tuwas.c for(int i=0; i<10; i++) printf(“Hello World“); Beep(); Play(nextAudiofile); Programme werden in einer künstlichen Sprache verfasst und in Textdateien gespeichert. Sie sollen für Menschen lesbar sein so präzise sein, dass sie unmissverständliche Handlungsanweisungen für den Rechner enthalten.

Kommandos Die Hardware des Rechners versteht nur sehr einfache Kommandos: ADD R4,R5, INC R6, JMP A3 MOV R5,TARGET (Assembler) Diese Kommandos werden in Binärdarstellung (d.h. mit den Ziffern 0 und 1) kodiert, etwa: 10001010 10100111 11010101 10010110 11010110 10101001 11110101 01011110 10110010 10100101 Für Menschen sind daher Programme in Maschinensprache nicht mehr direkt lesbar. „Höhere“ Programmiersprachen werden benötigt.

Programmiersprachen Es gibt Tausende von Programmiersprachen. Allgemeine Sprachen, mit denen prinzipiell alle Fähigkeiten eines Rech- ners zugänglich sind, sind beispielsweise Pascal, C, Java, C#, Prolog, LISP, FORTRAN, … Spezialsprachen für bestimmte Anwendungen sind beispielsweise SQL, HTML, TeX, TCL/TK, …

Strukturierungsmechanismen einer Programmiersprache Bernt Schiele 12/30/2018 Strukturierungsmechanismen einer Programmiersprache Eine mächtige Programmiersprache ist mehr als ein Hilfsmittel, um einen Computer anzuweisen, Aufgaben durchzuführen. Sie dient auch als Rahmen, innerhalb dessen wir unsere Ideen über die Problemdomäne organisieren. Message: - Programmiersprache mehr als nur eine Sprache, die der Computer versteht - Sondern Programmiersprache ist unser Werkzeug um Ideen ‚umzusetzen‘

Strukturierungsmechanismen einer Programmiersprache Bernt Schiele 12/30/2018 Strukturierungsmechanismen einer Programmiersprache Jede mächtige Programmiersprache hat drei Mechanismen, um Prozess- ideen zu strukturieren: Primitive Ausdrücke Repräsentieren die einfachsten Einheiten der Sprache. Kombinationsmittel Zusammengesetzte Elemente werden aus einfacheren Einheiten konstruiert. Abstraktionsmittel Zusammengesetzte Elemente können benannt und weiter als Einheiten manipuliert werden. 3 Struktierungsmechanismen - Primitive Ausdruecke = worte einer Sprache - Kombinationsmittel = Grammatik -> d.h. von Worten zu Saetze, Absaetzen, Kapitel - Abstraktionsmittel = Bennennung der Kapitel -> Einheiten

Systematischer Entwurf von Algorithmen A) Problemstellung (a) Ist die Problemstellung verstanden bzw. wie lautet das eigentliche Problem? Wenn die Problemstellung nicht verstanden ist, dann weitere Informationen einholen. Wenn der Kern des Problems klar hervorgehoben ist, dann das eigentliche Problem formulieren. (b) Ist die Problemstellung selbst klar und exakt? Wenn nein, dann weitere Informationen zur Problemstellung beschaffen oder Problemstellung präzisieren. (c) Hat das Problem bereits einen Namen? Wenn nein, dann dem Problem einen kurzen und treffenden Namen geben.

Problemstellung (2) (d) Was ist bekannt und was ist gegeben? Zusammenstellen aller bekannten Eingabegrößen bzw. –objekte. Jedem Eingabeobjekt einen Namen geben und seinen Typ bzw. seine Art beschreiben. (e) Was ist unbekannt bzw. was ist gesucht? Zusammenstellen aller bekannten Ausgabegrößen bzw. Ausgabe- objekte. Jedem Ausgabeobjekt einen Namen geben und seinen Typ festlegen. (f) Welche Bedingungen für Ein- und Ausgabeobjekte müssen erfüllt sein bzw. werden gefordert? Zusammenstellen dieser Bedingungen (z. B. formelmäßige Zusam-menhänge).

Anmerkung zur Problemstellung In der Praxis ist nur in den seltensten Fällen das zu lösende Problem von vornherein klar beschrieben (spezifiziert)! Gründe Derjenige, der das Problem hat, und derjenige, der den Algorithmus entwirft, sind oft nicht identisch. Sie haben meist unterschiedliches Vorwissen über die Anwendungs- umgebung. Sie machen meist unterschiedliche „selbstverständliche“ Annahmen. Deshalb: Spezifikationen sollten gemeinsam erarbeitet werden.

Beispiel für eine unklare Aufgabenstellung Berechne die Funktion f(x) = log(x) Fragen Was ist die Basis des Logarithmus? Wie ist x gegeben? In welchem Datentyp? Welchen Wertebereich hat x? Wie soll f(x) ausgegeben werden? Mit welcher Genauigkeit soll gerechnet werden? Was soll passieren, wenn ein unzulässiges x eingegeben wird?

Klarere Aufgabenstellung Klare Spezifikation f(x) = log10(x) x, f(x) als IEEE double precision floating point-Werte x: Eingabe f(x): Ausgabe Wertebereich: [0.3, 30]; in allen anderen Fällen eine Fehlermeldung aus- geben.

Systematischer Entwurf von Algorithmen (1) B) Lösungsplan (a) Ist dasselbe Problem oder ein ähnliches Problem bekannt? Wenn ja, dann versuche man, Kenntnisse über die Lösung zu er- halten. (b) Ist ein allgemeineres Problem bekannt? Sammle Kenntnisse über die Lösung dieses Problems. Prüfe, ob das gegebene Problem als Sonderfall des allgemeinen Problems behandelt werden kann. Wenn ja, dann wende man die allgemeine Problemlösung an. Wenn sich das Problem verallgemeinern lässt, ohne dass die Lösung erheblich schwerer wird, dann löse man das allgemeinere Problem.

Systematischer Entwurf von Algorithmen (2) (c) Lässt sich das Problem in mehrere einfachere, in sich geschlossene Teilprobleme aufteilen? Wenn ja, dann teile man das Problem auf und löse die Teilprobleme einzeln. (d) Man stelle einen in Schritte gegliederten Lösungsplan auf.

Beispiel für einen Lösungsplan A) Problem: Zeichne ein Dreieck auf dem Bildschirm. B) Allgemeineres Problem: Zeichne ein Polygon mit n Ecken auf dem Bildschirm (Dreieck: n = 3, Rechteck: n = 4) Lösung des allgemeineren Problems erheblich schwerer? Dreieck: Linie von Ecke 1 nach Ecke 2 Linie von Ecke 2 nach Ecke 3 Linie von Ecke 3 nach Ecke 1 Polygon: Linie von Ecke 1 zu Ecke 2 ... Linie von Ecke n nach Ecke 1 C) Teilproblem: Zeichnen einer Linie zwischen zwei Punkten auf dem Bildschirm.

Was ist ein guter Algorithmus? Kriterien Ausführungszeit (Komplexität) Speicherbedarf für Programm und Daten Entwicklungszeit (in bestimmten Domänen zunehmend wichtig) Gut strukturiertes, dokumentiertes, wartbares Programm (sehr wichtig!)

Schrittweise Verfeinerung Die schrittweise Verfeinerung ist die Zerlegung eines Algorithmus in Teilalgorithmen, von denen jeder einzelne einfacher und überschaubarer ist als der ursprüngliche Algorithmus.  Verbessert die Chancen, einen insgesamt korrekten Algorithmus zu entwerfen. Die Verfeinerung wird so lange fortgesetzt, bis einzelne Schritte unmittelbar auf dem Prozessor ausgeführt werden können (vom Menschen zur Pro- grammiersprache, vom Compiler übersetzt in Maschinensprache).

Bausteine für die Programmierung Elementare Operationen Sequenzielle Ausführung (ein Prozessor) Parallele Ausführung (mehrere Prozessoren) Bedingte Ausführung Schleife Unterprogramm Rekursion: Anwendung des selben Prinzips auf kleinere Teil-probleme Beispiel: Anweisungen in Kochbüchern

Pseudocode-Notation Code = lauffähiges Programm in einer Programmiersprache Pseudocode = nicht lauffähige Algorithmenbeschreibung in Anlehnung an Programmiersprachen Schlüsselworte aus Programmiersprachen (eingedeutscht oder englisch) Anweisungen in natürlicher Sprache Wenn passend: mathematische Notationen, Programmfragmente

Sequenz (1) Koche Wasser (2) Gib Kaffeepulver in Tasse (3) Fülle Wasser in Tasse

Sequenz und schrittweise Verfeinerung (2) Gib Kaffeepulver in Tasse verfeinert zu (2.1) Öffne Kaffeeglas (2.2) Entnehme Löffel von Kaffee (2.3) Kippe Löffel in Tasse (2.4) Schließe Kaffeeglas

Schrittweise Verfeinerung für das Beispiel (1) Erste Verfeinerung für den ganze Algorithmus (1.1) Fülle Wasserkessel (1.2) Schalte Herdplatte an (1.3) Warte, bis das Wasser kocht (1.4) Schalte Herdplatte aus (2.1) Öffne Kaffeeglas (2.2) Entnehme einen Löffel Kaffee (2.3) Kippe Löffel in die Tasse (2.4) Schließe Kaffeeglas (3.1) Gieße Wasser aus dem Kessel in die Tasse, bis die Tasse voll ist

Schrittweise Verfeinerung für das Beispiel (2) Zweite Verfeinerung {Algorithmus zur Zubereitung einer Tasse Kaffee} {Zuerst Wasser kochen} (1.1.1.) Stelle Kessel unter Wasserhahn (1.1.2.) Drehe Wasserhahn auf (1.1.3.) Warte, bis Kessel voll ist (1.1.4.) Drehe Wasserhahn zu (1.2.) Schalte Herdplatte an (1.3.1.) Warte, bis Kessel pfeift (1.4.) Schalte Herdplatte aus

Schrittweise Verfeinerung für das Beispiel (3) Zweite Verfeinerung (Fortsetzung) {Gib Kaffeepulver in die Tasse} (2.1.1.) Nehme Kaffeeglas aus dem Fach (2.1.2.) Entferne Deckel vom Kaffeeglas (2.2) Entnehme einen Löffel Kaffee (2.3.) Kippe Löffel in die Tasse (2.4.1.) Schraube Deckel auf das Kaffeeglas (2.4.2.) Stelle Kaffeeglas in das Fach zurück {Fülle Wasser in die Tasse} (3.1.) Gieße Wasser aus dem Kessel in die Tasse, bis die Tasse voll ist

Sequenzoperator Sequenzoperator: ; Koche Wasser; Gib Kaffeepulver in Tasse; Fülle Wasser in Tasse Erspart die Durchnummerierung

Auswahl / Selektion falls Bedingung dann Schritt bzw. dann Schritt a sonst Schritt b

Schachtelung der Auswahl falls Ampel ausgefallen dann fahre vorsichtig weiter sonst falls Ampel rot oder gelb dann stoppe sonst fahre weiter

Beispiel Schleife /* nächste Primzahl */ wiederhole Addiere 1; Teste auf Primzahleigenschaft bis Zahl Primzahl ist; gib Zahl aus

Schleife mit solange /* Bestimmung der größten Zahl einer Liste */ setze erste Zahl als bislang größte Zahl solange Liste nicht erschöpft führe aus Lies nächste Zahl der Liste falls diese Zahl > bislang größte Zahl dann setze diese Zahl als bislang größte Zahl; gib bislang größte Zahl aus

Übliche Schleifen in Programmiersprachen wiederhole ... bis repeat ... until ... do ... while ... solange ... führe aus while ... do ... while (...) ... wiederhole für for each ... do ... for ... do ... for (...) ...

Sprachen und Grammatiken Syntax: Formale Regeln, welche Sätze gebildet werden können: „Der Elefant aß die Erdnuss.“ (syntaktisch korrekt) „Der Elefant aß Erdnuss die.“ (syntaktisch falsch) Semantik: (Formale) Regeln, welche Sätze eine Bedeutung haben: „Der Elefant aß die Erdnuss.“ (syntaktisch korrekt, semantisch korrekt, „sinnvoll“) „Die Erdnuss aß den Elefant.“ (syntaktisch korrekt, semantisch falsch, „sinnlos“)

Formulierungsfehler Annahme: Es existiert ein Algorithmus, der nicht zu komplex ist. Welche Fehler können in der Formulierung auftauchen? Wir unterscheiden drei Klassen von Fehlern: syntaktische Fehler semantische Fehler logische Fehler.

Klassifikation von Fehlern (1) a) Syntaktische Fehler Werden durch den Compiler oder Interpreter gefunden und als solche ge- kennzeichnet. Die Instruktion wird nicht ausgeführt. Beispiel: a = b * + c;

Klassifikation von Fehlern (2) b) Semantische Fehler Werden entweder während der Ausführung gefunden (Java Exception, seg- mentation fault im Betriebssystem) oder schlimmstenfalls nie gefunden. Beispiel 1: Feldgrenzenverletzung. Der Vektor a habe 100 Elemente. i = 101; a[i] = 17; Beispiel 2: Teilen durch 0 r = 0.0; s = 170/r;

Klassifikation von Fehlern (3) c) Logische Fehler Das Programm tut nicht, was der Programmierer eigentlich wollte. Beispiel: // berechne Kreisumfang circumference = PI * radius; // anstatt 2*PI*radius Viele semantischen und alle logischen Fehler können während des Testens und durch formale Verifikation gefunden werden. Wichtig: Tests sind im Gegensatz zur formalen Verifikation keine Korrekt- heitsbeweise für ein Programm. Dafür ist die formale Verifikation nur eingeschränkt nutzbar.

printf(“Hello World“); Compiler (1) Ein Compiler übersetzt Programme aus einer höheren Sprache in die Maschinensprache des Computers. tuwas.c int i; for(i=0;i<10;i++) printf(“Hello World“); beep(); play(“HeyJoe.mp3“); C-Compiler ausführbares Programm tuwas.exe 10001010 10100111 11010101 10010110 11010110 10101001 11110101 01011110 10110010 10100101

Compiler (2) Jede Maschine hat andere Befehle. Ein Maschinenprogramm für einen PC läuft nicht auf einem Mac und umgekehrt. Betriebssysteme stellen eine Infrastruktur bereit, die Programme nutzen können: Dateiverwaltung, Speicherverwaltung, Prozessverwaltung, Input/Output, Hilfsprogramme… Programme greifen direkt auf die Ressourcen zu, die das Betriebssystemen verwaltet: writefile, print, readfile, send, receive … Konsequenz: Jedes Programm läuft nur auf einem bestimmten Rechnertyp mit einem be-stimmten Betriebssystem, z. B. nur auf einem PC mit Linux oder nur auf einem Mac mit MacOS.

Compiler (3) m Sprachen, n Hardware-Plattformen = m*n Compiler Pascal Compiler für PC mit Linux Pascal Pascal Compiler für PC mit Windows PC mit Linux C Pascal Compiler für Mac mit MacOS Basic PC mit Windows LISP Mac mit MacOS

Virtuelle Maschine (1) Eine Virtuelle Maschine VM ist ein gedachter Computer. Die VM wird auf jedem Zielcomputer simuliert (emuliert). Die VM simuliert eine Zwischensprache. Anweisungen in dieser Zwischensprache heißen Bytecode. Für jede Sprache benötigt man dann nur einen Compiler nach VM!

m Sprachen , n Plattformen = m Compiler + n Implementierungen der VM Virtuelle Maschine (2) Pascal PC mit Linux C Basic PC mit Windows Virtuelle Maschine LISP Mac mit MacOS m Sprachen , n Plattformen = m Compiler + n Implementierungen der VM

Virtuelle Maschine (3) Nachteile einer virtuellen Maschine Effizienzverlust spezielle Stärken einer bestimmten Hardware werden nicht genutzt z.B. spezielle Graphikbefehle, Textbefehle, … spezielle Features bestimmter Sprachen kommen auf bestimmten (virtuellen) Maschinen mehr, auf anderen weniger zur Geltung Z. B. Garbage Collection, Rekursion, … Fazit: Eine ideale virtuelle Maschine gibt es nicht.

(Java Virtual Machine) Java Virtual Machine – nur für Java Die Java Runtime Engine ist eine virtuelle Maschine speziell für die Sprache Java. Sie ist auf fast allen Plattformen implementiert. Unter Windows heißt sie java.exe. PC mit Linux PC mit Windows JVM (Java Virtual Machine) Mac mit MacOS

Java Virtual Machine (2) Virtuelle Maschinen für eine Sprache und multiple Plattformen gab es schon früher, sie haben sich aber nie durchgesetzt. Beispiele für virtuelle Maschinen für verschiedene Sprachen sind Pascal: p-Maschine (Mitte der 80-er Jahre) Smalltalk: Smalltalk Bytecode Interpreter Prolog: WAM

Java Virtual Machine (3) Seit sich Java durchgesetzt hat, wird die Java VM auch als Ziel- maschine für andere Sprachen benutzt: Java PC mit Linux JPython JBasic PC mit Windows NetProlog Java VM Smalltalk/JVM Mac mit MacOS

Java Virtual Machine (4) Kompilation von Java-Programmen Aus einer Textdatei mit der Endung „.java“ erzeugt der Compiler javac eine Datei mit gleichem Namen, aber der Endung „.class“ Diese enthält den Bytecode für die Java VM. Hallo.java public class Hallo{ public static void main(String[] args) { System.out.println (“Hallo Leute“); } } Hallo.class if_cmpeq dup_x1 got_w istore ddiv isub ladd ifge bipush ldiv dadd return Quellprogramm als Textdatei Hallo.java Compiler javac.exe Bytecode als Datei Hallo.class

Java Virtual Machine (5) Die Datei mit dem Bytecode wird an die Java VM übergeben. Der Bytecode könnte auch von einem anderen System, etwa von JPython, JBasic oder Smalltalk/JVM erzeugt worden sein. Hallo Leute Hallo.class if_cmpeq dup_x1 got_w istore ddiv isub ladd ifge bipush ldiv dadd return Bytecode als Datei Hallo.class Java Virtual Machine java.exe

Java-Compiler javac.exe Die Werkzeuge des SDK Java Virtual Machine java.exe Dokumentationstool javadoc.exe Java-Compiler javac.exe

Java Software Development Kit (1) In Windows XP Mit beliebigem Texteditor die Datei Hallo.java erstellen Den Kommmandointerpreter cmd.exe aufrufen Kompilieren mit javac Ausführen mit java

Java Software Development Kit (2) Solche Programme sind aber heute untypisch. Niemand schreibt mehr auf die Konsole. Rückmeldungen kommen in MessageBoxen Statuszeilen Klängen usw. Niemand liest mehr von der Konsole. Eingabe kommt aus Bestätigungen Menüs TextFeldern RadioButtons CheckBoxes ListBoxes Slidern

Java Software Development Kit (3) Die Programmerstellung ist umständlich. Man muss Kommandos auf der Kommandozeile eintippen. Wo ist die ? Sind die Pfade richtig gesetzt ? Man wechselt dauernd zwischen Programmaufrufen von Editor Compiler Virtueller Maschine Compilermeldungen erscheinen auf der Kommandozeile „error in line 737“ „; expected“ (wo?) Testen der Programme durch eingebaute Fehlermeldungen ist umständlich: System.out.println( “Das dürfte jetzt nicht sein“ );

Fazit Der Schritt vom Problem zu Algorithmus ist Aufgabe des Menschen. Eine sorgfältige Analyse des Problems in enger Zusammenarbeit des Aufgabenstellers und des Programmierers ist sinnvoll. Der systematische Entwurf eines geeigneten Algorithmus ist sehr zu empfehlen. Dieser ist sorgfältig zu spezifizieren. Als eine Technik dazu ist die schrittweise Verfeinerung sehr gut ge-eignet. Beim Entwurf von Algorithmen ist bereits auf seine Komplexität (Per- formance) zu achten. Algorithmen lassen sich in Programmiersprachen programmieren. Alle Programmiersprachen sind äquivalent. Welche Programmiersprache man wählt, ist problemabhängig.