Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WS12/13 -- Basisinformationstechnologie I | 09: Programmiersprachen

Jan Wieners
December 12, 2012

WS12/13 -- Basisinformationstechnologie I | 09: Programmiersprachen

Jan Wieners

December 12, 2012
Tweet

More Decks by Jan Wieners

Other Decks in Education

Transcript

  1. Universität zu Köln. Historisch-Kulturwissenschaftliche Informationsverarbeitung Jan G. Wieners // [email protected]

    Basisinformationstechnologie I Wintersemester 2012/13 12. Dezember 2012 – Programmiersprachen I
  2. Phasen der Programmentwicklung  Analyse  Spezifikation  Entwurf 

    Algorithmus  Pseudocode  Implementation  (Dokumentation)  (Testphase)  (Refactoring) Programmiersprachen  Compiler / Interpreter Themenüberblick „Programmiersprachen I“
  3. Analyse des gestellten Problems  ToDo: Eine Möglichkeit entwickeln, trotz

    Dunkelheit einen Weg aus dem Labyrinth zu finden Spezifikation: Problembeschreibung – im Gegensatz zum Algorithmus, der die Lösung des Problems angibt Beachten:  Problemkomplex exakt und vollständig beschreiben  Ein- und Ausgabewerte berücksichtigen (Parameter)  Randbedingungen bzw. Spezialfälle berücksichtigen Programmentwicklung: Analyse
  4. Descartes (1596-1650) -- „Regeln zur Leitung des Geistes" (1628): 

    Hohe Relevanz der Analysephase  Aufteilung in Teil- und Unterprobleme  Hierarchischer Erkenntnisprozess  Analyse der Analyse i.e. Sicherung der Analyse Programmentwicklung: Analyse Vgl.: http://www.netzmafia.de/skripten/ad/ad2.html
  5. Spezifikation: Problembeschreibung – im Gegensatz zum Algorithmus, der die Lösung

    des Problems angibt Algorithmus: Anleitung oder Vorschrift, wie sich ein Problem lösen lässt Arbeitsdefinition Algorithmus: Eindeutige Beschreibung eines endlichen Verfahrens zur Lösung einer bestimmten Klasse von Problemen Algorithmus im Labyrinthbeispiel: Verfahren, um aus dem dunklen Labyrinth zu gelangen Programmentwicklung: Algorithmus
  6. Entwurf I: Wir entkommen den Fängen des Minotaurus, wenn wir:

    1. Vorsichtig (es ist ja dunkel) der Nase nach gehen, bis wir auf eine Wand treffen 2. Wir mit der linken Hand an der Wand entlang gehen Programmentwicklung: Entwurfsphase I
  7. Problem! Treffen wir auf eine Säule, so funktioniert unsere Lösung

    nicht mehr, viel schlimmer noch: Wir drehen uns endlos im Kreis Programmentwicklung: Entwurfsphase II
  8. Wir verlangen (zumeist) von Algorithmen, dass sie terminieren, d.h. dass

    sie in endlicher Zeit (und möglichst schnell  Performance) ihre Arbeit erledigt haben Algorithmen: Terminierung
  9. Performance B: Gibt es einen schnelleren Weg, um aus dem

    Labyrinth zu gelangen? Ja! Performance
  10. Zurück zum Problem Treffen wir auf eine Säule, so funktioniert

    unsere Lösung nicht mehr - wir drehen uns endlos im Kreis Programmentwicklung: Entwurfsphase II
  11. Neuer Versuch: Wir folgen der Nase nach bis zur Wand,

    folgen anschließend der Wand so lange, bis wir wieder in die alte Richtung schauen; dann erneut geradeaus Programmentwicklung: Entwurfsphase II
  12. Problem: Die neue Lösung ist partikulär, funktioniert nicht für die

    erste Problemstellung Programmentwicklung: Entwurfsphase II
  13. Grundfrage Algorithmus:  Existiert ein Algorithmus, der für jedes denkbare

    Labyrinth, aus dem es einen Ausgang gibt, einen Weg ins Freie findet?  Pledge-Algorithmus: Zusätzlich zur Gangrichtung berücksichtigen wir die Drehungen, die an den Ecken ausgeführt werden Programmentwicklung: Entwurfsphase III
  14. Pledge-Algorithmus:  Prämisse: Wir gehen davon aus, dass alle Ecken

    rechtwinklig sind  Somit kommen nur Rechtsdrehungen und Linksdrehungen um jeweils 90 Grad vor  Wir verwalten unterwegs einen Umdrehungszähler, der:  bei jeder Linksdrehung um eins erhöht und  bei jeder Rechtsdrehung um eins verringert wird (auch bei der ersten Rechtsdrehung, die nach dem Auftreffen auf eine Wand ausgeführt wird).  Zu Beginn wird dieser Umdrehungszähler auf null gesetzt  Anschließend werden die beiden Anweisungen  geradeaus, bis Wand erreicht  Folge der Wand, bis Umdrehungszähler = 0 solange wiederholt, bis wir ins Freie gelangen Programmentwicklung: Entwurfsphase III
  15. Pseudocode Pledge-Algorithmus:  Setze Umdrehungszähler auf 0;  Repeat 

    Repeat  Gehe geradeaus;  Until Wand erreicht;  Drehe nach rechts;  Repeat  Folge dem Hindernis;  Until Umdrehungszähler=0;  Until ins Helle gelangt;  Entwurf ist unabhängig von Programmiersprache! Programmentwicklung: Entwurfsphase III Vgl.: Vöcking, Berhold et. al.:Taschenbuch der Algorithmen. Springer. 2008. S. 75-81.
  16. Phasen der Programmentwicklung  Analyse  Spezifikation  Entwurf 

    Algorithmus  Pseudocode  Implementation  (Dokumentation)  (Testphase)  (Refactoring)  Programmiersprachen  Compiler / Interpreter Zwischenstand
  17. Maschinennahe Programmiersprache: Assembler Beispiel: „Hello World“ : DATA SEGMENT ;-

    Beginn des Datensegments Meldung db "Hello World" ;- Die Zeichenkette "Hello World" db "$" ;- Endzeichen der Zeichenkette DATA ENDS ;- Ende des Datensegment CODE SEGMENT ;- Beginn des Codesegements ASSUME CS:CODE,DS:DATA ;- Dem Assembler die Segmente mitteilen Anfang: ;- Label für den Anfang des Programms mov ax, DATA ;- das Daten... mov ds, ax ; ...segment festlegen mov dx, offset Meldung ;- den Text in das auf DS bezogene Datenregister laden mov ah, 09h ;- Die Unterfunktion 9 des Betriebssysteminterrupts 21h auswählen int 21h ;- den Betriebssysteminterrupt 21h (hier erfolgt Ausgabe des Texts) aufrufen mov ax, 4C00h ;- Die Unterfunktion 4Ch (Programmbeendigung) des Betriebssysteminterrupts 21h festlegen int 21h ;- diesen Befehl wiederum ausführen CODE ENDS ;- Ende des Codesegments END Anfang ;- dem Assembler das Ende des Labels Anfang mitteilen Programmiersprachen: Klassifizierung Vgl.: http://de.wikipedia.org/wiki/Assemblersprache
  18. Anweisungen, die wir dem Computer geben, werden als Text formuliert,

    z.B.: In Python: print "Hello World!„ In JavaScript: document.write( “Hello World!“ ); In C++: […] cout << „Hello World“; […] Programmiersprachen
  19. Programmtext ist formuliert nach festen Regeln: Beispiel C++: cout <<

    “Hello World“; Die Regeln (Grammatik) der Programmiersprache C++ schreiben vor, dass der Ausdruck cout << “Hello World“ mit einem Semikolon abgeschlossen werden muss Programmiersprachen
  20. Wer prüft zu welchem Zeitpunkt die Grammatik? Programmierung häufig mittels

    Programmierumgebungen (IDE, integrated develompent environment), die Werkzeuge beinhalten:  Editor  Compiler  Debugger (Fehlersuche) Beispiele: Microsoft Visual Studio, Qt Creator, Eclipse Compiler  Computerprogramm, das ein in einer Hochsprache (C++, etc.) formuliertes Programm, das sog. Quellprogramm in ein Zielprogramm, z.B.:  Bytecode (Sammlung von Befehlen für eine virtuelle Maschine) oder  Maschinencode (Instruktionen, die der entsprechende Prozessor (Hardware) direkt umsetzen kann) übersetzt „kompilieren“: Verb, Anwendung eines Compilers auf ein Quellprogramm Programmiersprachen
  21. Compiler  kompletter Programmtext wird in eine Folge von Maschinenbefehlen

    übersetzt, bevor die erste Programmanweisung ausgeführt wird. [C++] Interpreter  übersetzt immer nur eine einzige Programmanweisung in ein kleines Unterprogramm aus Maschinenbefehlen und führt dieses sofort aus. Anschließend wird mit der nächsten Anweisung genauso verfahren. [JavaScript, Python] Interpreter Pro: Einfacher zu konstruieren als Compiler Interpreter Contra: Ein Befehl, der mehrfach ausgeführt wird, muss jedes mal erneut übersetzt werden Compiler vs. Interpreter
  22. Variablen: Behälter / Speicherstelle; Typisierung  Typ der Variable In

    JavaScript: // Deklaration var eineVariable, eineWeitereVariable; // Initialisierung eineVariable = 23; eineWeitereVariable = “Hello World!“;  Dynamische Typisierung In C++: int eineVariable = 23; char eineWeitereVariable[]="Hello World";  Statische Typisierung Typisierung
  23. Funktionale Programmierung: Programme bestehen aus Funktionen. JavaScript: var randomize =

    function( lowerBound, upperBound ) { if( lowerBound > upperBound ) { return( -1 ); } if( lowerBound === upperBound ) { return( lowerBound ); } return lowerBound + parseInt( Math.random() * ( upperBound-lowerBound+1 ), 10); } Programmierparadigmen
  24. Prozedurale Programmierung: Aufteilung von Programmen in Teilprogramme bzw. –Aufgaben: Prozeduren

    [C, Pascal] Objektorientierte Programmierung [C++, Java]  Zentrales Konzept: Objekt  Objekt  Verfügt über einen bestimmten Zustand  Reagiert mit einem definierten Verhalten auf Anforderungen / seine Umgebung  Besitzt eine Identität, die es von anderen Objekten unterscheidet  Kann mit anderen Objekten verbunden sein Programmierparadigmen
  25. C++:  Ermöglicht maschinennahe Programmierung (Stichw. „Zeiger“), als auch abstrakte

    Programmierung (i.e. Objektorientierung)  Kompilierung über g++ Compiler, Microsoft Visual C++ Compiler, etc. Objektorientierte Programmiersprachen: C++
  26. Java  Besonderheit: Java-Programme werden in Bytecode übersetzt, anschließend in

    einer Java-Laufzeitumgebung ausgeführt  Virtuelle Maschine (VM)  Vorteil: Plattformunabhängigkeit: Java-Programme laufen zumeist ohne weitere Anpassungen auf unterschiedlichen Computer- und Betriebssystemen, für die eine Java-VM existiert Objektorientierte Programmiersprachen: Java
  27. Tradierung von (Entwurfs- und Implementations)wissen Gamm, Helm, Johnson, Vlissides [1994]

     The Gang of Four U.a.: • Factory Pattern • Singleton Pattern • Observer Pattern
  28. Überprüfung, ob das entwickelte Programm die Problemstellung korrekt und vollständig

    löst Dazu: Ausführung des Programmes mit verschiedenen Eingabewerten und Startzuständen, um möglichst jede Situation abzubilden Automatisierte Tests  “Writing automated tests is accepted to produce higher quality code at lower cost. More tests == less time spent debugging” (vgl.: Francesco Carucci (Crytek): http://www.slideshare.net/fcarucci/aaa-automated-testing) Testphase
  29. “Write the simplest code that could possibly make the test

    pass Refactor the code to eliminate all possible duplications and code smells” (vgl.: Francesco Carucci (Crytek): http://www.slideshare.net/fcarucci/aaa-automated-testing) Test-driven development
  30. /

  31. Aufgabe 1: Skizzieren Sie bitte kurz die Analyse- und die

    Entwurfsphase bei der Programmentwicklung. Aufgabe 2: Was bezeichnet eine Spezifikation, was ein Algorithmus? Aufgabe 3: Erläutern Sie bitte den Unterschied zwischen einem Compiler und einem Interpreter. Aufgabe 4: Worin unterscheidet sich die dynamische von der statischen Typisierung? Welche Vor- und Nachteile haben beide Konzepte? Aufgabe 5: Unterscheiden Sie bitte das funktionale Programmierparadigma vom objektorientierten. Hausaufgaben