Michael Gamer / 2015
Einführung in die Programmierung
1
Michael Gamer
Michael Gamer
Entwicklung der Programmiersprachen (1/5)
Die Entwicklung der Programmiersprachen wird in Generationen eingeteilt. Erste Generation: Maschinensprache (ab 1950) • Codierung von Programmen direkt als Bitfolge für den Prozessor
• Einfache arithmetische Operationen und Verschieben von Daten
• extrem umständliche und aufwendige Programmierung
2
Michael Gamer
Entwicklung der Programmiersprachen (2/5)
Zweite Generation: Assemblersprachen (ab 1950) •Programmierung in für Menschen lesbarem Klartext •Verwendung mnemotechnischer Kürzel für Befehle
‣ MOV A,C ‣ ADD A
•Einsatz von Assemblersprachen ist heute noch gebräuchlich, insbesondere bei zeitkritischen Anwendungen. ‣ Spielesoftware ‣ Ansteuerung von Peripherie ‣ Betriebssystemkerne
3
Michael Gamer
Entwicklung der Programmiersprachen (3/5)
Dritte Generation (ab 1954): höhere Programmiersprachen •Prozedurale Sprachen
‣ FORTRAN, COBOL, ALGOL, PASCAL ‣ Erstmals Entwurf einer Programmiersprache (ALGOL)
•Aufkommen objektorientierter Sprachen (Smalltalk) •hybride Sprachen
‣ Verknüpfen objektorientierter Ansätze mit prozeduralen Elementen
‣ C++ •Deklarative Sprachen
‣ Symbolische Programmierung für nichtnumerische Probleme ‣ LISP, MuSIMP
4
Michael Gamer
Entwicklung der Programmiersprachen (4/5)
Vierte Generation („4GL“-Sprachen, ab 1960) • Es gibt kein Paradigma dieser Sprachen • Zielsetzung ist ein höheres Abstraktionsniveau als es bei den Sprachen der dritten Generation vorliegt.
• Skriptsprachen ‣ SQL, JCL
• Deskriptive Sprachen ‣ XML-Anwendungen
5
Michael Gamer
Entwicklung der Programmiersprachen (5/5)
Fünfte Generation (ab 1978) • logisch-funktionale Sprachen • Beschreibung von Problemen durch Rand- und Zwangsbedingungen
• „Inferenzmaschinen“ ‣ prominentes Sprachbeispiel: PROLOG
6
Michael Gamer / 2015
Stammbaum der Programmiersprachen
7
Entnommen einer Darstellung der Universität Cottbus
Michael Gamer
Computer: die grundsätzliche Arbeitsweise
8
0123456789
....
SpeicherAkkumulator
Register 1
Register 2
Register 3
Befehlsregister
PC
Befehlsinterpreter
Michael Gamer / 2015
Einführung in die Programmierung
9
Michael Gamer
Grundlegende Begriffe (1/2)
Compiler •Compiler sind hochkomplexe Programme zum Übersetzen von Programmiersprachen
•Das Programm, welches den vom Benutzer erzeugten Programmtext einer Computersprache enthält, wird in Maschinensprache übersetzt
Interpreter •sind einfacher aufgebaute Programme als Compiler •Ähnliche Arbeitsweise wie ein Compiler, jedoch wird das Computerprogramm hier nicht übersetzt, sonder die einzelnen Befehle analysiert und ausgeführt
•Wiederkehrende Anweisungen müssen stets neu übersetzt werden.
10
Michael Gamer
Grundlegende Begriffe (2/2)
Debugger • Programm zum Auffinden (und Beseitigen) von Fehlern in Computerprogrammen
• Es wird zusätzlicher Code im Anwendungsprogramm erzeugt ‣ Sichtbarmachung von Variableninhalten ‣ Ermöglicht das Setzen zusätzlicher Haltepunkte ‣ Programm kann „schrittweise“ ausgeführt und
nachvollzogen werden. Entwicklungsumgebung
• komplexes Programmsystem, welches Compiler, Debugger und weitere Werkzeuge zur Programmerstellung unter einer Oberfläche vereint.
11
Michael Gamer
Abläufe bei der Programmerstellung (1/2)
12
Programmerstellung durch Programmierer1
Übersetzung in Maschinensprache durch Compiler2
Starten des Programms durch Betriebssystem3
Michael Gamer
Abläufe bei der Programmerstellung (2/2)
13
Programmerstellung durch Programmierer1
Übersetzung in Bytecode durch Compiler2
Ablauf des Programms durch einen speziellen Interpreter für Bytecode3
Michael Gamer
Ziel: möglichst große Hardwareunabhängigkeit
Anforderungen • Software/Programme sollen auf unterschiedlichen Systemen (identisch) laufen
Problem: • unterschiedliche Prozessoren • unterschiedliche Hardwareumgebungen
Lösung: • Abstraktion von der Hardware durch (einheitliche) Schnittstelle zwischen Hardware und Software
14
Michael Gamer
Moderne Architektur hardwareunabhängiger Systeme (2/2)
15
Anwendungsprogramm
virtuelle Maschine
Hardware
Hardware-Abstraction-Layer
Michael Gamer
Moderne Speicherorganisation (1/2)
theoretische Programmgröße: beliebig •Einteilen des physischen Speichers in Segmente (Kacheln)
•Ablauf des Programms in einem geschlossenen Speicherbereich
•Bei Zugriff auf einen (im Hauptspeicher) nicht vorhandenen Speicherbereich ‣ ggf. Auslagern nicht benötigter Kacheln ‣ Einlagern des nachgefragten Speicherbereichs
•Hohe Anforderungen an das Verwaltungsprogramm
16
Michael Gamer
Moderne Speicherorganisation (2/2)
Aus-/Einlagerungsstrategien •FIFO (First In / First Out)
‣ Der Bereich wird zuerst ausgelagert, der zuerst eingelagert wurde
•LIFO (Last In / First Out) ‣ Der Bereich wird zuerst ausgelagert, der zuletzt eingelagert
wurde •LRU (Least recently used)
‣ Auslagerung der Kachel die am wenigsten benutzt wurde •MRU
‣ Auslagerung der Kachel die am meisten genutzt wurde • .... und viele Weitere
17
Michael Gamer
Zahldarstellungen (1/8)
Gebräuchlich ist die Darstellung im Dezimalsystem, dem sogenannten 10er-System: 123 = 1*102 + 2*101 +3*100 oder 3,141 = 3*100 + 1*10-1 + 4*10-2 + 1*10-3 In Bezug auf Computer ist das Dual- oder Zweiersystem gebräuchlich.
18
Michael Gamer
Zahldarstellungen (2/8)
Darstellung von Zahlen im Zweiersystem: 50 = 1*25+ 1*24 + 0*23 + 0*22 + 1*21 + 0*20 d.h. die Zahl 50 wird dargestellt als Folge von Nullen und Einsen, in diesem Falle: 5010 = 1100102. Natürlich geht das auch mit Dezimalzahlen, die einen Nachkommaanteil besitzen: 1,25 = 1*20 + 0*2-1 + 1*2-2 Ist der Nachkommaanteil jedoch keine Summe von Zweierpotenzen, kommt es zu Rundungsfehlern! 1,2 = 1*20 + 0*2-1 + 0*2-2 + 1*2-3 + 0*2-4 + 0*2-5 + 1*2-6+ .... Davon später mehr....
19
Michael Gamer
Zahldarstellungen (3/8): negative Zahlen
Unterscheidung im Dezimalsystem: Vorangestelltes Zeichen (-): • positive Zahlen: 20, 15, 1001 • negative Zahlen: -1, -2001
Bei (ganzzahligen) Dualzahlen gibt es grundsätzlich zwei Möglichkeiten: • Verwendung eines „Vorzeichenbits“ für „+“ resp.
„-„ • Reservierung bestimmter Bitfolgen (oberhalb
einer bestimmten Grenze) für negative Zahlen
20
Michael Gamer
Zahldarstellungen (4/8): negative Zahlen
Beide Varianten haben Vor- und Nachteile Vorzeichenbit:
• Vorteile: ‣ einfach zu realisieren ‣ einfache Ein- und Ausgabe vorzeichenbehafteter
Zahlen • Nachteile:
‣ Platzverschwendung, es kann eine Zahl weniger dargestellt werden
‣ Es gibt zwei verschiedene Darstellung für die Zahl Null: +0 und -0
21
Michael Gamer
Zahldarstellungen (5/8): negative Zahlen
Reservierung von Bitfolgen. Beispiel mit 4-bit Zahlen
22
Dezimal Dual0 01 12 103 114 1005 1016 1107 111
Dezimal Dual8 10009 100110 101011 101112 110013 110114 111015 1111
positiv negativ
Michael Gamer
Zahldarstellungen (6/8): negative Zahlen
Also (Darstellung im sogenannten Zweierkomplement):
23
Dezimal Dual Bedeutung0 0 01 1 12 10 23 11 34 100 45 101 56 110 67 111 7
Dezimal Dual Bedeutung8 1000 -89 1001 -710 1010 -611 1011 -512 1100 -413 1101 -314 1110 -215 1111 -1
Michael Gamer
Zahldarstellungen (7/8): negative Zahlen
In der heutigen Informatik ist dies die gebräuchliche Darstellung negativer Ganzzahlen. Die Darstellung der Zahl -n wird erzielt durch:
1. invertieren aller Bits der Zahl n 2. Addition von 1 auf die so entstandene Bitfolge
Eigenschaften: • eindeutige Darstellung der Zahl Null • leicht zu erzeugen • Achtung: Überlauf bei Absolutbetrag möglich, denn es gibt eine negative Zahl mehr als positive Zahlen darstellbar sind!
24
Michael Gamer
Zahldarstellungen (8/8): Gleitkommazahlen
Gleitkommazahlen werden in normalisierter Exponentialdarstellung gespeichert: 123,45 = 0,12345 * 103 0,0032 = 0,32 * 10-2 In der Darstellung m*10e heißen:
• m: Mantisse • e: Exponent
Beide Größen, m und e, sind im Computer als Dualzahlen abgelegt. Je nach Anzahl der zur Verfügung stehenden Bits variieren die Genauigkeit der Darstellung und der Zahlbereich.
25
Michael Gamer
Wertebereiche der (primitiven) Datentypen
26
Bezeichner Länge Wertebereichboolean 1 Wert:trueoderfalsechar 2 16bitUnicodeZeichenbyte 1 -27bis27-1short 2 -215bis215-1int 4 -231bis231-1long 8 -263bis263-1float 4 ~±3.410-38bis±3.401038
double 8 ~±1.810-308bis±1.810308
Michael Gamer
Programm, Programmieren, Algorithmus....?
Vom Problem zum Programm • Ein Problem aus der realen Welt wird durch Modellbildung in die Sprache eines Computers überführt.
• Hierzu dient eine Programmiersprache, dies ist eine formale Sprache, die definiert wurde, um auf einem Computer Programme zu implementieren.
• Ein Computerprogramm ist dabei ein in einer solchen Sprache verfaßte Anleitung zur Lösung eines Problems.
27
Michael Gamer
Algorithmen
• Zur Lösung eines Problems mit Hilfe des Computers ist in der Regel ein Algorithmus notwendig.
• Ein Algorithmus ist eine Arbeitsanleitung zum Lösen eines Problems bzw. einer Aufgabe, die so präzise formuliert ist, daß sie von einem Computer ausgeführt werden kann. ‣ endliche Abfolge von Befehlen ‣ liefert in endlicher Zeit ein Ergebnis
28
Michael Gamer
Vorarbeiten
Bevor ein Programm erzeugt werden kann muß dieses (sehr genau) geplant werden. Instrumente dazu sind: • Programmablaufpläne, Flußdiagramme • Struktogramme
Diese modellieren das Problem so, daß es in eine Computersprache übersetzt werden kann. Beispiel: Es soll die Summe der ersten 100 natürlichen Zahlen, d.h. der Wert S = 1 + 2 + 3 + ... + 100, berechnet werden.
29
Michael Gamer
Beispiel: Flußdiagramm
30
Summe = 0; Summand = 1;
Summe = Summe + Summand; Summand = Summand + 1;
Summand >100
ja nein
Ausgabe: Summe
Michael Gamer
Beispiel Struktogramm
31
Michael Gamer
Beispiel: „Fußgesteuerte Schleife“
32
Summe = 0; Summand = 0;
Ausgabe: Summe
Solange Summand <= 100
Summe = Summe + Summand Summand = Summand +1
Michael Gamer
Beispiel: „Kopfgesteuerte Schleife“
33
Summe = 0; Summand = 0; arbeite = true;
Ausgabe: Summe
Solange arbeite
Summe = Summe + Summand Summand = Summand +1 falls (summand=101) arbeite=false
Michael Gamer
Grundkonstrukte der Programmierung
Dieses einfache Beispiel enthält bereits die wesentlichen Grundelemente der Programmierung:
• Zuweisungen von Werten an Variable • Verändern von Werten von Variablen • Abfrage einer Variablen • Schleifenkonstrukte
‣ fußgesteuerte Schleifen: Die Bedingung wird am Ende eines Blocks abgefragt (wie im letzten Beispiel)
‣ kopfgesteuerte Schleifen: Die Bedingung wird am Anfang des Blocks abgefragt.
‣ fußgesteuerte Schleifen werden stets mindestens einmal durchlaufen!
34
Michael Gamer
Variable und Werte
Variable •Sollen in Programmen Daten gespeichert werden, so geschieht dies in Variablen
•Variable werden zuvor, unter Angabe Ihres Typs deklariert ‣ int counter; double kontostand;
Wertzuweisungen •Zuweisungen an eine Variable werden mit dem „=“ Zeichen durchgeführt: ‣ i=0; kontostand = -1010.76; ‣ zaehler = zaehler+1;
35
Michael Gamer
Anforderungen an Software
Anwenderforderungen: •Korrektheit •Benutzerfreundlichkeit •Effizienz
Betreiberanforderungen •Unabhängig von der Hardware •Leicht zu warten
Entwickleranforderungen •Einfache Wiederverwendung von Programmteilen •geringer Debugging Aufwand •Parallelisierbarkeit in der Entwicklung ⇒ Ergebnis: Prinzip der Objektorientierung
36
Michael Gamer
Objekte, Klassen und Methoden
Sichtweise der objektorientierten Programmierung: • Die Welt besteht aus Objekten • diese Objekte sind Instanzen von Klassen • Objekte besitzen Eigenschaften (Attribute) • Objekte kommunizieren durch den Austausch von Nachrichten
• Auf Objekte wird mit speziellen Verfahren, sogenannten Methoden, zugegriffen.
37
Michael Gamer
Beispiel Objekt: Auto
38
AutoHubraum
Leergewicht Höchstgewicht
Anzahl der Räder Kilometerstand
.....
Kilometerstand setzen gefahrene KM buchen
KM Stand auslesen
Klassenname
Attribute
Methoden