Angewandte Philosophie an der Universität Duisburg-Essen.
BIT I WiSe 2014 | Basisinformationstechnologie I - 08: Programmiersprachen I
1. Basisinformationstechnologie I
Universität zu Köln. Historisch-Kulturwissenschaftliche Informationsverarbeitung
Jan G. Wieners // jan.wieners@uni-koeln.de
Wintersemester 2014/15
17. Dezember 2014 – Programmiersprachen I
11. Programmentwicklung: Analyse
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
12. Programmentwicklung: Algorithmus
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
15. Entwerfen Sie einen Algorithmus, der Sie aus jedem Labyrinth (mit Ausgang) führt
16. Terminierung von Algorithmen:
Wir verlangen (zumeist) von
Algorithmen, dass sie terminieren,
d.h. dass sie in endlicher Zeit (und
möglichst schnell Performance)
ihre Arbeit erledigt haben
Entwerfen Sie einen Algorithmus, der Sie aus jedem Labyrinth (mit Ausgang) führt
17. Programmentwicklung: Entwurfsphase III
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
18. Pseudocode
Pseudocode Pledge-Algorithmus:
Setze Umdrehungszähler auf 0;
Wiederhole
Wiederhole
Gehe geradeaus;
Solange Wand erreicht;
Drehe nach rechts;
Wiederhole
Folge dem Hindernis;
Solange Umdrehungszähler=0;
Solange ins Helle gelangt;
Der Entwurf ist unabhängig von der Programmiersprache!
23. Programmiersprachen: Klassifizierung
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
Vgl.: http://de.wikipedia.org/wiki/Assemblersprache
24. Programmiersprachen
Anweisungen, die wir dem Computer geben, werden als Text
formuliert, z.B.:
In Python:
print "Hello World!"
In PHP:
print "Hello World!";
In JavaScript:
document.write("Hello World!");
In C++:
cout << "Hello World";
25. Programmiersprachen
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
36. Objektorientierte Programmierung
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
38. Kapselung, Information Hiding, Geheimnisprinzip
Abb.: Balzert, Heide: Lehrbuch der Objektmodellierung. Heidelberg, 2005.
39. Zentrales Konzept I: Klassen
Gleichartige Objekte (Objekte mit denselben
Operationen und gleichen Attributen) gehören zur
gleichen Klasse.
Abstrakt vs. konkret: Jedes Objekt ist Exemplar bzw.
Instanz einer Klasse
Klasse: Definiert für eine Sammlung von Objekten
deren
Struktur (Attribute)
Verhalten (Operationen)
Beziehungen
Verfügt über Mechanismen, um neue Objekte zu erzeugen
(Object Factory)
40. Klassen in C++ Kapselung / Information Hiding
class EineKlasse
{
public: // öffentlicher Teil
EineKlasse() // Konstruktor
{
klassenVariable=23;
}
~EineKlasse(); // Destruktor
int gebeVariablezurueck(void)
{
return klassenVariable;
}
private: // privater Teil
int klassenVariable; // private Variable
};
41. Notation von Klassen
Abb.: Balzert, Heide: Lehrbuch der Objektmodellierung. Heidelberg, 2005.
42. Zentrales Konzept II: Vererbung
Eine Klasse kann Elemente (Variablen, Konstanten, Funktionen) von
anderen Klassen erben
Beispiel C++:
class Person
{
string name;
//...
};
class Mitarbeiter : Person
{
long sozialversicherungsNr;
//...
};
43. Martial Arts Objects (Vererbung)
Martial Arts Fighter
attribute 1: name
attribute 2: gender
attribute 2: two legs
attribute 3: two arms
behaviour 1: getName()
behaviour 2: walk()
behaviour 3: bong_sau()
behaviour 4: tan_sau()
44. Objektorientierte Programmiersprache: C++
C++:
Ermöglicht maschinennahe Programmierung (Stichw.
„Zeiger“), als auch abstrakte Programmierung (i.e.
Objektorientierung)
Kompilierung über g++ Compiler, Microsoft Visual C++
Compiler, etc.
45. Objektorientierte Programmiersprachen: Java
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
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
Terminierung von Algorithmen
Wir verlangen (zumeist) von Algorithmen, dass sie terminieren, d.h. dass sie in endlicher Zeit (und möglichst schnell Performance) ihre Arbeit erledigt haben
Performanz: Geschwindigkeit der Problemlösung
Terminierung von Algorithmen
Wir verlangen (zumeist) von Algorithmen, dass sie terminieren, d.h. dass sie in endlicher Zeit (und möglichst schnell Performance) ihre Arbeit erledigt haben
Performanz: Geschwindigkeit der Problemlösung
Grundfrage Algorithmus:
Existiert ein Algorithmus, der für jedes denkbare Labyrinth, aus dem es einen Ausgang gibt, einen Weg ins Freie findet?
Programmiersprache: Eine zum Formulieren von Programmen geschaffene künstliche / formale Sprache
Warum braucht man so etwas? Darum:
compiler
interpreter
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
Compiler / compilierte Sprachen
kompletter Programmtext wird in eine Folge von Maschinenbefehlen übersetzt, bevor die erste Programmanweisung ausgeführt wird.[C++]
Interpreter / interpretierte Sprachen
ü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
Dynamische Typisierung
Paradigmen: Prozedurale, funktionale und objektorientierte (klassenlose) Programmierung
Funktionale Programmierung: Programme bestehen aus Funktionen.
Objektzustand umfasst die Attribute und jeweilige Verbindungen zu anderen Objekten
Attribute: unveränderliche Merkmale des Objekts; die Attributwerte können Änderungen unterliegen
Verhalten eines Objekts wird durch eine Menge von Operationen beschrieben; Änderung oder Abfrage des Zustandes ausschließlich durch Operationen
Vererbung beschreibt eine Beziehung zwischen einer allgemeinen Klasse (Basisklasse) und einer spezialisierten Klasse.Die spezialisierte Klasse ist vollständig konsistent mit der Basisklasse, enthält aber zusätzliche Informationen (Attribute, Operationen).
Die allgemeine Klasse wird auch als Oberklasse (engl. super class), die spezialisierte Klasse als Unterklasse (engl. sub class) bezeichnet.
Das Konzept der Vererbung ist nicht nur dazu gedacht, um gemeinsame Eigenschaften und Verhaltensweisen zusammenzufassen, sondern sie muss immer auch eine Generalisierung bzw. Spezialisierung darstellen, d.h. jedes Objekt der Unterklasse "ist ein" Objekt der Oberklasse.
Ü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”