Grundlagen der Informatik

Werbung
Grundlagen der Informatik
Teil 1
Dr. Stefan Bosse
Universität Bremen
Vorlesung WS 2006 (V061213)
Einführung (I)
➤ Verknüpfung von Informatik und Elektrotechnik
➤ Bedeutung der Informatik für die Elektrotechnik
[010]
Elektrotechnik
Grundlagen
Disziplinen
Mathematik
Physik
Informatik
Dr. Stefan Bosse •
Seite 1
Grundlagen der Informatik
Einführung (II)
➤ Informatik befaßt sich mit der maschinellen Datenverarbeitung:
Informatik = Information ⊕ Automatik
➤ Man unterscheidet:
1. Verfahren zur Lösung von Problemen, unabhängig von einer Maschine ➽ Algorithmik
2. Implementierung der Algorithmen mit einer bestimmten Programmiersprache auf bestimmten Rechnern (Maschinen).
➤ Richtungen der Informatik:
Theoretische Informatik
Formale Sprachen, Automatentheorie, Komplexitätstheorie, Korrektheit und Berechenbarkeit, Algorithmen, Logik usw.
Praktische Informatik
Betriebssysteme, Compiler, Datenbanken, Software-Entwurf usw.
Technische Informatik
Digitale Logik und Schaltungen, Hardware-Entwurf und Komponenten, Rechnerarchitektur, Mikroprogrammierung usw.
Angewandte Informatik
Anwendungen von Informationsverwaltung, z.B. in Medizin, Fertigung usw.
Seite 2
Dr. Stefan Bosse •
Grundlagen der Informatik
Themenüberblick
➤
➤
➤
➤
➤
➤
Informationen und Daten - Zahlensysteme und Arithmetik
Boolesche Algebra und Logik
Automaten: Die Turing-Maschine und deren Programmierung
Rechnerarchitektur: von-Neumann-Architektur
Betriebssyteme
Einführung in die Programmierung und Programmiersprachen
◆ Imperative Programmierung
◆ Funktionale Programmierung
◆ Logische Programmierung
➤ Compiler-Bau
➤ Algorithmen auf abstrakten Datentypen
◆
◆
◆
◆
Listen
Stapel- und Schlangenspeicher
Hash-Verfahren und Loookup-Tables
Bäume
Dr. Stefan Bosse •
Seite 3
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (I)
➤ Spezifikation eines Algorithmus für die gestellte Aufgabe.
➤ Unabhängig von Maschine und Programmiersprache.
➤ Beispiel: Skalarprodukt zweier Vektoren:
Algorithmus-Ebene
[001]
Hochsprache
Betriebssystem-Ebene
aT × b =
X
i
ai • b i
(1)
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 4
Dr. Stefan Bosse •
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (II)
➤ Hochsprache: Abstraktion von Maschine und
Betriebssystem.
➤ Umsetzung mit einer Hochsprache, z.B.
funktionale Programmiersprache ML:
let v1 = [|1;4;5;6|]
let v2 = [|2;0;1;0|]
let scal_prod a b =
let n1 = Array.length a in
let n2 = Array.length b in
if n1 <> n2 then error ();
let p = ref 0 in
for i = 0 to n1−1
do
p := !p + v1.(i)*v2.(i);
done;
!p
let res = scal_prod v1 v2
print_integer res;;
Algorithmus-Ebene
[002]
Hochsprache
Betriebssystem-Ebene
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Dr. Stefan Bosse •
Seite 5
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (III)
➤ Übersetzung des Quellkodes in ein ausführbares Maschinen-Programm
➤ Verwaltung und Zuweisung von Ressourcen
➤
➤
➤
➤
Laden des Programms
Zugriff auf Festplatte
Ein- und Ausgabe (Bildschirm)
Zuteilung von Mikroprozessorzeit an Programm
sbosse@h1:~$ ocaml scalprod.ml
sbosse@h1:~$ scalprod
7
sbosse@h1:~$
Algorithmus-Ebene
[003]
Hochsprache
Betriebssystem-Ebene
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 6
Dr. Stefan Bosse •
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (IV)
➤ Hochsprache besteht aus komplexen Programmanweisungen.
➤ Maschinensprache besteht aus einfachen
elementaren Anweisungen.
for i
do
•••
done;
⇒
1000:
1001:
1002:
1003:
1004:
1005:
1010:
1011:
1012:
= 0 to n−1
Algorithmus-Ebene
[004]
Hochsprache
Betriebssystem-Ebene
Maschinensprache
LOAD I,0
LOAD A,n
SUB A,1
CMP I,A
JMPZERO 1012
•••
ADD I,1
JUMP 1003
•••
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 7
Dr. Stefan Bosse •
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (V)
➤ Mikroprozessoren müssen kodierte Maschinenbefehle ausführen.
➤ Befehlsausführung in mehreren Phasen
➤ Häufig werden die Maschinenbefehle (Phasen) in weitere Mikrobefehle zerlegt.
Algorithmus-Ebene
[005]
Hochsprache
Betriebssystem-Ebene
CMP I,A
⇒
1: MOVE I,R1
2: MOVE A,R2
3: SUB R1,R2,R1
4: SETFLAG ZERO,R1=0?
5: SETFLAG POS,R1>0?
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 8
Dr. Stefan Bosse •
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (VI)
➤
➤
➤
➤
➤
➤
Rechnerarchitektur
Mikroprozessorebene
Register-Transfer-Logik
Zustandsdiagramme
Steuerung durch Zustandsautomaten
Noch abstrakte Beschreibung der Hardware
Algorithmus-Ebene
[006]
Hochsprache
Betriebssystem-Ebene
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Dr. Stefan Bosse •
Seite 9
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (VII)
➤
➤
➤
➤
Digitallogik-Ebene
Boolesche Algebra
Logiksynthese
Algorithmus-Ebene
[007]
Hochsprache
Noch nicht technologiespezifisch.
Betriebssystem-Ebene
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 10
Dr. Stefan Bosse •
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (VIII)
➤ Übergang auf Transistorebene
➤ Technologiespezifisch.
Algorithmus-Ebene
[008]
Hochsprache
Betriebssystem-Ebene
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 11
Dr. Stefan Bosse •
Grundlagen der Informatik
Entwurfs-Abläufe und Ebenen in der Informatik (IX)
➤ Übergang auf physikalische Chip-Ebene
➤ Halbleitertechnik in Mehrschichtenaufbau
➤ Übergang Digital- zu Analogtechnik!
Algorithmus-Ebene
[009]
Hochsprache
Betriebssystem-Ebene
Maschinensprache
ISA-Befehlssatz-Architektur
Software
Hardware
Mikroarchitektur
Digitale Logik
Transistoren und Verdrahtung
Masken-Layout/Halbleiter
Seite 12
Dr. Stefan Bosse •
Grundlagen der Informatik
Informationen und Daten (I)
▼ Informationen werden durch maschinelle Daten repräsentiert/abgebildet.
Beispiel: Informationsmenge
hName, Adresse, Telefonnummeri
hFarbe eines Gegenstandesi ⇒ topologische Werte
hLänge eines Körpersi ⇒ metrische Werte
▼ Maschinelle Informationsverarbeitung bedeutet:
Verarbeitung von Daten mit technischen Geräten/Mitteln ➽
{Mechanische-, elektronische-, optische, quantenmechanische Systeme}
▼ Voraussetzung für das
◆ Speichern,
◆ Verarbeiten,
◆ und Übermitteln von Informationen:
Kodierung von Informationen in Daten
▼ Informations- und Datenverarbeitung ist ein geschlossener Kreislauf aus Kodierung von Informationen und Rückgewinnung von Informationen durch Dekodierung.
Dr. Stefan Bosse •
Seite 13
Grundlagen der Informatik
Informationen und Daten (II)
Mensch
Informationen
[012]
Maschinelle
Repräsentation
=Kodierung
Maschine
Abstraktion
=Dekodierung
Daten
Datenverarbeitung
➤ Daten werden durch Bitmuster dargestellt.
➤ Ein Bit ist die kleinstmögliche Einheit der Information (atomar).
➤ Ein Bit ist eine Informationsmenge bestehend aus zwei Elementen:
{wahr,falsch} {ja,nein} {hell,dunkel}
➤ Kodierung dieser Informationsmenge durch logische oder technische Werte:
{1,0} {H,L} {3.3V,0.5V} {20mA, 0mA}
Seite 14
Dr. Stefan Bosse •
Grundlagen der Informatik
Informationen und Daten (III)
➤ Zusammenfassung mehrerer Bits zu Bitfolgen erlaubt Kodierung eine Wertemenge mit mehr
als zwei Werten.
➤ Beispiel: Kodierung einer Menge von Farben:
{rot,blau,grün,gelb} ➥
00 ⇔ rot
01 ⇔ blau
10 ⇔ grün
11 ⇔ gelb
➤ Es gibt genau 2N mögliche Bitfolgen der Länge N≡Anzahl der Bits.
Beispiel: N=4 ⇒ 16 Kodierungsmöglichkeiten
➤ Ein Rechner verarbeitet Daten immer in Gruppen von Bits mit festgelegter Länge N.
➤ Zusammenfassung von Bitfolgen bestimmter Länge zu sog. Bytes. Ein Byte umfaßt i.A. 8
Bits.
➤ Dies Zusammenfassung von Bytes zu weiteren Gruppen (z.B. 2/4/8 Bytes) ist namentlich
nicht eindeutig definiert und hängt von der Rechnerarchitektur ab:
32−Bit Rechnerarchitektur ⇒ {2,4,8} Bytes={short,word,double word}
Dr. Stefan Bosse •
Seite 15
Grundlagen der Informatik
Positive ganze Zahlen (I)
➤ Natürliche Zahlen: ℵ={0,1,2,..,∞} ➽ unendlich abzählbare Menge
➤ Zuordnung einer Untermenge der natürlichen Zahlen durch gewichtetet Binärzahlendarstellung (Dualzahlen):
a=
N−1
X
ai 2i
(2)
i =0
➥ Dabei ist B=2 die Basis≡Gewicht des Zahlensystems.
Beispiel
a1/a0
0 0
0 1
1 0
1 1
⇒
⇒
⇒
⇒
⇒
N
0
1
2
3
➤ Es können natürliche Zahlen im Bereich 0...(2 N -1) bei N Bits dargestellt werden.
➤ Das Zahlensystem zur Basis B=2 nennt man Dual- oder Binärzahlensystem, da die Wertemenge jeder Ziffer zwei Elemente {0,1} umfaßt.
➤ Obige Gleichung ist die Umrechnungsvorschrift vom Dual- in das Dezimalzahlensystem
(B=10).
Seite 16
Dr. Stefan Bosse •
Grundlagen der Informatik
Positive ganze Zahlen (II)
➤ Beispiel:
10010111(2) =1•27 +0•26 +0•25 +1•24 +0•23 +1•22 +1•21 +1•20 =151(10)
➤ Schreibweise der Dualzahlen:
MSB ••• LSB
➽ MSB: Most Significant Bit (höchstwertigstes Bit)
➽ LSB: Least SIgnificant Bit (niederwrtigstes Bit)
➤ Umrechnung vom Dezimal- in das Dualzahlensystem:
1.
2.
3.
4.
Dezimalzahl durch 2 dividieren,
Rest gibt niederwertigste Stelle der Dualzahl (LSB) an,
Divisionsergebnis (ganzzahlig) durch 2 dividieren,
Schritt (1) und (2) wiederholen bis N-te Stelle (MSB) erreicht ist.
➤ Herleitung der Umrechnungsvorschrift:
◆ Jede Zahl darstellbar durch:
Z=Q × B + R mit 0 ≤ R < B
⇔ Z/B={Q,R}
mit Q: Quotient, R: Rest, B: Basis.
Dr. Stefan Bosse •
Seite 17
Grundlagen der Informatik
Positive ganze Zahlen (III)
➤ Herleitung der Umrechnungsvorschrift:
◆ Es gilt dann für die gesuchte Binärzahlendarstellung durch Faktorisierung:
Z=(aN−1 aN−2 •••a0)=
= aN−1 •2N−1 +aN−2 •2N−2 +...+a0
= ( aN−1 •2N−2 +aN−2 •2N−3 +...+a1 ) • 2 + a0
=q•2+r
➤ Beispiel:
Umrechnung der Dezimalzahl 151(10) in Dualzahl:
151/2
75/2
37/2
18/2
9/2
4/2
2/2
1/2
=
=
=
=
=
=
=
=
75
37
18
9
4
2
1
0
Rest
Rest
Rest
Rest
Rest
Rest
Rest
Rest
1 (LSB)
1
1
0
1
0
0
1 (MSB)
➽ 10010111(2)
Seite 18
Dr. Stefan Bosse •
Grundlagen der Informatik
Vorzeichenbehaftete Dualzahlen (I)
➤ Ganze Zahlen mit der Wertemenge =={-∞,...,-1,0,1,2,...∞} benötigen ein weiteres Bit für die
Kennzeichnung des Vorzeichens.
➤ Das höchstwertigste Bit (MSB) wird zur Kodierung des Vorzeichens verwendet:
{0: positiv, 1: negativ}
➤ Gegenüber vorzeichenlosen Zahlen stehen nur noch (N-1) Bits für den Zahlenwert zur Verfügung.
➤ Es gibt verschiedene Kodierungsverfahren für negative Zahlen:
1. Vorzeichen-Betragswert
V
Betragswert W
2. Einer-Komplement
V
3. Zweier-Komplement
V
¬W
¬W+1
➽ Dabei ist (¬ ) der Negationsoperator für binäre Zahlen: f: x → {x=0→1,x=1→0};
Dr. Stefan Bosse •
Seite 19
Grundlagen der Informatik
Vorzeichenbehaftete Dualzahlen (II)
➤ Vergleich der verschiedenen Kodierungsmethoden:
Beispiel: +4 -2= (+4) + (-2) = (+2)
1. Vorzeichen-Betrags-Methode ➽ Ergebnis falsch!
+4
0100
−2
1010 ⇒ −2 ≡ 1 :: 010 ≡ 1 010
−−−−−−−−−− ,
−6
1110
2. Einer-Komplement-Methode ➽ Korrektur des Ergebnisses erforderlich!
+4
0100 ⇒ −2 ≡ 1 ::
−2
1101
−−−−−−−−−− ,
+1
0001
¬
(010) ≡ 1 101
3. Zweier-Komplement-Methode ➽ Direkt einsetzbar!
+4
0100
−2
1110 ⇒ −2 ≡ (1 ::
−−−−−−−−−− =
+2
0010
Seite 20
¬
(010))+1 ≡ 1 110
Dr. Stefan Bosse •
Grundlagen der Informatik
Zweier-Komplement-Darstellung (I)
➤ Allgemein gilt:
a = −aN−1 • 2
N−1
+
N−2
X
i =0
ai • 2 i
(3)
➤ Beispiel:
100010111(2) =-1•27+0•26 +0•25 +1•24 +0•23 +1•22 +1•21 +1•20 =−105(10)
➤ Erzeugung der Zweier-Komplement-Darstellung V in drei Schritten:
1. Komplement von Betragszahl (positive Zahl) W durch Invertieren aller Bits bilden ¬ W
2. Wert 1 zu (¬ W) addieren
3. Höchstwertigstes Bit setzen.
Beispiel:
W=7 ⇒ V=−7
W
111
¬
W
000
+1
001
−−−−−−−−−−−−
V=
1001
Dr. Stefan Bosse •
Seite 21
Grundlagen der Informatik
Zweier-Komplement-Darstellung (II)
➤ Erzeugung des Betragswertes W aus Zweier-Komplement-Darstellung V:
1. Höchstwertigstes Bit von V auf V(N-1)=0 setzen bzw. W=V(N-2 downto 0) setzen,
2. Von W Wert 1 subtrahieren (W-1),
3. In W alle Bits invertieren (¬ W),
Beispiel:
V=−7 ⇒ W=7
V
1001
W
001
−1
000
¬
W
111
−−−−−−−−−−−−
W=
111
[001]
➤ Die Zuordnung der positiven und
negativen Zahlen kann anschaulich mit einer Zahlengeraden verdeutlicht werden, z.B. für N=4:
-8
0
0
0
1
Seite 22
-7
-6
-5
-4
-3
-2
-1
0
1
1
1
1
1
0
0
0
0
1
0
0
0
Dr. Stefan Bosse •
2
3
4
5
Grundlagen der Informatik
6
7
1
1
1
0
Zahlensysteme (I)
➤ Allgemeine Darstellung einer Zahl in einem Zahlensystem zur Basis B:
Z=
N−1
X
i =0
zi • B i
(4)
mit zi als i-te Ziffer einer Zahl.
➤ Es gibt verschiedene bekannte Zahlensysteme, wobei die Basis die Anzahld er möglichen
Ziffern angibt:
B=2
Binär- oder Dualzahlensystem ➽ Ziffernmenge: {0,1}
B=10
Dezimalzahlensystem ➽ Ziffernmenge {0,1,2,3,4,5,6,7,8,9}
B=16
Hexadezimalzahlensystem ➽ Ziffernmenge {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}
Umrechnung: A→10, B→11, C→12, D→13, E→14, F→15
B=8
Oktalzahlensystem ➽ ZIffernmenge {0,1,2,3,4,5,6,7}
➤ Beispiel: 1F2(16) =1•162 +15•161 +2•160 =498(10)
Dr. Stefan Bosse •
Seite 23
Grundlagen der Informatik
Zahlensysteme (II)
➤ Das Hexadezimalsystem ist vorteilhaft bei der Handhabung von Binärzahlen.
➤ Einfache Umrechnung zwischen beiden Zahlensystemen durch Bitgruppierung mit M=4 Bits
und Verwendung einer Zuordnungstabelle:
0
1
2
3
4
⇔
⇔
⇔
⇔
⇔
0000
0001
0010
0011
0100
5
6
7
8
9
⇔
⇔
⇔
⇔
⇔
0101
0110
0111
1000
1001
A
B
C
D
E
⇔
⇔
⇔
⇔
⇔
1010
1011
1100
1101
1110
F ⇔ 1111
➤ Beispiel: N=8
1101◆1001(2)=13•161 +9•160 =D9(16)
➤ Spezielle Kodierungen: Dualkodierte Dezimalziffern
➥ Gepackte BCD-Dezimalziffern
➥ Jeweils eines Stelle einer Dezimalzahl wird mit einer Bitgruppe mit M=4 Bits zugeordnet.
➥ Beispiel:
725(10) =0000◆0111◆0010◆0101(BCDpacked)
Seite 24
Dr. Stefan Bosse •
Grundlagen der Informatik
Arithmetische Operationen (I)
1.
2.
3.
4.
Addition (+) ➽ f: = × = → =
Subtraktion (-) ➽ Rückführung auf Addition
Multiplikation (*) ➽ f: = × = → 2•=
Division (/) ➽ f: = × = → =
5. Division mit Rest (//)
6. Relationsoperatoren: {<,>,≡,=,≤,≥,,} ➽ f: = × = → β
➤ Addition und Subtraktion können für positive und negative Binärzahlen in ZweierKomplement-Darstellung ohne Unterscheidung ausgeführt werden.
➤ Multiplikation und Division müssen bei einfachen Schiebe-Verfahren das Vorzeichen korrigieren, aber z.B. mit Booth-Kodierung können auch negative Zahlen verarbeitet werden.
Addition
Einstellige Binärzahlen:
0
+0
==
0
0
+1
==
1
1
+0
==
1
1
+1
==
10
1
+1
+1
==
11
Linke 1 ist Übertrag!
Dr. Stefan Bosse •
Seite 25
Grundlagen der Informatik
Arithmetische Operationen (II)
Addition
Bei mehrstelligen Binärzahlen gleiches Verfahren wie bei Dezimalzahlen:
B=10
121
+119
Ü 1
====
240
B=2
0111 1001
0111 0111
1111 111
=========
1111 0000
Subtraktion durch Negation des Subtrahenten mit Zweier-Komplementdarstellung und
Rückführung auf Addition:
121
−119
121
⇒ +(−119) ➥
0111 1001 (121)
+1000 1001 (−119)
Ü 111
1
=========
0000 0010 (2)
Seite 26
Dr. Stefan Bosse •
Grundlagen der Informatik
Arithmetische Operationen (III)
Addition
Bei Addition und Subtraktion kann ein Überlauf auftreten, der zu einem falschen Ergebnis
führt:
121
0111 1001
+240
1111 0000
Ü 1
1111
====
========,
360 1 1110 1001
➤ Bei arithmetischen Operationen gibt es verchiedene Statusinformationen, die in zusätzlichen
Bits der Recheneinheit aus dem Ergebnis E einer Operation abgeleitet und gespeichert
werden:
Übertragsbit
C
E(MSB+1)=1
Überlaufbit
V
Negativbit
N
|E| > Emax
Nullbit
Z
Bei vorzeichenlosen Zahlen: Überlauf
Bei vorzeichenbehafteten Zahlen
E(MSB)=1
E=0
Dr. Stefan Bosse •
Seite 27
Grundlagen der Informatik
Arithmetische Operationen (IV)
Multiplikation
Einstellige Binärzahlen:
0
*0
==
0
0
*1
==
0
1
*0
==
0
1
*1
==
1
Mehrstellige Binärzahlen werden wie im Dezimalzahlensystem stellenweise durch
Schieben und Addieren multipliziert:
37*21
37*1= 37
37*20=740
=========
777
00100101 * 00010101
⇒
00100101*1=
00100101
00100101*1 =
0010010100
00100101*1
= 001001010000
=============
1100001001
Das Ergebnis einer Multiplikation ist 2•N Bits lang bei N-Bit Datenbreite der Operanden.
Seite 28
Dr. Stefan Bosse •
Grundlagen der Informatik
Reelle Zahlen
➤ Reelle Zahlen setzen sich aus zwei Zahlenmengen zusammen R=Q∩I:
➽ unendlich nicht abzählbare Menge!
Rationale Zahlen Q
Gebrochene Zahlen, darstellbar mit Brüchen.
Beispiele :
1 124
,
usw.
3 7
(5)
√
2, π, e usw.
(6)
Irretationle Zahlen I
Nicht als Bruchausdruck darstellbar.
Beispiele :
➤ Es gibt zwei Kodierungsmöglichkeiten für eine Untermenge der reellen Zahlen:
1. Festpunktdarstellung
2. Gleitpunktdarstellung
Dr. Stefan Bosse •
Seite 29
Grundlagen der Informatik
Reelle Zahlen :: Festpunktdarstellung
➤ Die Festpunktdarstellung verwendet feste Anzahl von Stellen und einen fixen Dezimalpunkt.
➥ Nachteil: unzureichende Genauigkeit bei kleinen Zahlenwerten
➥ Vorteil: einfach zu implementieren
Beispiel :
12.39(10) ➽ ≈ 1100.0110(2) •••
1010.011 ➽ 1•23 +1•22 +0•21 +0•20 +0•2−1 +1•2−2 +1•2−3 •••
= 8+4+0.25+0.125+•••
➤ Der Punkt trennt den ganzzahligen vom gebrochenen Teil der reellen Zahl.
➤ Nur ein kleines Intervall der reellen Zahl kann dargestellt werden.
➤ Eine reelle Zahl kann i.A. nur näherungsweise dargestellt werden. Es tritt ein Informationsverlust auf, im Gegensatz zu ganzen Zahlen.
Beispiel :
N=8.4=12 Bit ➽ <’={0.0625 ••• 255.9375}
12.39(10) ➽ ≈ 00001100.0110(2) ➽ 12.375(10) ➽ 0.1 % Rundungsfehler
0.39(10) ➽ ≈ 00000000.0110(2) ➽ 0.375(10) ➽ 4 % Rundungsfehler
Seite 30
Dr. Stefan Bosse •
Grundlagen der Informatik
Reelle Zahlen :: Gleitpunktdarstellung (I)
➤ Gleitpunktdarstellung ermöglicht die Darstellung eines großen Intervalls der reellen Zahlen
in Exponentialdarstellung:
Z = V • M • BE
mit
(7)
V
M
Vorzeichen ±1
Mantisse
B
Basis, i.A. 10
E
Exponent
➤ Kodierung nach IEEE754-Format mit normierter Gleitpunktdarstellung:
Z = (−1)S • (1.F) • 2E
(8)
mit S={0,1} als Vorzeichen und F = Σfi 2−i mit fi ={0,1} als Fraktion der Mantisse in Binärdarstellung, sowie E als Exponent in Binärdarstellung.
Dr. Stefan Bosse •
Seite 31
Grundlagen der Informatik
Reelle Zahlen :: Gleitpunktdarstellung (II)
➤ Normierung findet durch Verschiebung der Mantisse nach links und gleichzeitigen Erhöhen
des Exponenten statt, bis nur noch ein führender (binärer) 1-Wert vor dem Komma steht.
➤ Beispiel: Dezimalzahlensystem B=10
Z=12.375 = 12.375 • 100
V=1
M=12.375
E=0
➽
1.2375 • 101
➤ Beispiel: Binärzahlensystem B=2
Z=12.375 = 1100.011 • 200
S=0
M=1100.011
E=0
➽
1.100011 • 23=11
S=0
F=100011
E=11
Seite 32
Dr. Stefan Bosse •
Grundlagen der Informatik
Reelle Zahlen :: Gleitpunktdarstellung (III)
➤ Darstellung der Mantisse (als Näherung aufgrund begrenzter Anzahl von Bits wenn untere
Grenze > -∞) im Binärzahlensystem:
M=
k
X
mi 2 i
(9)
i=−∞
mit 0 ≤ mi < B.
➤ Beispiel: Zerlegung der Zahl 18.5 in Exponentialdarstellung:
1•24 +0•23 +0•22 +1•21 +0•20 . 1•2−1
= 10010.1(2) •20
➤ Für normierte Gleitpunktzahlen gilt dann:
M=
N−1
X
m i 2 −i
(10)
i =0
mit 0 ≤ mi < B.
➤ Beispiel: Normierte Gleitpunktdarstellung der Zahl 18.5 in Exponentialdarstellung:
1•24 +0•23 +0•22 +1•21 +0•20 . 1•2−1
= 10010.1(2) •20
= 1.00101(2) •24
Dr. Stefan Bosse •
Seite 33
Grundlagen der Informatik
Reelle Zahlen :: Gleitpunktdarstellung (IV)
➤ Normierte Gleitpunktzahlen nutzen die Mantissenbits (feste Bitgruppenbreite) optimal mit
kleinsten Genauigkeitsverlust aus.
➤ Der Exponent wird durch einen Offsetwert immer positiv gehalten (Bias).
➤ Sonderfälle:
Z=0 ➽ nicht mit 1.F darstellbar
Z=∞
Z=NaN (Not a Number) ➽ z.B. Überlauf oder Divison durch Null liefert NaN
➤ Bitformat nach IEEE:
Einfach lang (32 Bit)
S
1
E
8
F
23 Bit
Doppelt lang (64 Bit)
S
1
Seite 34
E
11
F
52 Bit
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Logik :: Logische Werte
➤ Boolesche Logikwerte sind die Wahrheitswerte:
{”Wahr”,”Falsch”}, darstellbar mit Bits {1,0}
➤ Boolesche Werte stellen eine mathematische Methode zur Beschreibung von Digitallogiksystemen dar ➽ Boolesche Algebra
➤ Boolesche Variablen sind das Analogon zu mathematischen Variablen, die nur die Zustände {0,1} annehmen können.
➤ Technologieumsetzung durch Übergang von Variablen auf elektrische Signale .
➤ Technologische Logikwerte werden mittels physikalischer Größen kodiert und haben einen
Technologiebezug zu der Transistortechnik:
{0,1,L,H,Z,X}
0,1 ➽ {0V,3.3V}
Starke logische Werte . Es dürfen keine zwei Ausgangssignale von logischen Schaltungen zusammengeführt werden.
L,H
Schwache logische Werte . Es dürfen mehrere Ausgangssignale zusammengeführt
werden. Es gibt eine Auflösungsfunktion die bestimmt, welches Resultatsignal aus der
Überlagerung folgt.
Z,X
Tristate-Signale (Hochimpedanzausgang) und Don’t-Care (kein technischer Bezug).
Dr. Stefan Bosse •
Seite 35
Grundlagen der Informatik
Digitallogik :: Transistortechnologie
➤ Digitallogik wird i.A. technologisch mit elektronischen Bauteilen wie Transistoren umgesetzt.
➤ Ursprünglich Einsatz von Bipolartransistortechnik.
➤ Moderne Fertigungstechnologien (ASIC) setzen CMOS-FET-Technologie ein:
➽ CMOS: Complementary Metal Oxide Substrat
➽ FET: Field Effect Transistor
➽ ASIC: Application Specific Integrated Circuit
➥ Paarweiser Einsatz von komplementären MOSFET-Transistoren in N- und PKanaltechnik.
➤ MOSFET-Transistoren sind spannungsgesteurte Stromquellen mit folgender Übertragungsfunktion:
ID
ID
+5V
D
D
N
N-Kanal
R
P-Kanal
UGS
G
UGS
G
S
D
G
nicht leitend
S
UDS = U S- RI
D
leitend
S
D
[025]
D
UGS
P
G
Seite 36
Dr. Stefan Bosse •
S
G
Grundlagen der Informatik
S
Boolesche Logik :: Negation/Komplement
➤ Mit logischen Werten können boolesche Verknüpfungen durchgeführt werden. Einfachste
Verknüpfung ist die Negation.
Boolesche Funktion
Y = ¬X
Y = NOT(X)
Wahrheitstabelle
Die Schaltfunktion Y wird durch eine Wahrheitstabelle beschrieben, die eine vollständige
Zuordnung der Eingangsvariable X zur Ausgangsvariable Y erlaubt.
X
Y
0
1
1
0
Us
Logiksymbol und Transistorschaltung
X
P-Kanal MOSFET
1
Y X
Y
[013]
N-Kanal MOSFET
[014]
Dr. Stefan Bosse •
Seite 37
Grundlagen der Informatik
Boolesche Logik :: Konjunktion/Und-Verknüpfung
➤ Boolesche Grundverknüpfung mit N≥2 Eingangsvariabelen X1,X2,...
Boolesche Funktion
Y = X1 ∧ X2
Y = X1 • X2 ➽ 1-Bit-Mulitplizierer
Y = AND(X1,X2)
Wahrheitstabelle
Die Schaltfunktion Y wird durch eine Wahrheitstabelle beschrieben, die eine vollständige
Zuordnung der Eingangsvariablen X1 und X2 zur Ausgangsvariable Y erlaubt.
X1
X2
Y
0
0
0
0
1
0
1
0
0
NAND-Gatter
Us
X1
X2
Y
[015]
1
1
1
Logiksymbol und Transistorschaltung
X1
X2
Seite 38
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Logik :: Disjunktion/Oder-Verknüpfung
➤ Boolesche Grundverknüpfung mit N≥2 Eingangsvariabelen X1,X2,...
Boolesche Funktion
Y = X1 ∨ X2
Y = X1 + X2
Y = OR(X1,X2)
Wahrheitstabelle
Die Schaltfunktion Y wird durch eine Wahrheitstabelle beschrieben, die eine vollständige
Zuordnung der Eingangsvariablen X1 und X2 zur Ausgangsvariable Y erlaubt.
X1
X2
Y
0
0
0
0
1
1
1
0
1
1
1
1
NOR-Gatter
Us
X1
X2
Logiksymbol und Transistorschaltung
Y
X2
X1
[016]
Dr. Stefan Bosse •
Seite 39
Grundlagen der Informatik
Boolesche Logik :: Antivalenz/Exklusiv-Oder-Verknüpfung
➤ Verknüpfung
mit
Verknüpfungen
N≥2
Eingangsvariabelen
X1,X2,...,
darstellbar
mit
Oder/Und-
Boolesche Funktion
Y = X1 /≡ X2
Y = X1 ⊕ X2 ➽ 1-Bit-Addierer
Y = XOR(X1,X2)
Wahrheitstabelle
Die Schaltfunktion Y wird durch eine Wahrheitstabelle beschrieben, die eine vollständige
Zuordnung der Eingangsvariablen X1 und X2 zur Ausgangsvariable Y erlaubt.
X1
X2
Y
0
0
0
0
1
1
1
0
1
1
1
0
Basisreduktion
Y = X1 ⊕ X2 = ¬ X1•X2+X1•¬ X2
Seite 40
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Logik :: Äquivalenz
➤ Verknüpfung
mit
Verknüpfungen
N≥2
Eingangsvariabelen
X1,X2,...,
darstellbar
mit
Oder/Und-
Boolesche Funktion
Y = X1 ≡ X2
Y = X1 ↔ X2
Y = NXOR(X1,X2)
Wahrheitstabelle
Die Schaltfunktion Y wird durch eine Wahrheitstabelle beschrieben, die eine vollständige
Zuordnung der Eingangsvariablen X1 und X2 zur Ausgangsvariable Y erlaubt.
X1
X2
Y
0
0
1
0
1
0
1
0
0
1
1
1
Basisreduktion
Y = X1 ⊕ X2 = ¬ X1•¬ X2+X1•X2
Dr. Stefan Bosse •
Seite 41
Grundlagen der Informatik
Boolesche Logik :: Bitgruppen
➤ Man kann Bitgruppen als Folgen von logischen Werten darstellen.
➤ Die logischen Verknüpfungen lassen sich auch auf Bitgruppen anwenden.
➤ Die logische Verknüpfung von Bitgruppen erfolgt dann stellen/bit-weise.
➤ Beispiele :
NOT(01110110)
=============
10001001
◆
01110110
AND 11101011
=============
01100010
◆
01110110
OR 11101011
=============
11111111
Seite 42
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Algebra (I)
➤ Logische Variablen können mit logischen Funktionen und logischen Operatoren verknüpft
werden. Die Boolesche Algebra beschränkt sich dabei auf zweiwertige Logik der Wertemenge {0,1}.
➤ Eine boolesche Funktion ist eine Abbildung von N booleschen Variablen a i (N-dimensionaler
Vektor) mit 2N ×N Eingangswerten auf M boolesche Ergebniswerte y i (M-dimensionaler Vektor):
f(a1 , a2 , ..., aN) : a1 × a2 × ... → y
(11)
f(a) : BN → BM
(12)
➤ M=1 führt auf skalare boolesche Funktion.
➤ Die boolesche Algebra besteht aus drei elementaren Operationen:
Disjunktion
Oder-Verknüpfung von N Eingangsvariablen zu einem Ausgangswert:
y=a1 +a2 +a3 +...
Konjunktion
Und-Verknüpfung von N Eingangsvariablen zu einem Ausgangswert:
y=a1 •a2 •a3 •...
Negation
Invertierung eines booleschen Zustandes ¬ a
Dr. Stefan Bosse •
Seite 43
Grundlagen der Informatik
Boolesche Algebra (II)
➤ Boolesche Algebra (Boole, ≈ 1848) ist Hilfsmittel beim Entwurf von digitalen Schaltungen.
▼ Eine Aufgabenstellung definiert Schaltbedingungen,
▼ diese Schaltbedingungen werden in einer Wahrheits- oder Funktionstabelle dargestellt:
a1
0
0
1
1
a2
0
1
0
1
Y
1
1
1
0
▼ aus den Funktionstabellen werden boolesche Funktionen abgeleitet (äquivalente
Darstellungsform):
y=¬ a1 •¬ a2 +¬ a1 •a2 +a1 •¬ a2
▼ Die so gewonnenen Funktionen werden mit Gesetzen der booleschen Algebra umgeformat und vereinfacht:
y=¬ a1 +¬ a2
▼ Ziel: technische Realisierung mit minimalen Ressourcen-Aufwand, d.h. i.A. mit minimaler Zahl von 1. Variablen und 2. Verknüpfungen.
Seite 44
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Algebra (III)
➤ Gesetzte der booleschen Algebra für Termumformungen
Kommutativgesetze ➽ Vertauschungsregeln
a•b = b•a
(13)
a+b = b+a
(14)
➥ Die Variablen sind vertauschbar ➽ die Eingänge von Gattern sind vertauschbar.
Assoziativgesetze ➽ Anreihregeln
(a • b) • c = a • (b • c)
(15)
(a + b) + c = a + (b + c)
(16)
➥ Reihenfolge der Berechnung ist beliebig ➽ die Zusammenfassung von Eingängen
von Gattern ist beliebig.
a1
a2
a1
&
&
a3
Y
&
Y
a2
a3
&
[021]
Dr. Stefan Bosse •
Seite 45
Grundlagen der Informatik
Boolesche Algebra (IV)
➤ Gesetzte der booleschen Algebra für Termumformungen
Distributivgesetze ➽ Mischungsregeln
(a + b) • c = a • c + b • c
(17)
(a + b) • (c + d) = a • c + a • d + b • c + b • d
(18)
➥ Eine gemeinsame Variable in zwei verknüpften Termen kann ausgeklammert werden.
➥ Spezialfall: b=d
(a + b) • (b + c) = a • b + c
(19)
Seite 46
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Algebra (V)
➤ Gesetzte der booleschen Algebra für Termumformungen
Inversionsregeln ➽ De-Morgan-Regeln
(¬ a • ¬ b) = ¬ (a + b)
(20)
(¬ a + ¬ b) = ¬ (a • b)
(21)
➥ Transformation von Konjunktion nach Disjunktion und umgekehrt ➽ Transformation
von beliebigen booleschen Funktionen in entweder Und-Negation oder Oder-NegationBeschreibung.
Dr. Stefan Bosse •
Seite 47
Grundlagen der Informatik
Boolesche Algebra (VI)
➤ Gesetzte der booleschen Algebra für Termumformungen
Weitere Regeln
a•0=0 a•1=a
(22)
a+0=a a+1=1
(23)
a•a=a a+a=a
(24)
Bindungsregeln
1. Negation von Variablen oder Werten wird zuesrt evaluiert.
2. Und-Verknüpfung bindet stärker als Oder-Verknüpfung.
3. Alle anderen Verknüpfungen werden von links nach rechts evaluiert.
Seite 48
Dr. Stefan Bosse •
Grundlagen der Informatik
Boolesche Algebra (VII)
➤ Beispiel einer Vereinfachung einer Digitallogikschaltung mit Boolescher Algebra
Digitallogikschaltung
➥ Ableitung der booleschen Funktion:
Boolesche Gleichung (I)
y = b•(a+c)+c
Boolesche Gleichung (II)
➥ Mit Distributivgesetz folgt:
y = a•b+b•c+c
➥ Variable c Faktorisieren und b+1=1 nutzen:
y = a•b+c•(b+1) = a • b+c
Dr. Stefan Bosse •
Seite 49
Grundlagen der Informatik
Boolesche Normalformen
➤ Aus Funktionstabellen mit N Eingangsvariablen und einer Ausgangsvariable werden im ersten Entwurfsschritt sog. Normalformen von booleschen Funktionen abgleitet.
➤ Eine Normalform setzt sich aus U<2N Teiltermen zusammen. Die Teilterme werden zu
einer Funktion verknüpft.
➤ Man unterscheidet bezüglich Verknüpfung innerhalb eines Teiltermes und Verknüpfung der
Teilterme:
Disjunktive Normalform (DNF)
➥ Alle Variablen eines Teilterms werden Und-verknüpft (Disjunktion).
➥ Alle Teilterme werden Oder-verknüpft.
➥ SOP: Sum (+) of Products (•)
f(a1 , a2 , ..., aN) = (x11 • x12 • ... • x1N ) + (x21 • x22 • ... • x2N ) + ...
(25)
Konjunktive Normalform (KNF)
➥ Alle Variablen eines Teilterms werden Oder-verknüpft (Konjunktion).
➥ Alle Teilterme werden Und-verknüpft.
➥ POS: Product (•) of Sums (+)
f(a1 , a2 , ..., aN) = (x11 + x12 + ... + x1N ) • (x21 + x22 + ... + x2N ) • ...
Seite 50
Dr. Stefan Bosse •
Grundlagen der Informatik
(26)
Boolesche Normalformen :: DNF
➤ Die DNF wird aus der Funktionstabelle nach folgenden Regeln abgeleitet:
1. Zeilen der Funktionstabelle, die als Ergebniswert y=1 besitzen, generieren einen Teilterm.
2. Jeder Teilterm setzt sich aus dem Produkt aller Eingangsvariablen a i derart zusammen
daß gilt:
=Zeile
xiTerm
−te Variable =
ai wenn Eingangswert = 1
ai wenn Eingangswert = 0
¬
(27)
3. Alle Teilterme werden summiert.
Beispiel :
a1
a2
Y
0
0
1
➽ Teilterm 1
0
1
1
➽ Teilterm 2
1
0
1
➽ Teilterm 3
1
1
0
¬
¬
➽ y= a1 • a2 +¬ a1 •a2 +a1 •¬ a2
Dr. Stefan Bosse •
Seite 51
Grundlagen der Informatik
Boolesche Normalformen :: KNF
➤ Die KNF wird aus der Funktionstabelle nach folgenden Regeln abgeleitet:
1. Zeilen der Funktionstabelle, die als Ergebniswert y=0 besitzen, generieren einen Teilterm.
2. Jeder Teilterm setzt sich aus der Summe aller Eingangsvariablen a i derart zusammen
daß gilt:
=Zeile
xiTerm
−te Variable =
ai wenn Eingangswert = 0
ai wenn Eingangswert = 1
¬
3. Produktbildung aller Teilterme.
Beispiel :
a1
a2
Y
0
0
1
0
1
1
1
0
1
1
1
0
➽ Teilterm 1
➽ y=¬ a1 +¬ a2
Seite 52
Dr. Stefan Bosse •
Grundlagen der Informatik
(28)
Boolesche Normalformen :: Beispiel (I)
▼ Eine Schaltmaztrix mit drei Eingängen
▼
▼
▼
▼
X=(A,B,C) und einem Ausgang Y soll bestimmt werden.
An den Ausgang Y ist eine Lampe angeschlossen.
Die Eingänge werden über Schalter gesteuert:
Taste 1 gedrückt ➽ A=1
Taste 2 gedrückt ➽ B=1
Taste 3 gedrückt ➽ C=1
Immer wenn zwei Tasten gleichzeitig gedrückt werden (Xi =1), soll die Lampe
leuchten (Y=1).
Bestimmung der Funktionstabelle aus obigen Anforderungen und Vereinbarungen
A
B
Schaltwerk
Y
C
[030]
A
0
0
0
0
1
1
1
1
Dr. Stefan Bosse •
Seite 53
B
0
0
1
1
0
0
1
1
C
0
1
0
1
0
1
0
1
Y
0
0
0
1
0
1
1
0
Grundlagen der Informatik
Boolesche Normalformen :: Beispiel (II)
▼ Bestimmung der disjunktiven Normalform aus Funktionstabelle.
▼
1. Zeilen der Funktionstabelle, die als Ergebniswert y=1
besitzen, generieren einen Teilterm.
2. Jeder Teilterm setzt sich aus dem Produkt aller Eingangsvariablen ai derart zusammen daß gilt:
=Zeile
xiTerm
−te Variable
=
ai wenn Eingangswert = 1
¬
ai wenn Eingangswert = 0
(29)
3. Alle Teilterme werden summiert.
▼ Term 1: ¬ A•B•C
Term 2: A•¬ B•C
Term 3: A•B•¬C
▼ DNF:
Y(A,B,C) = (¬ A•B•C) +
(A•¬ B•C) +
(A•B•¬ C)
Seite 54
Dr. Stefan Bosse •
A
0
0
0
B
0
0
1
C
0
1
0
Y
0
0
0
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
1
1
1
1
0
Grundlagen der Informatik
Boolesche Normalformen :: Beispiel (III)
▼ Bestimmung der konjunktiven Normalform aus Funktionstabelle.
▼ 1. Zeilen der Funktionstabelle, die als Ergebniswert y=0
besitzen, generieren einen Teilterm.
2. Jeder Teilterm setzt sich aus der Summe aller Eingangsvariablen ai derart zusammen daß gilt:
=Zeile
xiTerm
−te Variable
=
ai wenn Eingangswert = 0
¬
ai wenn Eingangswert = 1
(30)
3. Produktbildung aller Teilterme.
▼ Term 1: A+B+C
Term 2: A+B+¬ C
Term 3: A+¬ B+C
Term 4: ¬ A+B+C
Term 5: ¬ A+¬ B+¬ C
▼ KNF:
Y(A,B,C) = (A+B+C) • (A+B+¬ C) • (A+¬ B+C) •
(¬ A+B+C) • (¬ A+¬ B+¬ C)
Dr. Stefan Bosse •
Seite 55
A
B
C
Y
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
1
1
0
0
0
1
1
0
1
1
0
1
1
1
1
1
0
Grundlagen der Informatik
Boolesche Normalformen :: Zusammenfassung
⊕ Bestimmung der Booleschen Funktion in Normalform direkt aus Funktionstabelle
möglich.
⊕ Beliebige Schaltwerke lassen sich mittels Normalformen darstellen.
Die Normalform ist überbestimmt und kann i.A. reduziert werden bezüglich
1. Anzahl von Teiltermen,
2. Anzahl von Variablen von Teiltermen,
3. Anzahl der Verknüpfungen ≡ Logikgattern.
➤ Disjunktive Normalform ist bevorzugt bei Funktionstabellen mit kleiner Anzahl von
Zeilen die als Ergebniswert 1 besitzen ➽ minimale Anzahl von Teiltermen.
➤ Konjunktive Normalform ist bevorzugt bei Funktionstabellen mit kleiner Anzahl
von Zeilen die als Ergebniswert 0 besitzen ➽ hier minimale Anzahl von Teiltermen.
Seite 56
Dr. Stefan Bosse •
Grundlagen der Informatik
Systematische Reduktion logischer Funktionen
➤ Ziel der Minimierung: möglichst kleine Anzahl von Logikgatter-Komponenten bei der elektronischen Implementierung bei gleichzeitiger geringer Signallaufzeit, zwei gegenläufige Ziele!
➤ Man unterscheidet vier grundlegende Verfahren:
1. Minimierung mittels Gesetzen der Booleschen Algebra - nicht systematisch.
2. Karnaugh-Veitch-(KV) Diagramme, beschränkt auf kleine Anzahl von Funktionsvariablen ➽ Grafische Methode.
3. Quine-McCluskey-Verfahren, systematisch, für mittlere Anzahl von Funktionsvariablen
geeignet ➽ Termbasierte Methode.
4. Binary-Decision-Diagrams (BDD), häufiger in Synthese-Programmen verwendet ➽
Graphenbasiertes Verfahren.
v1
X1
Quelle / Wurzelknoten
0
1
v2
v3
X2
0
X2
1
0
1
Seite 57
Dr. Stefan Bosse •
Innere Knoten
1
0
Senke
Grundlagen der Informatik
KV-Diagramme (I)
➤ Die KV-Diagramm-Methode ist anschaulich und intuitiv, und soll als Einstieg verstanden
werden.
➤ Darstellung von N Eingangsvariablen {A,B,...} und einer Ausgangsvariable F.
➤ Es findet eine Darstellung der Funktionstabelle in Zeilen und Spalten eines Diagramms statt.
➤ Jedes Feld entspricht einem Eingangsvektor, z.B. (A,B,C,D)=(1,0,0,1).
➤ Dabei sind die Diagrammfelder so angeordnet, daß sich bei einem Übergang von einem zu
einem anderen Feld immer nur eine Variable ändert.
➤ Es existieren unterschiedliche Diagramme für DNF (SOP) und KNF (POS) Darstellungen.
➤ In jedem Feld wird der zu den Werten der Eingangsvariablen gehörende Ausgangszustand/wert Fi ={0,1} eingetragen.
➤ Das Diagramm ist zyklisch: der Übergang von rechten Rand zum linken, und von unteren
zum oberen ist möglich ➽ ≡Torusoberfläche
➤ Bei drei Eingangsvariablen reduziert sich das Diagramm um zwei Zeilen.
➤ Im folgenden: Vier Eingangsvariablen ➽ F: (A,B,C,D) → {0,1}
Seite 58
Dr. Stefan Bosse •
Grundlagen der Informatik
KV-Diagramme (II) :: DNF
Seite 59
Dr. Stefan Bosse •
Grundlagen der Informatik
KV-Diagramme (III) :: DNF
Reduzierte disjunktive Normalform (RDNF)
1. Benachbarte Felder Fi =1 werden zu Flächen mit 2M Elementen (M={0,1,2,3,...}) zusammengefaßt.
2. Alle Felder müssen in mindestens einer Fläche/Gruppe erfaßt werden.
3. Ableitung eines neuen Teilterms der RDNF aus einer Fläche/Gruppe:
➽ Produkt aus allen Variablen, die allen Feldern der Gruppe gemeinsam sind.
4. Die Teilterme werden summiert.
Beispiel
Aus KV-Diagramm folgt RDNF:
F0 (A, B, C, D) = ¬ A • ¬ C + A • C • D + ¬ B • C • ¬ D
(31)
➽ Es ist eine Reduktion von ursprünglich 49 booleschen Operationen und 8 Teiltermen auf 11 Operationen und 3 Teiltermen erfolgt! Nimmt man im Mittel 4
CMOS-Transistoren je boolescher Operation an, ergibt sich eine Verringerung der Transistoren um 196
→ 44 und einer Verringerung der Chip-Fläche um
den Faktor 2.11!
Seite 60
Dr. Stefan Bosse •
Grundlagen der Informatik
KV-Diagramme (IV) :: KNF
Seite 61
Dr. Stefan Bosse •
Grundlagen der Informatik
KV-Diagramme (V) :: KNF
Reduzierte konjunktive Normalform (RKNF)
1. Benachbarte Felder Fi =0 werden zu Flächen mit 2M Elementen (M={0,1,2,3,...}) zusammengefaßt.
2. Alle Felder müssen in mindestens einer Fläche/Gruppe erfaßt werden.
3. Ableitung eines neuen Teilterms der RKNF aus einer Fläche/Gruppe:
➽ Summe aus allen Variablen, die allen Feldern der Gruppe gemeinsam sind.
4. Produktbildung aller Teilterme.
Seite 62
Dr. Stefan Bosse •
Grundlagen der Informatik
Berechnungsmodelle (I)
Berechnung
Ausführung eines Programms durch eine Maschine. Ein Programm ist eine Ausführungsvorschrift von Anweisungen.
Berechnungsmodell
Modell zur Beschreibung der Berechnung, ohne konkret auf eine bestimmte Rechnerarchitektur einzugehen.
➥ Abstrakte Beschreibung, möglichst einfach zu modellieren und analysieren!
➥ Berechnungsmodell beschreibt eine abstrakte Maschine.
Speicherorientierte Modelle
Berechnung findet mit einem Speicher als zentralen Bestandteil des Modells bzw. der
Maschine statt.
Ein Speicher besteht aus einer Anzahl N von Zellen, die jeweils ein Datenowrt der
Bitbreite D aufnehmen können.
Berechnung ändert schrittweise den Speicher.
Turing-Maschine
Der Speicher einer Turing-Maschine besteht aus einzelnen Zellen, die jeweils ein
Zeichen eines endlichen Alphabets enthalten können.
Die Zellen können nicht direkt adressiert werden, sondern die Maschine muß sich
schrittweise von einer Zelle zur nächsten weiterbewegen!
Dr. Stefan Bosse •
Seite 63
Grundlagen der Informatik
Berechnungsmodelle :: Definition Turing-Maschine (I)
Die Turing-Maschine besteht aus folgenden (abstrakten) Komponenten:
Bandalphabet
Ein endliches Bandalphabet V beschreibt die Menge der Zeichen, die die Turing-Maschine
verarbeiten kann. Das Bandalphabet muß aus mindestens einem Zeichen bestehen. Im Falle von binären Werten ist V={0,1}.
Zusätzlich gibt es das Leerzeichen ^ (Datentrennzeichen), welches nicht in V enthalten ist:
^<V
Band
Mindestens ein nach beiden Seiten unendlich langes Band K, eingeteilt in einzelne Speicherzellen.
➥ Jede Speicherzelle enthält entweder ein Zeichen v∈V oder ^!
Band K
➽
•••
^
0
1
1
^
⇑⇓
•••
➽
SLK
Schreib-Lese-Kopf
Zu jedem Band gehört ein Schreib-Lese-Kopf (SLK), der zu jedem Zeitpunkt sich über einer
Speicherzelle des Bandes K befindet. Der SLK kann den Inhalt einer Zelle lesen und mit
einem Zeichen aus V ∩ {^} überschreiben.
➥ Der SLK kann in einem Schritt nach links oder rechts bewegt werden.
Seite 64
Dr. Stefan Bosse •
Grundlagen der Informatik
Berechnungsmodelle :: Definition Turing-Maschine (II)
Steuerwerk
Ein Steuerwerk, das sich zu jedem Zeitpunkt in einem von endlich vielen Zuständen befindet!
Zustände: Z={Z0 ,Z1 •••ZN−1}
➥ Anfangszustand: Z0
➥ Das Steuerwerk wird daher auch als endlicher Zustandsautomat bezeichnet!
➤ Zustände werden in Zustandsdiagrammen mit Zustandsübergängen dargestellt.
➤ Jeder Zustand wird jeweils einmal mittels des Kreissymbols aufgeführt.
➤ Unter einer bestimmten Bedingung Bij findet ein Übergang des Zustandsautomaten vom
Zustand Zi zu Zj statt, dargestellt durch Pfeile. Bilden Übergänge einen geschlossen Kreis,
spricht man von zyklischen Zustandsdiagrammen.
Dr. Stefan Bosse •
Seite 65
Grundlagen der Informatik
Zustandsdiagramm :: Beispiel (I)
Bandalphabet
Binärzahlen (Bits) V={0,1}
Aufgabe
Es soll folgende sequenzielle Bitfolge in einem kontinuierlichen Datenstrom gefundne werden:
F=[0,1,1,0]
Band K
Das Band K liefert die Eingabedaten und nimmt die Ergebnisse auf.
Zustandsmenge und Operationen
Z={Z0 ,Z1 ,Z2 ,Z3 ,Z4 }
Operationsmenge: OP={READ,WRITE,COMP}
READ
x=READ ➽
Lese ein Zeichen vom Band K und weise es der symbolischen Variable x zu.
WRITE
WRITE v ➽
Schreibe ein Zeichen v auf Band K.
COMP
COMP a b ➽
Vergleiche zwei Zeichen.
Seite 66
Dr. Stefan Bosse •
Grundlagen der Informatik
Zustandsdiagramm :: Beispiel (II)
Seite 67
Dr. Stefan Bosse •
Grundlagen der Informatik
Dr. Stefan Bosse •
Grundlagen der Informatik
Turing-Maschine :: Arbeitsweise (I)
Schematischer Aufbau
Anweisungen
Anweisungen für eine Turing-Maschine bestehen aus:
1. Vorbedingung B
2. Aktion A
Seite 68
Turing-Maschine :: Arbeitsweise (II)
Vorbedingung B
Die Vorbedingung gibt an, welches Zeichen in der aktuellen Speicherzelle enthalten sein
muß, und in welchem Zustand Z sich das Steurwerk befinden muß, damit die Ausführung
der Anweisung erlaubt ist.
Beispiel
Anweisung
WRITE 1
Bedingung
x=0, Z3 →Z4
Aktion A
Die Aktion schreibt vor, welches Zeichen in die aktuelle Zelle zu schreiben ist, und in welcher
Richtung der SL-Kopf zu bewegen ist.
Programm P
Ein Programm für eine Turing-Maschine ist eine endliche Menge solcher Anweisungen:
P={A0 ,A1 ,•••,AM−1 }
➥ Die Reihenfolge der Anweisungen kann beliebig sein (aber deterministisch). Jede
Anweisung tritt nur einmal im Programm auf.
➥ Gibt es in jeder Situation nur eine passende Anweisung, so heißt die Maschine
deterministisch .
Dr. Stefan Bosse •
Seite 69
Grundlagen der Informatik
Turing-Maschine :: Vorteile & Nachteile diese Modells
Vorteile
1. Von jedem bis heute untersuchten Formalismus bzw. Algorithmus konnte gezeigt werden, daß er auf einer TM simuliert bzw. ausgeführt werden kann.
2. Die Berechnungschritte der TM sind primitiv.
➽ Daher immer mechanisierbar und technologisch umsetzbar!
3. Beschreibung ist sehr einfach und anschaulich.
Nachteile
1. Unendlich langes Band ist nicht realisierbar.
2. Programmierung der TM ist kompliziert, da Programmierbefehle (Anweisungen) sehr
primitiv sind.
3. Programme für TM nicht direkt übertragbar auf Maschinenprogrammierung heute üblicher von Neumann-Rechnerarchitektur.
4. TM-Programmierung ist nicht abstrakt, sondern maschinennah, daher ist aus der Struktur des Programms der Ablauf der Berechnung nicht ersichtlich.
Seite 70
Dr. Stefan Bosse •
Grundlagen der Informatik
Turing-Maschine :: Variationen (I)
Multibandmodell
Verwendung mehrerer Bänder K1 ,K2 ,••• mit eigenen Schreib-Lese-Köpfen.
➥ Spezialfall:
KI
Eingabeband, kann nur gelesen werden.
KO
Ausgabeband, auf das nur geschrieben werden kann.
➥Vorteil: besseres Verständnis der Arbeitsweise und Schreib-/Lese-Aktivitäten der TM.
Band KI
1 0
0
[034]
Lese-Kopf
Steuerwerk
Band KO
B
Z0
Schreib-Kopf
Z 10
A
1
Dr. Stefan Bosse •
Seite 71
Grundlagen der Informatik
Turing-Maschine :: Variationen (II)
Register
Hinzufügen eines frei adressierbaren Registerspeichers mit N Zellen R 0 ,R1 ,•••
➥ Jede Zelle kann unabhängig von jeder anderen gelesen werden.
➥ Jede Zelle kann unabhängig von jeder anderen beschrieben werden.
➥ Vorteil: Register können als Zwischenspeicher mit Rückwirkung verwendet werden, d.h.
zu einem späteren Zeitpunkt kann ein gespeicherter Wert abgerufen und wieder verwendet
werden.
Band KI
1 0
0
[035]
Lese-Kopf
Register-File
R0
R1
Steuerwerk
RN-1
Schreib-Kopf
Band KO
Seite 72
1
Dr. Stefan Bosse •
Grundlagen der Informatik
Turing-Maschine :: Variationen (III)
Band ⊕ Register ➽ Zentraler Hauptspeicher
Zusammenfassung von Bändern und Registern zu einem frei adressierbaren Speicher.
➥ Reine Registermaschine!
➥ Vorteil: Reine Registermaschine besitzt ähnliches Modell und Programmausführung wie
die von-Neumann-Rechnerarchitektur!
[036]
Speicher
Steuerwerk
S0
S1
SN-1
Dr. Stefan Bosse •
Seite 73
Grundlagen der Informatik
Turing-Maschine :: Simulator VTURI (I)
Aufbau von VTURI
Alphabet
Die VTURI-Maschine verarbeitet vorzeichenbehaftete ganze Zahlen. Die Zahlen werden binär- bzw. zweierkomplement-kodiert, und besitzen eine Datenbreite von 31 Bit.
V={=}, =={-1073741824...1073741823}
Bänder
Die Ein- und Ausgabebänder werden durch Dateien (benannte Datenspeicher auf einem nichtflüchtigen Speicher) ersetzt.
➥ Der SL-Kopf ist ein Dateizeiger, der nur in eine Richtung (eine Stelle nach rechts)
durch die Lese oder Schreiboperation weitergesetzt wird.
Programm
Das Programm, welches aus einer Sequenz von elementaren Anweisungen besteht,
wird ebenfalls in einer Datei abgelegt. Das Programm wird beim Start in den Programmspeicher geladen.
Register
Es stehen N Register R0 •••RN−1 zur Verfügung. Diese Register können Zeichen v∈V
aus dem Bandalphabet V ausnehmen.
Seite 74
Dr. Stefan Bosse •
Grundlagen der Informatik
Turing-Maschine :: Simulator VTURI (II)
Aufbau von VTURI
Steuerwerk
Befehlszähler
Das Steuerwerk enthält einen Befehlszähler BZ, der auf die Speicherzelle mit der
aktuellen Programmanweisung zeigt.
AKKU
Das Steuerwerk enthält ein Akkumulator-Register, welches bei vielen Anweisungen als interner Zwischenspeicher genutzt wird. Es kann ebenfalls ein Zeichen
v∈V aus dem Bandalphabet V aufnehmen.
Das AKKU-Register kann mit Werten aus
1. dem Eingabeband (READ),
2. beliebigen Registern (LOAD) beschrieben werden,
und Werte an
1. das Ausgabeband (WRITE),
2. und beliebigen Registern (STORE) schreiben.
ALU
Die VTURI-Maschine kann einfache arithmetische Operationen wie Addition ausführen.
Dr. Stefan Bosse •
Seite 75
Grundlagen der Informatik
Turing-Maschine :: Simulator VTURI (III)
Band KI
= Datei
1 0
0
Dateizeiger
READ
Programm
ALU
[037]
STORE
R0
R1
AKKU
BZ
LOAD
Dateizeiger
Band KO
= Datei
Seite 76
WRITE
RN-1
Register-File
1
Dr. Stefan Bosse •
Grundlagen der Informatik
Turing-Maschine :: Simulator VTURI (IV)
Befehlssatz ➽ Anweisungen
READ
Lädt das nächste Zeichen v∈V vom Eingabeband K I in das Akkumulatorregister.
BZ←BZ+1; AKKU←KI
WRITE
Schreibt ein Zeichen in das Ausgabeband K O aus dem Akkumulatorregister.
BZ←BZ+1; KO ←AKKU
LOAD OP
Lädt das nächste Zeichen v∈V aus dem Register R i in das Akkumulatorregister.
BZ←BZ+1; AKKU←OP
➥ OP: {Konstante | Register R[i]}
STORE R[i]
Schreibt ein Zeichen in das Register Rj aus dem Akkumulatorregister.
BZ←BZ+1; Rj ←AKKU
ADD OP
Addiert zum aktuellen Inhalt des AKKU-Registers den Operanden OP und schreibt das
Ergebnis wieder in das AKKU-Register.
BZ←BZ+1; AKKU←AKKU+OP;
➥ OP: {Konstante | Register R[i]}
Dr. Stefan Bosse •
Seite 77
Grundlagen der Informatik
Turing-Maschine :: Simulator VTURI (V)
Befehlssatz ➽ Anweisungen
SUB OP
Subtrahiert vom aktuellen Inhalt des AKKU-Registers den Operanden OP und schreibt
das Ergebnis wieder in das AKKU-Register.
BZ←BZ+1; AKKU←AKKU-OP;
➥ OP: {Konstante | Register R[i]}
MUL OP
Multipliziert zum aktuellen Inhalt des AKKU-Registers den Operanden OP und schreibt
das Ergebnis wieder in das AKKU-Register.
BZ←BZ+1; AKKU←AKKU*OP;
➥ OP: {Konstante | Register R[i]}
DIV OP
Dividiert aktuellen Inhalt des AKKU-Registers durch den Operanden OP und schreibt
das Ergebnis wieder in das AKKU-Register.
BZ←BZ+1; AKKU←AKKU/OP;
➥ OP: {Konstante | Register R[i]}
HALT
Hält die Turing-Maschine an. Die TM erreicht den Endzustand und führt keine weiteren
Befehle aus. Das Programm ist ausgeführt.
Seite 78
Dr. Stefan Bosse •
Grundlagen der Informatik
Turing-Maschine :: Simulator VTURI (VI)
Befehlssatz ➽ Anweisungen
JUMP LABEL
Verzweigt die Programmausführung zu einer Anweisung, die durch das Label bzw. die
Adresse der Programmspeicherzelle gegeben ist.
BZ←LABEL;
➥ LABEL: {Speicherzelle | Symbolisches Label}
JZERO LABEL
Verzweigt nur dann die Programmausführung zu einer Anweisung, die durch das Label
bzw. die Adresse der Programmspeicherzelle gegeben ist, wenn der Akkumulator den
Wert Null enthält.
IF AKKU=0 THEN BZ←LABEL ELSE BZ←BZ+1;
➥ LABEL: {Speicherzelle | Symbolisches Label}
Adressierungsarten
Art
Wirkung
direkt
R[index]
indireket
R[R[index]]
Dr. Stefan Bosse •
Seite 79
Grundlagen der Informatik
VTURI :: Beispiel (I)
Digitale Signalverarbeitung ➽ Tiefpaßfilter 1. Ordnung
Mathematisch
Mittelwertbildung M eines zeitdiskreten Signals x:
N
1X
M(x, N) = f(x, N) =
x(i)
N i =1
(32)
➥ Zeitlich kontinuierliche Mittelwertbildung nicht möglich, da ein ausgewiesener Start- und
Endzustand für f(x,N) existieren muß!
➥ Bei N=const gibt es nur alle N Zeitschritte einen neuen Mittelwert, und eine Reinitialisierung der Summe ist notwendig!
Exponentielle Mittelwertbildung EM mit Rekursionsgleichung:
EM(x, i) = f(x, i) = x(i) • (1 − b) + f(x, i − 1) • b
x
Signalflußdiagramm
Seite 80
Z
(1-b)
-1
(33)
f(x)=EM
[038]
b
Dr. Stefan Bosse •
Grundlagen der Informatik
VTURI :: Beispiel (II)
Programm
Ablauf-Flußdiagramm
XM:=0, XM_1:=0;
[039]
B:=0.9, B1:=0.1;
X:=READ;
XM_1:=XM;
XM:=X*B1+XM_1*B
LOAD 0;
STORE R[0];
STORE R[1];
LOOP:
READ;
STORE R[2];
LOAD R[0];
STORE R[1];
LOAD R[2];
DIV 10;
STORE R[0];
LOAD R[1];
MUL 9;
DIV 10;
ADD R[0];
STORE R[0];
WRITE;
JUMP LOOP;
−− XM
−− XM_1
−−
−−
−−
−−
−−
−−
−−
X
XM
XM_1
X
X*B1
XM
XM_1
−− XM_1*B
−− XM
−− XM
WRITE XM;
Dr. Stefan Bosse •
Seite 81
Grundlagen der Informatik
Berechnungsmodelle :: Funktionale Modelle
➤ Bei funktionalen Berechnungsmodellen bleibt die Art und Weise der Berechnung, d.h. der
Programmfluß unbeachtet!
➤ Speichermodelle werden durch Speicherinteraktion beschrieben, funktionale Modelle durch
Funktionen, die Eingabedaten auf Ausgabedaten abbilden, prinizipiell in einem einzigen
Schritt!
➤ Nicht wie, sondern was berechnet werden soll wird modelliert und beschrieben!
Beispiel
Zwei einstellige Funktionen F und G und eine vierstellige Funktion H bilden einen neue
zweistellige Funktion M:
M : (X, Y) → H(F(X), Y, G(x), 0)
(34)
Die Arbeitsweise, d.h. das zeitlich sequenzielle Verhalten ist nicht näher spezifiziert.
Durch Zusammenschalten solcher Funktionseinheiten gewinnt man neue Funktionen,
deren Details versteckt werden können.
➥ Modularisierung und Abstraktion!
[0340]
X
F
G
H
Y
0
Seite 82
Dr. Stefan Bosse •
Grundlagen der Informatik
Rechnerarchitektur :: Komponenten und Aufbau einer EDV (I)
Zentrale Recheneinheit (CPU)
Die CPU dient der Programmausführung und bearbeitet arithmetische Operationen.
Arbeitsspeicher
Hauptspeicher für Programme und Daten ➽ Primärspeicher
Langzeitspeicher
Externe Datenspeicher für Programme und Daten ➽ Sekundärspeicher
EA: Peripherie
für Kommnunikation
1. zwischen einzelnen Komponenten eines Rechners ➽ Bussysteme
2. mit externen Geräten wie z.B. einem Drucker zur Textausgabe ➽ Schnittstellen
EA: Benutzerinteraktion
Text- und Grafikbildschirm ➽ Ausgabe (A)
Tastatur für die Texteingabe ➽ Eingabe (E)
➽ Eingabe
Kodierung von Informationen in Daten
➽ Ausgabe
Dekodierung von Daten in Informationen
Dr. Stefan Bosse •
Seite 83
Grundlagen der Informatik
Rechnerarchitektur :: Komponenten und Aufbau einer EDV (II)
Primärspeicher=
Hauptspeicher
Zeitsteuerung
Taktgeber
Zentrale
Recheneinheit
CPU
RAM
ROM
Sekundärspeicher=
Langzeitspeicher
Benutzerinteraktion
Schnittstellen
Externe Geräte
[040]
Externer
Speicher
Ein- und Ausgabe
Daten <=> Informationen
Seite 84
Dr. Stefan Bosse •
Grundlagen der Informatik
Von-Neumann-Rechnerarchitektur (I)
➤ Ein Großteil aller Rechneranlagen basieren auf dem v. Neumann-Konzept (≈1946):
1. Der Rechner besteht aus 4 Werken (Verarbeitungseinheiten):
Leitwerk
Das Leitwerk interpretiert das Programm und führt es aus. Es ist ein endlicher Zustandsautomat. Das Programm bewirkt direkte Zustandsänderungen.
Rechenwerk
Das Rechenwerk führt arithmetische, logische und relationale Operationen durch.
Hauptspeicher
Arbeitsspeicher für Programme und Daten.
Ein- und Ausgabewerk
Schnittstelle für den Datenaustausch mit der Umwelt sowie Langzeitspeicher (Sekundärspeicher).
2. Die Struktur des Rechners ist unabhängig vom zu lösenden Problem, was bearbeitet
werden soll.
Konzept ➽ Programmsteuerung
3. Programme und Daten werden im gleichen Speicher abgelegt. Daten in Speicherzellen
können durch die Maschine verändert werden.
4. Die Maschine benutzt Binärkodierung für Programme und Daten.
Zahlen werden im Binärzahlensystem dargestellt.
Dr. Stefan Bosse •
Seite 85
Grundlagen der Informatik
Von-Neumann-Rechnerarchitektur (II)
➤ Weitere Definitionen und Regeln:
4. Der Hauptspeicher ist in Zellen gleicher Größe unterteilt, die durch fortlaufende Nummern bezeichnet werden (Adressen).
➥ Eine Speicherzelle besteht aus N Bits, z.B. 1 Byte=8 Bit.
Daten
Eingabe
Hauptspeicher
Ausgabe
Programm
5. Das Programm besteht aus einer Folge von Befehlen, die sequenziell ausgeführt werden.
➤ Das von der Turing-Maschine bekannte Ein- und Ausgabeband ist im Haupt- und Langzeitspeicher implementiert.
➤ Das Bandalphabet sind Binärzahlen im Bereich V={-2 N−1 ...2N -1}.
➤ Der Programmspeicher ist ebenfalls im Haupt- und Langzeitspeicher implementiert.
➤ Die Programmbefehle bestimmen direkt die Ablaufsteuerung und den Kontrollfluß, d.h. Zustandsänderungen der Maschine ➽ Imperative Programmierung mit Maschinenbefehlen!
Seite 86
Dr. Stefan Bosse •
Grundlagen der Informatik
Zentrale Recheneinheit :: Der Mikroprozessor (I)
BZ
Adreßbus
Befehlszähler
Speicher
Datenbus
SR
Statusregister
BR
Befehlsregister
Register
ALU
BZ
BR
ALU
Register
SR
Befehlssteuerung
Rechenwerk
Leitwerk
Allgemeine Register
Der Prozessor ist Kernelement jeder Rechenanlage. Im Prozessor
werden einzelne Befehle eines Programms ausgeführt. Arithmetische Operationen werden im Rechenwerk (ALU) ausgeführt.
ArithmetischeLogischeRecheneinheit
Datenbus
Biderektionale Übertragung von Daten in
und aus dem Speicher
Adreßbus
Übertragung
der
Zellenadresse.
Dr. Stefan Bosse •
Seite 87
Grundlagen der Informatik
Zentrale Recheneinheit :: Der Mikroprozessor (II)
➤ Der Prozessor besitzt wie die Register-Turing-Maschine einen frei adressierbaren Registersatz. Es gibt zwei verschiedene Arten von Registern:
Universalregister
Das Programm kann mit Befehlen frei über die Verwendung der Register verfügen.
Spezialregister
Regiser, die für eine bestimmte Verwendung reserviert sind, z.B. Register für die
Speicher-Adreßrechnung oder für arithmetische Operationen, Konfigurationsregister
usw.
➤ Das auszuführende Programm ist in einzelne Befehle unterteilt, sog. Maschinenbefehle.
➤ Diese Maschinenbefehle können nach folgenden Gruppen klassifiziert werden:
Arithmetische Operationen (mit ALU)
Addition, Subtraktion, logische Schiebeoperationen, logische Verknüpfungen
Datentransfer
Speicher- und Registerzugriffe mit Datenübertragung zwischen Registern, zwischen
Registern und Speicher, und bei einige Prozessoren direkte Speichertransfers.
Ablaufsteuerung
Ablaufsteuerung und Kontrollfluß des Programms durch bedingte und unbedingte
Sprungbefehle (≡ Adreßrechnung auf dem Programmspeicher).
Seite 88
Dr. Stefan Bosse •
Grundlagen der Informatik
Zentrale Recheneinheit :: Der Mikroprozessor (III)
➤ Maschinenbefehle werden durch Binärzahlen kodiert.
Beispiel: Befehle der Turing-Maschine VTURI
➤ Neben dem Befehlskode enthält
der Befehl i.A. Operanden.
➤ Beispiel VTURI:
LOAD 0;
STORE R[1];
ADD 12;
MUL 7;
Befehl (symb.)
Kodierung
READ
1000
WRITE
1001
LOAD OP
1010
STORE OP
1011
ADD OP
1100
SUB OP
1101
OP-Art
Kodierung
MUL OP
1110
CONST
01
DIV OP
1111
REG
10
JUMP OP
0111
REG[REG]
11
JZERO OP
0101
NO OP
00
HALT
0000
➤ Die Art des Operanden muß
ebenfalls im Befehl kodiert werden:
Dr. Stefan Bosse •
Seite 89
Grundlagen der Informatik
Zentrale Recheneinheit :: Der Mikroprozessor (IV)
➤ Der eigentliche Kommandkode, der Operandenkode für ein oder mehrere Operanden, und
der/die Operandenwert(e), wie z.B. konstante Werte oder Registerindizes, müssen in einem
Befehlskodewort zusammengefasst werden.
➤ Eine konstante Befehlswortlänge ist anzustreben um
1. die Dekodierung des Befehlskodes möglichst einfach zu halten, und
2. um einen Befehl aus dem Speicher laden zu können, bevor er kodiert wurde!
➤ Ist die Befehlswortlänge nicht konstant, muß zuerst der Kommandokode und der Operandenkode geladen werden, dann die Operandenwerte.
➤ Die Befehlswortlänge sollte ein ganzes Vielfaches der Speicherwortbreite betragen ➽ optimale Ausnutzung des Speichers und vereinfachtes Laden des Befehls.
➤ Beispiel: Konstante Befehlswortlänge von VTURI mit
◆ Programmspeicher: Wortbreite 8 Bit
◆ Anzahl der Register: 8
Befehlskode
Operandenkode
Operandenwert
4
4
32
➥ Es werden für jeden Befehl 5 Speicherworte, d.h. 5 Speicherzugriffe benötigt!
Seite 90
Dr. Stefan Bosse •
Grundlagen der Informatik
Zentrale Recheneinheit :: Der Mikroprozessor (V)
➤ Beispiel: Variable Befehlswortlänge von VTURI mit
Befehlskode
Operandenkode
Registerindex
4
4
8
Befehlskode
Operandenkode
Konstantenwert
4
4
32
➥ Es werden für jeden Befehl zwischen 2-5 Speicherworte, d.h. 2-5 Speicherzugriffe benötigt!
➥ Effizientere Ausnutzung des Programmspeichers bei reinen Registeroperanden!
➥ Aber Befehlsausführungsphase ist unterteilt: Befehlsdekodierung (1. Wort) und Operandenholphase.
➤ Man unterscheidet zwei verschiedene Mikroprozessorarchitekturen:
RISC :: Reduced Instruction Set Computer
Eigenschaften: Nur elementare Befehle, Beispiel VTURI (11 Befehle), i.A. konstante
Befehlswortlänge, Operationen sind registerbasiert.
CISC :: Complex Instruction Set Computer
Eigenschaften: komplexe Befehle, Beispiel Intel-Pentium (ca. 200 Befehle), keine konstante Befehlswortlänge, Operationen sind speicherbasiert.
Dr. Stefan Bosse •
Seite 91
Grundlagen der Informatik
Zentrale Recheneinheit :: Das Leitwerk (I)
➤ Die Arbeitsweise des Leitwerks wird durch drei wesentliche Register beschrieben:
Befehlszähler BZ
Jeder Befehl ist im Speicher unter einer bestimmten Adresse abgelegt (erste Speicherwort eines Befehls). Der Befehlszähler zeigt auf den nächsten auszuführenden Befehl,
d.h. ADDR(Befehl)=BZ.
Befehlregister BR
Das Befehlsregister enthält den Befehlskode des aktuell auszuführenden Befehls (ohne Operanden). Der Befehlskode im BR wird vom Befehlsdekoder in einzelne Signale
dekodiert, die bestimmte Aktionen im Leitwerk und Rechenwerk auslösen.
Statusregister SR
Das Statatusregister nimmt Rückmeldungen aus dem Rechen- und Leitwerk auf und
kann die Programmausführung beeinflussen.
Beispiel: Im Rechenwerk ist bei einer arithmetischen Operation der Wert Null aufgetreten. Ein nachfolgender JZERO Befehl verzweigt darauf die Programmausführung.
➥ Einzelne Bits des Registers sind bestimmten Bedingungen zugeordnet:
ZERO
Seite 92
OVERFLOW
NEGATIVE
Dr. Stefan Bosse •
Grundlagen der Informatik
Zentrale Recheneinheit :: Das Leitwerk (II)
➤ Die Ausführung eines Befehls eines Programms findet in verschiedenen Phasen statt (klassische v. Neumann-Architektur):
I. Befehlsholphase
Der nächste Maschinenbefehl, adressiert durch BZ-Register, wird aus dem Arbeitsspeicher ℘ in das Befehlsregister BR geladen:
BR←℘(BZ)
II. Dekodierungsphase
Der als Binärzahl kodierte Befehl muß dekodiert werden um die nötigen Aktionen im
Leit- und Rechenwerk zur Ausführung des Befehls auszulösen (Signale S):
BR→{S1,S2,S3,•••}
III. Operandenholphase
Operanden eines Befehls werden dem Rechenwerk entweder aus dem Arbeitsspeicher,
den Registern oder als konstante Werte zugeführt.
IV. Ausführungsphase
Der Maschinenbefehl wird ausgeführt.
V. Rückschreibephase
Ergebnisse der Befehlsausführung (z.B. einer Addition) werden in Speicher oder Register übertragen.
<→{R|℘}
VI. Adressierungsphase
Der Befehlszähler wird mit einem neuen Wert geladen: BZ←{BZ+1|F(OP|SR)}
Dr. Stefan Bosse •
Seite 93
Grundlagen der Informatik
Bussysteme (I)
➤ Der Prozessor als zentrale Komponente interagiert und kommuniziert mit den restlichen Teilwerken/einheiten und dem Hauptspeicher über
Adreßbus
Speicher
CPU
Datenbus
[043]
1. spezialisierte oder
2. universelle
Adresse
0
1
2
3
4
5
6
7
8
Datenpfade, die sog. Busse.
➤ Ein Bus ist ein gemeinsamer elektrischer Weg
zwischen mehreren Geräten.
➤ Der Prozessor ist über
◆ einen Datenbus und
◆ einen Adreßbus
mit dem Hauptspeicher verbunden.
Über den Datenbus werden bidirektional
Daten
Speicher
◆ Daten in Speicherzellen geschrieben,
◆ und Daten aus Speicherzellen gelesen.
➤ Über den unidirektionalen Adreßbus wird die aktuell zu bearbeitende Speicherzelle selektiert.
Seite 94
Dr. Stefan Bosse •
Grundlagen der Informatik
Bussysteme (II)
➤ Ein Bus besteht bei paralleler Datenübertragung
aus einer Vielzahl von einzelnen Datenleitungen,
die jeweils ein Bit übertragen können.
➤ Eine zentrale Eigenschaft, die Datenbusse von
normalen Signalleitungen unterscheidet, ist die
Fähigkeit mehrere Kommunikationsteilnehmer
über die gleichen Busleitungen anzukoppeln.
➤ Die einzelnen Kommunikationsgeräte müssen
sich synchronisieren:
D0 D1 D2 D3
[044]
Lesen
Alle Geräte dürfen gleichzeitig lesen. Das
gültige Anliegen von Daten muß aber über
gesondere Signalleitungen angezeigt werden.
Schreiben
Immer nur ein Teilnehmer kann zur gleichen
Zeit auf den Bus schreiben ➽ Schiedsrichterverfahren erforderlich!
Datenbus
DEV 1
DEV 2
Dr. Stefan Bosse •
Seite 95
DEV 3
DEV N
Grundlagen der Informatik
Bussysteme (III)
➤ Daten- und Adreßleitungen können auch über
den gleichen Bus im Zeitmultiplexverfahren übertragen werden.
➤ Zu einem Zeitpunkt t1 liegen die Adreßinformationen für einen Speicherzugriff auf dem Datenbus.
➤ Die Adreßdaten müssen in einem Register
beim Empfänger (=Speicher) zwischengespeichert werden.
DEV 1
Adresse
Daten
➤ Zu einem Zeitpunkt t2 >t1 liegen die Dateninformationen für einen Speicherzugriff auf dem Datenbus.
➤ Schreib- und Lesezugriffe über einen Bus können
0
5
10
15
[044]
REG
DEV 2
synchron
d.h. taktgesteuert oder
asynchron
ohne direkte Taktsteuerung stattfinden.
Seite 96
Dr. Stefan Bosse •
Grundlagen der Informatik
Zeit t
Kommunikationsschnittstellen (I)
➤ Bussysteme werden i.A. für Kommunikation einzelner Komponenten innerhalb eines Rechners
verwendet.
➤ Für Datenaustausch mit externen Geräten wie Sekundärspeicher (Festplatten) oder Ein- und Ausgabegeräte werden spezielle Kommunikationsschnittstellen verwendet.
➤ Wie bei Bussystemen werden Daten mit einer vorgegebenen Anzahl von N Bits (Bitgruppen) übertragen:
1.
parallel
➥ Übertragung aller Bits einer Gruppe zum
gleichen Zeitpunkt auf N Signalleitungen.
2.
seriell
➥ Nur ein Bit auf einer Signalleitung zu einem Zeitpunkt, alle Bits zeitlich sequenziell.
Dr. Stefan Bosse •
Seite 97
Grundlagen der Informatik
Kommunikationsschnittstellen :: Synchrone Datenübertragung
➤ Übertragung wird taktsynchron gesteuert und benötigt auf Empfangs- und Sendeseite phasen- und
frequenzgleiches Taktsignal.
➤ Daten werden i.A. in äquidistanten Zeitabständen
übertragen.
➤ Empfänger und Sender müssen daher mit der gleicher Geschwindigkeit die Daten verarbeiten.
➤ Daten werden vom Empfänger nur bei einem Taktwechselereignis gespeichert:
Steigende Flanke
Bei steigender Flanke 0→1 des Taktsignals
erfolgt Datenspeicherung.
Fallende Flanke
Bei fallender Flanke 1→0 des Taktsignals erfolgt Datenspeicherung.
Seite 98
Dr. Stefan Bosse •
Grundlagen der Informatik
Kommunikationsschnittstellen :: Asynchrone Datenübertragung
➤ Datenübertragung ist nicht taktgesteuert.
➤ Spezielle Signalleitungen werden für Sendebereitschaft auf der Senderseite und Empfangsbestätigung auf der Empfängerseite benötigt.
➥ sog. Handshake-Verfahren
Request
Sender zeigt Anliegen neuer Daten an.
Acknowledge
Empfänger zeigt Empfang und Verarbeitung
der gesendeten Daten an.
➤ Daten müssen daher nicht zeitlich äquidistant
übertragen werden.
➤ Empfänger und Sender müssen nicht mit der gleichen Geschwindigkeit arbeiten!
Dr. Stefan Bosse •
Seite 99
Grundlagen der Informatik
Asynchrone Datenübertragung::Beispiel Druckerschnittstelle LPT
Datenübertragung ist unidirektional von Sender (Rechner) nach Empfänger (Drucker).
Sender
Signale:
Data
Parallele Datenübertragung mit 8 Bit Datenwortbreite.
STROBE
Signal zeigt Datenverfügbarkeit auf den Datensignalleitungen an.
Empfänger
Signale:
BUSY
Signal zeigt Bereitschaft für den Empfang eines Datenwortes an.
ACK
Signal ist Bestätigung für das Ende des Datenempfangs und Verarbeitung der Daten.
Seite 100
Dr. Stefan Bosse •
Grundlagen der Informatik
Synchrone Datenübertragung::Beispiel Serielle Schnittstelle RS232
Datenübertragung ist bidirektional von Sender (Rechner) nach Empfänger (Modem) und umgekehrt über getrennte Sende- und Empfangsleitungen.
➤ Ein Datenwort wird seriell über eine Datenleitung
➤
➤
➤
➤
übertragen. Die Datenwortbreite beträgt i.A. 8 (7)
Bit.
Aber: Taktsignal mit Frequenz fSender vom Sender
wird nicht übertragen, sondern muß im Empfänger
regeneriert werden.
Der Empfänger besitzt einen internen Taktgeber
mit gleicher Frequenz wie beim Sender, der bei
dem ertsen übertragenen Bit (Startbit, keine Daten) phasensynchronisiert wird.
Alternativ Methode mit Oversampling: der Empfänger tastet das Eingangssignal mit einer Frequenz fOversample ii fSender ab. Das Startbit gibt dann
ein Synchronsignal für den zeitlich synchronen
Empfang der nachfolgenden Datenbits.
Es gibt übergeordnete Handskake-Signale für
Empfangs- und Sendebereitschaft.
Dr. Stefan Bosse •
Seite 101
Grundlagen der Informatik
Datenspeicher :: Primärspeicher (I)
➤ Datenspeicher ist in Zellen gliecher Größe unterteilt. Eine Speicherzelle besteht aus einer festgelegten Anzahl von N Bits, i.A. 1 Byte.
➤ Die Gesamtgröße eines Datenspeichers wird in
Vielfachen von 1024 Bytes angegeben:
1024 Byte ⇒ 1 k Byte
1024x1024 Byte ⇒ 1 M Byte
1024x1024x1024 Byte ⇒
1 G Byte
1024x1024x1024x1024 Byte ⇒
1 T Byte
Bitvektor (8)
Adresse
0
7
6
5
4
3
2
1
0
1
2
3
➤ Eine Speicherzelle muß mittels einer Adresse selektiert werden (binärkodierte Signale). Ein Speicher hat einen Lese- und Schreibport.
➤ Operationen auf Datenspeichern:
Lesen
Daten aus einer Speicherzelle lesen.
Schreiben
Daten in eine Speicherzelle schreiben.
Seite 102
4
5
[051]
Schreibport (8)
Dr. Stefan Bosse •
Leseport (8)
Grundlagen der Informatik
Datenspeicher :: Primärspeicher (II)
➤ Eigenschaft des Primär- bzw. Hauptspeichers eines Rechners:
➽ Die einzelnen Speicherzellen können in beliebiger Reihenfolge angesprochen werden!
➤ Man unterscheidet zwei verschiedene Arten von Hauptspeichertypen:
RAM :: Random Access Memory
◆
◆
◆
◆
◆
Kurzzeitspeicher, Datenverlust bei Abschaltung der Energieversorgung.
Dateninhalte der Speicherzellen können beliebig häufig verändert werden.
Programmbefehle können direkt vom Prozessor ausgeführt werden.
Speicherzugriff kann sehr schnell erfolgen (1 µs - 10 ns)
Statische RAMs
Speicherzellen sind mit FLIP-FLOPs aufgebaut, die die logischen Zustände 1
und 0 besitzen. Der Zustand eines FLIP-FLOPs bleibt bis zum nächsten Zustandswechsel erhalten.
Dynamische RAMs
Hier werden die Bitdaten mittels einer elektrischen Ladung eines Kondensators gespeichert. Aufgrund von elektrischen Diffusionsprozessen erfolgt in der
Umgebung der Speicherzelle ein Ladungsfluß, der zur Änderung des Datenzustandes führt.
➥ Daher muß Ladung periodisch durch geeignete Elektronik erneuert werden
(Refresh).
Dr. Stefan Bosse •
Seite 103
Grundlagen der Informatik
Datenspeicher :: Primärspeicher (III)
➤ Man unterscheidet zwei verschiedene Arten von Hauptspeichertypen:
ROM :: Read Only Memory
◆ Langzeitspeicher, kein Datenverlust bei Abschaltung der Energieversorgung.
◆ Dateninhalte der Speicherzellen können nur einmalig oder mit zeitlich großen Aufwand mehrmalig verändert werden.
◆ Programmbefehle können direkt vom Prozessor ausgeführt werden.
◆ Speicherzugriff kann langsam bis schnell erfolgen (1 µs - 100 ns)
◆ ROM
Dateninhalt wird vor der Herstellung durch Maskendefinition bestimmt. Der Dateninhalt einer Speicherzelle ist nicht veränderlich.
PROM :: Programmable ROM
Der Dateninhalt wird nach der Herstellung i.A. einmalig durch Fuse-/AntifuseTechnologien programmiert. Der Vorgang ist nicht reversibel.
EPROM :: Erasable PROM
Der Dateninhalt wird durch eine elektrische dauerhaft gespeichert (≥ 10 Jahre). Die Löschung der Dateninformation geschieht (gesamter Speicher!) durch
hochenergetische Strahlung wie UV-Licht.
EEPROM :: Electrical EPROM
Löschung der Dateninhalte erfolgt über elektrische Spannung.
Seite 104
Dr. Stefan Bosse •
Grundlagen der Informatik
Datenspeicher :: Sekundärspeicher (I)
➤ Man unterscheidet verschiedene Arten von Langzeitspeichertypen:
Magnetische Speicher
◆ Bitinformationen werden mittels eines magnetsichen Zustandes gespeichert.
◆ Dateninformationen können auf Scheiben oder Bändern strukturiert oder als lineare Sequenz gespeichert werden.
◆ Dateninhalte sind veränderlich.
◆ Programme können nicht direkt von einem Prozesor aus einem Sekundärspeicher
ausgeführt werden, sondern müßen zuerst in den Hauptspeicher übertragen werden.
1 Byte = Bitvektor (8)
◆ Speichergeometrie:
4 5 6
7
2 3
Bandstruktur
1
[053]
0
Scheibenstruktur
Sektor 1
1 Byte = Bitvektor (8)
0
1
2
3
4
5
6
7
[052]
Spur 0,1,2
besteht aus N
Sektoren
Schreib-Lesekopf
Schreib-Lesekopf
Dr. Stefan Bosse •
Seite 105
Grundlagen der Informatik
Datenspeicher :: Sekundärspeicher (II)
➤ Optische Speicher
◆ Bitinformationen werden mittels eines optischen Zustandes
gespeichert.
◆ Dateninformationen können nur auf Scheiben strukturiert
oder als lineare Sequenz gespeichert werden.
◆ Dateninhalte sind je nach Technologie veränderlich oder
nicht:
CD
Compact Disc ➽ Bei Herstellungsprozeß Datenspeicherung durch Maske.
CD-R
Einmalig durch Laserbestrahlung einer Fotoschicht (organische Farbstoffe) beschreibbar. Laserlicht erhitzt
Farbstoff lokal und verändert optische Eigenschaften.
CD-RW
Mehrmalig beschreibbar. Durch kurzzeitige Laserstrahlung Änderung der kristallinen Struktur einer Metallschicht (Erhitzung über Schmelzpunkt); dadurch Änderung der optischen Eigenschaften. Löschung durch langzeitige Bestrahlung.
Seite 106
Dr. Stefan Bosse •
1 Byte = Bitvektor (8)
1
2 3
4 5 6
7
[053]
0
Sektor 1
Spur 0,1,2
besteht aus N
Sektoren
Schreib-Lesekopf
Grundlagen der Informatik
Microcontroller :: ATMEGA8 :: Übersicht
Aufbau ➽
RISC CPU-Kern
RAM & ROM-Speicher
System-On-Chip-Design:
Vereinigung verschiedenster Komponenten wie CPU, RAM, ROM und
Peripherie auf einem einzigen Chip.
Peripherie:
1.
2.
3.
4.
5.
6.
IO-Port-Schnittstellen
Timer
Analog-Digital-Wandler (ADC)
Interrupt-Controller
In-System-Programmierung
Taktgenerierung und Taktverteilung auf dem Chip.
Harvard-Architektur mit einem zentralen Daten- und Adreß-Bus, aber
getrennten ROM-Speicher!
Seite 107
Dr. Stefan Bosse •
Grundlagen der Informatik
Dr. Stefan Bosse •
Grundlagen der Informatik
Microcontroller :: ATMEGA8 :: RISC
CPU ➽
Harvard-Architektur ➽ getrennte
Speicher für Programm und Daten
(8 Bit Wortbreite):
ROM
Der Programmspeicher ist direkt (ohne Bus) an das IR und
den I-Dekoder angeschlossen.
RAM
Datenspeicher ist wie die anderen Peripheriekomponenten
an einen gemeinsamen Datenbus angeschlossen.
Vorteil:
höhere Ausführungsgeschwindigkeit eines Maschinenbefehls (Zusammenlegung einzelner
Ausführungsphasen)
Operandenhol- und Rückschreibephase unabhängig von Befehlsholund Dek.phase!
Seite 108
Microcontroller :: ATMEGA8 :: Register
Register ➽
Da RISC-Architektur sind Operationen registerbasiert.
Große Anzahl von universell verwendbaren
Registern, 8 Bit Wortbreite.
Aber: Register und IO-Ports sind im Adreßraum des RAM-Speichers eingeblendet ➽
Vereinfachung !
Seite 109
Dr. Stefan Bosse •
Grundlagen der Informatik
Microcontroller :: ATMEGA8 :: Taktsteuerung
Clock-Distribution-Network ➽
Eine Vielzahl von On-Chip-Komponenten benötigen ein zentrales Taktsignal oder ein aus
dem zentralen Takt abgeleitetes geteiltes Taktsignal.
Bei hohen Taktfrequenzen sind Laufzeitunterschiede aufgrund ungleicher Signalwege
durch geeignete Schaltungen auszugleichen
(Clock-Skew) ➽ Nachteil von synchronen Datenverabeitungssystemen!
Einige Peripherie-Komponenten wie Timer
werden erst zur Programmlaufzeit mit einer
bestimmten Taktfrequenz konfiguriert, daher
sind konfigurierbare Taktteiler erforderlich.
Kerntaktfrequenz für CPU: 10-20 MHz
Seite 110
Dr. Stefan Bosse •
Grundlagen der Informatik
Highend-EDV :: SUN UltraSPARC III :: Architektur
CPU ➽ Von-Neuman-Architektur
Instruction Unit
Steuerwerk mit aufwendiger
Instruction-Pipeline,
64
Bit,
900-1200 MHz Clock
Integer Unit
Rechenwerk für Ganzzahloperationen (ALU), 64 Bit
Floating Point Unit
Rechenwerk für reelle Zahlen
(FPU)
Data Cache
Schneller Zwischenspeicher mit
Zugriffszeiten ≈ 5-10 ns, als kleiner Zwischenpuffer für Hauptspeicherzugriffe von häufig benötigten Daten und Programmbefehlen.
JBUS Controller
Externer Datenbus für die Anbindung von Peripheriekomponenten (Grafik)
Seite 111
Dr. Stefan Bosse •
Grundlagen der Informatik
Highend-EDV :: SUN UltraSPARC III :: Register
Register-Sätze ➽
Ein Registersatz besteht aus 8
festen Hauptregistern mit 64 Bit
Datenbreite und 24 dynamsichen Universalregistern.
Dynamische 24 Register sind
in einem Fenster zusammengefasst, welches bei Bedarf von der
CPU gewechselt werden kann.
Seite 112
Dr. Stefan Bosse •
Grundlagen der Informatik
Highend-EDV :: SUN UltraSPARC III :: 1 CPU-Rechner
Klassisches 1- CPU-System ➽ VonNeuman-Architektur
Weitere Peripherie-Komponenten:
Parallel Schnittstellen SCSI und
IDE für Sekundärspeicher (Festplatten, CDROM, Bandlaufwerke)
Grafik-Controller als zusätzliches Prozessorsystem mit
ähnlicher Rechenleistung wie
zentrale CPU!
Seite 113
Dr. Stefan Bosse •
Grundlagen der Informatik
Highend-EDV :: SUN UltraSPARC III :: 2 CPU-Rechner
Mehrprozessor-System ➽ Parallele Von-Neuman-Architektur
Seite 114
Dr. Stefan Bosse •
Grundlagen der Informatik
Highend-EDV :: SUN UltraSPARC III :: 4 CPU-Rechner
Mehrprozessor-System ➽ Parallele Von-Neuman-Architektur
Dr. Stefan Bosse •
Seite 115
Grundlagen der Informatik
Betriebssysteme
➤ Ein Betriebssystem ist ein Programm, welches von einem Rechner ausgeführt wird.
➤ Dieses Programm wird beim Einschalten eines Rechners (automatisch) gestartet.
➤ Ein Betriebssystem ist sinnvoll, aber nicht notwendig (Microcontroller und eingebettete Systeme können hier Ausnahmen bilden).
➤ Ein Betriebssystem ist eine Organisations- und Verwaltungsstruktur.
➤ Es erfüllt folgende Aufgaben:
Abstraktion
Technische Einzelheiten des Rechners werden vom Betriebssystem gekapselt, so daß
sie
1. weder vom Bediener, noch
2. vom Anwendungsprogrammierer sichtbar sind.
Beispiel für technische Einzelheiten:
1. Ansteuerung von Ein-/Ausgabe-Schnittstellen
2. Grafik-Bildschirm-Steuerung
3. Zugriff auf Speichermedien
Seite 116
Dr. Stefan Bosse •
Grundlagen der Informatik
Betriebssysteme (II)
Plattform für Anwendungsprogramme
Das Betriebssystem definiert eine Menge von Operationen und Funtionen, auf die Anwendungsprogramme zugreifen können.
➥ Sog. Programmierschnittstelle oder API (Application Programming Interface)
➥ Z.B. Lesen und Schreiben von Daten auf Festplattenspeichern.
Typische Abstraktionen sind
1. die Datei als Speicherobjekt, und
2. der Prozeß als Ausführungsobjekt.
Durch Abstraktion werden Anwendungsprogramme unabhängig vond er verwendeten
Rechner-Architektur.
Koordination und Zuteilung von Betriebsmitteln
Prozessorkapazität bei nebenläufigen (parallelen) Mehrprozeß-Betrieb; Ablaufplanung
(Scheduler)
Hauptspeicher ➽ Speichersegementierung
Sekundärspeicher ➽ Dateisystem
Zugriffsrechte aus Ein-/Ausgabe-Einheiten ➽ Mehrbenutzer-Betrieb
Schutz mehrere gliechzeitig oder nacheinander aktiver Benutzer ➽ MehrbenutzerBetrieb
Seite 117
Dr. Stefan Bosse •
Grundlagen der Informatik
Dr. Stefan Bosse •
Grundlagen der Informatik
Betriebssysteme (III)
Seite 118
Betriebssysteme (IV)
Bedienschnittstellen
KommandoInterpreter
Grafische
Bedienschnittstelle (Oberfläche)
Dr. Stefan Bosse •
Seite 119
Grundlagen der Informatik
Prozesse
➤ Ein Prozeß ist der Ablauf eines sequenziellen Programms in einer Rechneranlage. Das Programm besteht aus Maschinenbefehlen, die als lineare Liste sequenziell abgearbeitet werden.
➤ Ein Programm stellt eine [statische] Handlungsvorschrift dar.
Diese gibt an, wie Daten verarbeitet oder Berechnungen durchgeführt werden sollen.
➤ Ein Prozeß ist hingegen durch seinen zeitlich veränderlichen Zustand [dynamisch] gekennzeichnet.
➥ Der aktuelle Ausführungszustand eines Programms wird durch den Prozeß beschrieben!
➥ Der Zustand eines Prozesses kann abhängen von
1. Ein- und Ausgabe von Daten,
2. dem Voranschreiten der Berechnung, d.h. dem aktuell ausgeführten Befehl,
3. dem Inhalt von Speicher- und Registerzellen.
Seite 120
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßzustände (I)
➤ Ein einziger Mikroprozessor kann zu einem gegebenen Zeitpunkt immer nur einen Maschinenbefehl eines aktuell laufenden Prozesses ausführen.
➤ Sollen mehrere Prozesse auf einem einzelnen Prozessor ausgeführt werden, bedarf es einer
Prozeßverwaltung, die die Ressource Prozessor abwechselnd den Prozessen zur Verfügung
stellt.
➤ Man unterscheidet dann verschiedene Prozeßzustände:
Zustand RECHNEND
Es kann sich nur ein einziger Prozeß im Zustand RECHNEND befinden, d.h. ausgeführt
werden.
Zustand BLOCKIERT
Alle anderen Prozesse befinden sich im blockierten Zustand, d.,h. sind nicht aktiv, und
oder sind zusätzlich im
Zustand RECHENBEREIT
Dieser Zustand signalisiert, daß ein Prozeß die weitere Ausführung benötigt, ist aber
weiterhin nicht aktiv.
➤ Ein nicht rechenbereiter Prozeß benötigt für seine Ausführung das Auftreten eines Ereignisses (blockiert ➽ wartend), z.B. die Eingabe von Daten.
Seite 121
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßzustände (II)
(1)
Prozeßstart
➽ Programm wird in den Hauptspeicher von einem Sekundärspeicher geladen.
➽ Prozeß ist initial bereit
(2) Übergang BEREIT ➽ RECHNEND
Ausführung ➽ Erster (oder nächster) Maschinenbefehl des Programms wird vom Prozessor
ausgeführt. Jeder Prozeß P hat seinen eigenen Befehlszähler BZ(P).
Seite 122
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßzustände (III)
(3) Übergang RECHNEND ➽ BEREIT
Damit andere Prozesse (Zustand BEREIT) ausgeführt werden können, müssen zwei Randbedingungen im Prozeßsystem erfüllt sein:
1. Aktueller Prozeß geht explizit in den Zustand WARTEND über (auf Ereignis warten), oder
2. der aktuelle Prozeß wird nach einer Zeitspanne τ (z.B. 20 ms) implizit in den Zustand
BEREIT versetzt ➽ ein anderer Prozeß wird ausgeführt!
Dr. Stefan Bosse •
Seite 123
Grundlagen der Informatik
Prozeßzustände (IV)
(4) Übergang RECHNEND ➽ WARTEND
Der Prozeß muß auf ein Ereignis warten:
Seite 124
Eingabe von der Tastatur
Lesen von Daten eines langsamen Speichermediums (CDROM)
Ausgabe von Daten auf Peripheriegeräte (Drucker, z.B. nich empfangsbereit)
Vom Programm explizit veranlasste Verzögerung des Programmablaufs (Verzögerung
um feste Zeitspanne)
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßzustände (V)
(5) Übergang WARTEND ➽ BEREIT
Das Ereignis auf das das Programm gewartet hat ist eingetreten. Der Prozeß geht in den
Zustand BEREIT über, und wird baldmöglichst wieder ausgeführt..
(6)
Der Prozeß wird beendet:
1. Das reguläre Programmende wurde erreicht (Terminierungskriterium)
2. Es ist ein Fehler aufgetreten, der nicht abgefangen wurde (DIV 0!)
Seite 125
Dr. Stefan Bosse •
Grundlagen der Informatik
Speichermodell eines Prozesses (I)
➤ Ein Programm wird in den Hauptspeicher geladen, bevor es als Prozeß ausgeführt wird.
Das Programm liegt auf einem Sekundärspeicher binärkodiert (≡ anonyme Folge von Da-
tenwörtern) vor.
➤ Bei Mikro-Controllern wird das Programm i.A. direkt aus dem Langzeitspeicher (ROM) ausgeführt.
➤ Ein Prozeß belegt i.A. nur einen Teil des Hauptspeichers.
➤ Der Speicherbereich eines Prozesses ist in einzelne Teilsegmente unterteilt, die verschiedene Arten von Daten beinhalten.
Seite 126
Dr. Stefan Bosse •
Grundlagen der Informatik
Speichermodell eines Prozesses :: Speichersegmente
➤ Man unterscheidet folgende Speichersegmente eines Prozesses:
Textsegment
Der eigentliche Programmkode, d.h. die Maschinenbefehle des Programms, befinden sich im sog. Textsegment.
Dieses Datensegment wird während der Programmausführung [Größe, Dateninhalt] nicht verändert!
Datensegment
Im Datensegment befinden sich Programmdaten, wie z.B.
Textzeichenketten, Variablen usw.
Man unterscheidet:
A) nicht initialisierte Daten ➽ der Inhalt der Speicherzellen wird erstmalig zur Laufzeit des Programms verändert.
B) initialisierte Daten ➽ der Inhalt der Speicherzellen enthält zum Programmstart vom Programm vorgegebene Werte (z.B. Textzeichenkette
line=”HARWDARE”).
Das Datensegment ist in Größe und Inhalt während der
Prozeßausführung veränderlich!
Seite 127
Dr. Stefan Bosse •
Grundlagen der Informatik
Speichermodell eines Prozesses :: Speichersegmente
Stacksegment
Der Stackspeicher wird von einem Prozeß als temporärer
Datenspeicher (kurzfristig) benötigt.
Bei einem Stackspeicher-Modell ≡ Stapelspeicher
kann immer nur die aktuellste (≡ oberste) Speicherzelle (des Stacks) gelesen und beschrieben werden.
Es wird ein Speicherzeiger P auf eine Speicherzelle
vom Speicher S benötigt.
Modell: LastIn - FirstOut (LIFO)
Operationen:
PUSH(x)
S(P)←x; P←P+1;
Wert x im Stack speichern.
POP(X)
P←P-1; x←S(P);
Wert aus Stack lesen und in x übertragen.
Der Stack-Speicher muß durch Soft- oder Hardware
implementiert werden, da der lineare Hauptspeicher
dieses Zugriffsmodell nicht unterstützt!
Seite 128
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Foreground-Background-System
➤ Minimale Anforderungen an ein Datenverarbeitungssystem:
1. Die Datenverarbeitung findet programmgesteuert statt, d.h. es gibt ein Programm.
2. Bei rein funktionalen Systemen, wo eine eindeutige Abbildung der Eingangsdaten auf
Ausgangsdaten möglich ist (theoretisch in einem einzigen Zeitschritt), reicht die alleinige
Ausführung des funktionalen Programms aus.
3. Bei einem reaktiven System, wo die Eingangsdaten ereignisbasiert verarbeitet
werden, z.B. Texteditor, Getränkeautomat usw., wird neben der eigentlichen Programmausführung die Bearbeitung der Ereignisse und Aufnahme der Eingabedaten benötigt.
➽ Verarbeitung der Ereignisse und Datenverarbeitungsprogramm müssen i.A. unterschiedl
che Prioritäten besitzen. Ereignisse (≡ Ein-und Ausgabedaten) müssen daher mit höherer Prioritä
abgearbeitet werden!
➤ Einfachstes Prozeß-Systemmodell
Hauptprozeß
➽ Es gibt nur einen einzigen primären Prozeß.
➽ Dieser Prozeß wird als Hintergrundprozeß mit niedrigster Priorität ausgeführt.
➽ Eine Prozeßverwaltung ist nicht notwendig!
Nebenprozeß
➽ ”Prozeß” mit höchster Priorität, der die Bearbeitung des Hauptprozesses beim Eintreten von Ereignissen unterbricht.
➽ Interrupt-Handler
Seite 129
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Foreground-Background-System (II)
Seite 130
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Der Scheduler (I)
➤ Der Scheduler (≡ Ablaufplaner) ist für die Prozeßverwaltung im Betriebssystem mit Multitasking (≡ Mehrprozeßbetrieb) zuständig.
➤ Der Scheduler teilt Prozessen die Prozessorlaufzeit zu und führt die Prozeßumschaltung
durch.
➤ Bei der Prozeßumschaltung wird der aktuell laufende Prozeß P i angehalten, und ein neuer
bereiter Prozeß Pj zur Ausführun vorbereitet (task switch).
➤ Alle Prozesse eines Rechners werden in der Prozeßtabelle verwaltet:
Prozeßverwaltung
Speicherverwaltung
Nutzerverwaltung
Prozessorregister
Speicheradressen
Nutzer ID #
Programmzähler BZ
➽ Segmente
Gruppen ID #
Prozeßstatus
Stackzeiger SZ
Prozeß ID #
• Textsegment
• Datensegment(e)
• Stacksegment(e)
Arbeitsverzeichnis
Zugriffs-Rechte
Ausführungs-Rechte
Statistiken
Priorität
Seite 131
Dr. Stefan Bosse •
Grundlagen der Informatik
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Der Scheduler (II)
Seite 132
Prozeßverwaltung :: Der Scheduler (III)
➤ Die Reihenfolge, in der einzelne Prozesse ausgeführt werden, kann durch verschiedene Zuteilungsstrategien erfolgen:
1. nach Eingangsreihenfolge (FirstCome - FirstServed FCFS)
2. nach Zeitscheibenverfahren (Round-Robin)
3. nach Prioritäten
➤ Weiterhin unterscheidet man das Verhalten beim Eintreten von Ereignissen (nicht InterruptHandler!):
Preemptives Schalten
Beim Eintritt eines Ereignisses können sich die Zustände von Prozessen ändern. Ein
Prozeß kann vom Zustand WARTEND in den Zustand BEREIT übergehen. Bei dieser
Scheduling-Methode wird der aktuell laufende Prozeß unter bestimmten Randbedingungen angehalten, und die Ausführung an den gerade bereit gewordenen Prozeß übergeben.
Nicht-Preemptives Schalten
Auch hier können Ereignisse die Zustände von wartenden Prozessen verändern. Aber
der aktuell laufende Prozeß wird unter keinen Umständen angehalten, sofern dieser
Prozeß nicht explizit die Ausführung unterbricht (auf Ereignis warten, z.B. bei VTURI
der READ Befehl!).
Seite 133
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Der Scheduler (IV)
Scheduling Methode Eingangsreihenfolge (FCFS)
➤ Prozesse werden der CPU in der Reihenfolge zugewiesen wie sie Rechenbedarf anmelden.
➤ Ein laufender Prozeß wird nicht zwangsläufig unterbochen.
➤ Rechenbedarf wird durch den Zustandsübergang
WARTEND ➽ BEREIT
signalisiert.
➤ Nachteil: Kurz laufende Prozesse, die EA-Ereignisse verarbeiten, werden von lange laufenden Prozessen stark verzögert.
➽ Antwortzeit des Systems ist subjektiv unbefriedigend!
Seite 134
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Der Scheduler (V)
Scheduling Methode Zeitscheibenverfahren (Round-Robin)
➤ Alle Prozesse werden reihum bearbeitet.
➤ Ein aktuell laufender Prozeß wird eine Zeitspanne τ zugewiesen, die er nicht überschreiten
darf. Eine vorzeitige Abgabe der Ausfüjhrung vom Programm aus ist möglich.
➤ Erreicht ein Prozeß das Zeitpensum τ, wird er angehalten, und der nächste Prozeß im Zustand BEREIT wird ausgeführt, bis auch diese seine Zeitspanne ausgeschöpft hat.
➤ Nachteil: häufige Prozeßwechsel (Scheduler ≡ Maschinenbefehle ≡ Programmcode!) bedeuten Overhead.
Seite 135
Dr. Stefan Bosse •
Grundlagen der Informatik
Prozeßverwaltung :: Der Scheduler (VI)
Prioritätenbasierte Scheduling Methode
➤ Prozesse besitzen eine Priorität, so daß sich der Zustand eines Prozesses aus dem eigentlichen Aktivitätszustand {RECHNEND,BEREIT,WARTEND} und der Priorität, i.A. eine
Integerzahl, zusammensetzt.
➤ Prioritäten können statisch (zeitlich unveränderlich) oder dynamisch (zeitlich veränderlich)
sein.
➤ Ein aktuell laufernder Prozeß kann unterbrochen werden, wenn ein anderer Prozeß mit höherer Priorität rechenbereit wird (aufgrund eines Ereignisses).
➤ Die Priorität eines Prozesses kann mit fortlaufender Rechenzeit verringert werden, und
durch Eintreten eines Ereignisses wieder erhöht werden.
Seite 136
Dr. Stefan Bosse •
Grundlagen der Informatik
Dateien und Dateisysteme (I)
➤ Eine Datei ist eine Sammlung von Daten, die auf einem Langzeitspeicher gehalten wird.
➤ Datenmodell: Die einzelnen Daten werden sequenziell angeordnet ➽ lineare Folge von
Daten.
➤ Das Lesen und Schreiben einer Datei erfolgt daher ebenfalls sequenziell mit einem Dateizeiger.
➤ Nach jeder Lese- oder Schreiboperation wir der Dateizeiger entsprechend der gelesenenoder geschriebenen Datenmenge weitergesetzt,
Dateianfang
T
Dateizeiger
E
X
T
[064]
Logische
Position
in
der Datei
Dateiende
Dateizelle mit fester Bitbreite
Dr. Stefan Bosse •
Seite 137
Grundlagen der Informatik
Dateien und Dateisysteme (II)
➤ In einer Datei können beliebig kodierte Daten gespeichert werden, z.B. Zeichenketten, Fließkommazahlen, oder eine Aggregation (Datenstruktur) aus verschiedenen Datentypen und
Datenobjekten.
➤ Ein Dateisystem, welches Bestandteil des Betriebssystems ist, stellt einen Abstraktionsmechanismus dar, um Daten bzw. Dateien auf dem Speichermedium zugänglich zu machen,
ohne daß der Benutzer sich mit Einzelheiten der Datenspeicherung befassen muß.
➤ Ein Dateisystem bietet zusätzlich:
Zugriffsrechte
Verwaltung und Überwachung von Zugriffsrechten auf Dateien in einem Dateisystem
➽
{Schreiboperation, Leseoperation,
Löschoperation, Ausführung von Programmen}
Dateinformationen
{Dateigröße, Dateiart, Zugriffsrechte, Eigentümer}
Dateistrukturierung
Hierarchische Anordnung von Dateien in Suchbäumen mit Suchpfaden.
Seite 138
Dr. Stefan Bosse •
Grundlagen der Informatik
Logische Struktur von Dateisystemen (I)
➤ Um eine Zugrifssmöglichkeit auf Dateien zu haben, werden verschiedene Dateien mittels
eines Inhaltsverzeichnisses strukturiert ➽ Verzeichnisse (Directories) ➽ Dateien werden
einem Verzeichnis zugeordnet.
➤ Ein Verzeichnis wird ebenfalls mit einem Namen bezeichnet.
➤ Eine Vielzahl von Verzeichnissen werden hierrachisch mit einer Baumstruktur verknüpft ➽
Verzeichnisbaum.
V1
V2
V5
V3
Verzeichnis
V4
V6
[065]
Datei
➤ In einem Verzeichnisbaum wird eine Datei nicht mehr allein durch ihren Namen bezeichnet,
sondern zusätzlich durch ihren Pfadnamen.
Dr. Stefan Bosse •
Seite 139
Grundlagen der Informatik
Logische Struktur von Dateisystemen (II)
➤ Beispiel:
top
files
mydat
docs
mydat
[066]
➤ Zwei Dateien mit gleichen Namen werden durch unterschiedliche Pfade unterschieden:
Datei 1 ⇒ top/files/mydat
Datei 2 ⇒ top/docs/mydat
➤ Jede Datei und jedes Verzeichnis besitzen ein Elternverzeichnis. Bei Verzeichnissen ist es
das Vorgängerverzeichnis.
➤ Der Wurzelknoten, das Wurzelverzeichnis, wird i.A. mit dem Namen ’/’ anstelle eines Textnamens bezeichnet. Das Wurzelverzeichnis besitzt keinen Vorgänger!
Seite 140
Dr. Stefan Bosse •
Grundlagen der Informatik
Physische Struktur von Dateisystemen (I)
➤ Die Abbildung der linearen logischen Struktur (abstrahiertes Modell) einer Datei auf die
technischen Einzelheiten eines Spreichermediums bezeichnet man als physische Struktur(ierung).
➤ Die Abbildung auf technische Einzelheiten findet durch das Betriebssystem in mehreren Stufen statt, die schrittweise den Abstraktionsgrad verkleinern:
1. Verzeichnisstruktur als übergeordneter Suchbaum (Orgranisation),
2. Ebene III: Darstellung der Datei als lineare logische Dateistruktur,
3. Blockstrukturierung, Fragmentierung, Abbildung der Datei auf forlaufend numerierte Datenblöcke fester Länge im Kontext des Dateisystems,
4. Ebene II: Dateisystem (1..3)
5. Ebene I: Gerätetreiber, Abbildung der Datenblöcke auf technisches Speichermedium
und Geometrie des Speichermediums.
➤ Ein Festplatten- oder CDROM-Speiher ist in zylindrische Spuren unterteilt. Jede Spur ist in
Sektoren bestimmter Größe weiter unterteilt.
➤ Zur Vereinfachung der Speicherung der Dateidaten besitzt jede Spur die gleiche Anzahl von
Sektoren.
Aber: auf technischer Ebene 0 besitzt jede Spur unterschiedliche Anzahl von Sektoren bzw.
Anzahl von Datenbits!
➤ Abbildung der homogenenen zylindrischen Speichergeometrie auf technisch realisierbare
inhomogene Geometrie ist Aufgabe des Speichergerätes!
Dr. Stefan Bosse •
Seite 141
Grundlagen der Informatik
Physische Struktur von Dateisystemen (II)
Dateisystem => logische
Block-Struktur
Datei => logische Struktur
POS 0
write
Dateioffset
read
BLOCK
100
Speichermedium =>
physische Struktur
Sektor 7
Sektor 0
Spur 0,1,2
Sektor 1
Blockoffset
seek
POS 1792
[067]
BLOCK
103
➤ Die einzelnen Blöcke einer Datei werden einzelnen Sektoren der Festplatte nach zwei verschiedenen Methoden zugeordnet:
1. möglichst geschlossen/zusammenhängend sequenziell auf Spuren,
2. oder verstreut auf verschiedenen Sektoren von verschiedenen Spuren (nicht zusammenhängend).
Block
100
101
102
103
Seite 142
Spur (1)
1
1
1
1
Sektor (1)
3
4
5
6
Spur (2)
2
27
10
2
Sektor (2)
0
3
4
2
Dr. Stefan Bosse •
Grundlagen der Informatik
Minix-Dateisystem :: Allgemeiner Aufbau
➤ Die Strukturierung des Dateisystems ist unterteilt in
folgende Funktionsblöcke:
Super Block
Dieser Block enthält Informationen über das Dateisystem:
1.
2.
3.
4.
Anzahl der Inodes
Anzahl der Datenblöcke
Blockgröße [Bytes]
usw.
Inode Table
Inodes enthalten Informationen über Dateiobjekte:
1.
2.
3.
4.
Dateiart
Größe
Zeitstempel
Zeiger auf Datenblöcke
Data
Datenbereich
Dr. Stefan Bosse •
Seite 143
Grundlagen der Informatik
Minix-Dateisystem :: I-Node
➤ Eine I-Node ist eine interne Verknüpfung. Sie enthält Informationen über eine Datei, aber
nicht den Namen der Datei (oder eines Verzeichnisses). Dieser wird im Datenbereich abgelegt.
➽ Inode-Format (mit Byteoffset)
0
2
MODE UID
P1
P2
4
SIZE
P3
P4
8
TIME
P5
P6
12 13 14
G L P0
P7
P8
Mode
Art des Dateninhaltes/der Inode:
{FREG ➽ Regular File, FDIR: Directory, FLNK: Link, ...}
SIZE
Größe der Datei in Bytes (oder in Blockeinheiten)
UID, GID, TIME
Nutzer-ID & Gruppen-ID & Zeitstempel
P0...P6
Zeiger auf Datenblöcke
P7, P8
Zeiger auf Zeigerblock, der weitere Datenblockzeiger P enthält, und doppelt indirekter Zeiger.
Seite 144
Dr. Stefan Bosse •
Grundlagen der Informatik
Minix-Dateisystem :: Beispiel einer Datei und einer I-Node
Dr. Stefan Bosse •
Seite 145
Grundlagen der Informatik
Minix-Dateisystem :: Verzeichnis
➤ Verzeichnisse werden im Minix-Dateisystem wie normale Dateien behandelt.
➤ Ein Verzeichnis ist ein Datenblock mit einer linearen Liste von Verzeichniseinträgen.
Datenblock
Verzeichniseintrag 1
→
Datei 1
Verzeichniseintrag 2
→
Datei 2
→
Datei N
••••
Verzeichniseintrag N
➤ Ein Verzeichniseintrag enthält den Namen des Eintrages und ein zugehörge I-Node-Nummer,
die entweder zu einer Datei oder einem weiteren Verzeichnis gehört (Verzeichnisbaum).
Verzeichniseintrag
2
Link
Seite 146
Inode
14
Name
Dr. Stefan Bosse •
Grundlagen der Informatik
Minix-Dateisystem :: Beispiel einer Datei und Verzeichnisse (I)
Seite 147
Dr. Stefan Bosse •
Grundlagen der Informatik
Minix-Dateisystem :: Beispiel einer Datei und Verzeichnisse (II)
Seite 148
Dr. Stefan Bosse •
Grundlagen der Informatik
Minix-Dateisystem :: Große Dateien
➤ I.A. ist die Blockgröße BLKSIZE=512 Byte.
➤ Die Blockgröße entscheidet über:
1. die maximal Anzahl von zu speichernden Blöcken,
2. die Verschwendung an Speicherplatz, da Dateien und Verzeichnisse nur in Vielfachen
von Blöcken gespeichert werden können.
➤ Neben den eigentlichen Dateidaten und Inodes müssen in der Inode-Map und Data-Map
➤
➤
➤
➤
Tabelle die bereits verwendeten Blöcke, jeweils für den Inode- und Data-Bereich vermerkt
werden.
Die Anzahl von Inodes ist durch die Größe der Inode-Tabelle und der Inode-Map-Tabelle
beschränkt.
Die Anzahl der Datenblöcke ist durch die Data-Map-Tabelle beschränkt.
Damit auch größere Dateien gespeichert werden können (N Blcke>7=3584 Bytes), kann ein
weiterer Datenblock als Zeigerblock verwendet werden [P7], so daß weitere M=BLKSIZE/2
Datenblockzeiger zur Verfügung stehen ➽ indirekter Blockzeiger.
Weitere Zeigerblöcke sind über einen doppelt indirekten Blockzeiger P8 erreichbar. Dieser
Block enthält Zeiger auf Zeigerblöcke, die wiederum Zeiger auf Datenblöcke enthalten.
Dr. Stefan Bosse •
Seite 149
Grundlagen der Informatik
Programme und Programmiersprachen (I)
➤ Programme beschreiben im einfachsten Fall die Umsetzung von Algorithmen.
➤ Diese Algorithmen beschreiben eine Abbildung f: E →A von Eingabedaten E nach Ausgabedaten A.
➤ Diese Beschreibung soll
1. für den menschlichen Leser und
2. maschinell verständlich sein.
➤ Die Eingaben E und die Ausgaben A sind Daten, die durch Folgen von Bits kodiert werden.
➤ Ein Algorithmus beschreibt ein Verfahren zur Lösung eines Problems:
Seite 150
Dr. Stefan Bosse •
Grundlagen der Informatik
Programme und Programmiersprachen (II)
➤ Programmieren, d.h. die Erstellung eines Programms, unterteilt sich in drei Teilschritte:
Spezifikation
Genaue Beschreibung des zu lösenden Problems und der Ein- und Ausgabedaten (Format, Kodierung, Datenmenge usw.)
Algorithmus
Erarbeitung eines (schrittweisen) Lösungsweges und Verfahrens.
Programm
Umsetzung des Algorithmus mit einer konkreten Programmiersprache mit dem Ziel,
Anweisungen für eine Maschine zu erzeugen (lineare Liste von Maschinenbefehlen).
Die Programmiersprache soll möglichst von technischen Einzelheiten der Maschine
und eines eventuell vorhandenen Betriebssystems abstrahieren.
Beim Abstraktionsgrad wird unterschieden
Low-level
Maschinenahe Sprache, die nur minimal die Maschine abstrahiert ➽ Programme
(Quellkode) nicht portabel zwischen verschiedenen Maschinen ➽ das Programm
ist wenig strukturiert.
High-level
Hochsprache, die maximal die Maschine abstrahiert ➽ Programme sind portabel
zwischen verschiedenen Maschinen ➽ das Programm ist strukturiert.
Dr. Stefan Bosse •
Seite 151
Grundlagen der Informatik
Programme und Programmiersprachen :: Algorithmus
➤ Ein Algorithmus ist definiert durch:
1.
2.
3.
4.
Die Ausführung des Algorithmus erfolgt in einzelnen Schritten.
Jeder Schritt besteht aus einer einfachen Grundaktion.
Zu jedem Zeitpunkt ist eindeutig bestimmt, welcher Schritt als nächster auszuführen ist.
Ein Algoritmus muß nach endlicher Zahl von Schritten terminieren. Nur bei funktionalen
Systemen nachweisbar erfüllbar.
➤ Ein Algorithmus kann von einem Menschen und von einer Maschine ausgeführt werden.
➤ Ein Programm wird hingegen nur von einer Maschine ausgeführt.
➤ Algorithmen lassen sich darstellen durch:
◆ Grafische Darstellung durch Flußdiagramme und Flußgraphen, eventuell in Daten- und
Kontrollpfade zerlegt.
◆ Funktionsdiagramme und Bäume
◆ Abstrakte Programmiersprache mit Pseudo-Notation, die die wesentlichen Ablaufschritte verdeutlicht, aber nicht detaliert ist.
◆ Konkrete Programmiersprachen.
➤ Elementare Aktionen in einem Algorithmus:
1. Datenpfad ➽ Datenabhängigkeiten und Verarbeitung mit Funktionseinheiten
2. Kontrollpfad ➽ Ablaufsteuerung
Seite 152
Dr. Stefan Bosse •
Grundlagen der Informatik
Programme und Programmiersprachen :: Flußdiagramm
➤ Elementare Bestandteile eines Flußdiagramms:
Seite 153
Dr. Stefan Bosse •
Grundlagen der Informatik
Flußdiagramm :: Beispiel (I)
Spezifikation
Es soll der größte gemeinsame Teiler T zweier Zahlen N und M bestimmt werden.
N und M sind ganze Zahlen. Das Ergebnis ist ebenfalls eine ganze Zahl. Es muß der Fall
N=0 oder M=0 ausgschlossen werden.
Algorithmus
Seite 154
Dr. Stefan Bosse •
Grundlagen der Informatik
Flußdiagramm :: Beispiel (II)
Programmierung (Imperative Programmiersprache C)
int ggt(int N, int M) Funktion mit Operanden
{
int x=n; int y=M; Variablen
while (x!=y) Schleife
{
if (x>y) x=x−y; Bedingte Verzweigung
else
y=y−x;
};
return x; Rückgabe Ergebnis T
}
Verwendung von Variablen mit Rückwirkung, d.h. der Wert einer Variablen wird im Kontrollfluß vor der Zuweisung gelesen (Schleife!).
Explizite Spezifikation des Kontrollflusses erforderlich.
Beweis der Terminierung aufwendig und kompliziert.
Dr. Stefan Bosse •
Seite 155
Grundlagen der Informatik
Flußdiagramm :: Beispiel (III)
Programmierung (Funktionale Programmiersprache ML)
let rec ggt = fun x y →
Funktion
if x<y then ggt (x−y) y
Bedingte Verzweigung
else if x>y then ggt x (y−x)
else x Rückgabe Ergebnis T
Keine Variablen mir Seiteneffekten, d.h. Lesen eines Datenkontainers im Kontrollfluß
Seite 156
bevor die Wertzuweisung erfolgt (keine Schleifen!).
Ausnutzung von Rekursion und bedingte Verzweigung.
Eigentlicher Kontrollfluß wird nicht explizit spezifiziert!
Stattdessen wird der funktionale Zusammenhang ähnlich einer mathematischen Formel
spezifiziert.
Beweis der Terminierung einfacher als bei imperativen Programmen.
Dr. Stefan Bosse •
Grundlagen der Informatik
Reaktive und funktionale Systeme (I)
Funktionale Systeme
Funktionale Systeme sind gekennzeichnet durch einen eindeutigen Zusammenhang zwischen den Eingabedaten E und der Ausgabedaten A durch eine Abbildung f:E→A.
Ein funktionales System kann prinizipiell in einem einzigen Zeitschritt ausgeführt werden, analog einer mathematischen Funktion, die keinen Kontrollfluß spezifiziert, sondern nur einen Datenfluß. Die Menge der Eingabedaten liegt zu Programmbeginn bereits fest.
Die Menge der Ausgabedaten und deren Werte hängen nur von der Menge der Eingabedaten ab.
Die Menge der Ausgabedaten hängt nicht vom Programmablauf und dem zeitlich veränderlichen Zustand des Programms ab.
Reaktive Systeme
Neben funktionalen Systemen gibt es reaktive Systeme bzw. Programme. Bei denen stehen
die Eingabedaten E nicht zu Beginn einer ”Berechnung” fest.
Bei einem reaktiven System wird ein Strom von Eingabedaten, die nur schrittweise bekannt werden, zu einem Strom von Ausgabedaten verarbeitet (ebenfalls schrittweise).
Die Ausgabedaten hängen neben den Eingabedaten vom zeitlich veränderlichen Zustand des Systems bzw. Programms ab!
Reaktive = interaktive Systeme bzw. Programme müssen nicht das Terminierungskriterium eines Algorithmus erfüllen!
Dr. Stefan Bosse •
Seite 157
Grundlagen der Informatik
Reaktive und funktionale Systeme (II)
Beispiele für funktionale und reaktive Systeme
Funktionales System
T=ggt(N,M)
➥ E={N,M}
➥ A={T}
➥ f: E→A
Seite 158
Reaktives System
Texteditor
➥ E={Textzeichen}
➥ A={Textdatei}
➥ interaktives Programm
➥ bereits eingegebene Daten
können verändert oder gelöscht
werden, d.h. A ist abhängig vom
aktuellen Programmzustand ℘(n)
und vergangenen Zuständen
℘(n-1)· · ·℘(0)
f(℘): E → A(℘)
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmerstellung (I)
Arbeitsablauf bei der Programmerstellung
Zyklus: Edit-Compile-Run
1. Mit Hilfe eines Editors wird ein Programmtext geschrieben (Quellcode).
2. Dieser Text wird mit einem Übersetzer (Compiler) in ein Maschinenprogramm synthetisiert/tranformiert (compiliert):
Analyse
Zuerst wird der Programmtext analysiert und auf Fehler überprüft.
➥ Bei Fehlern wieder 1.) und Korrektur (Rückkopplung im Entwurfsprozeß)
Synthese
Nach erfolgreicher Analyse wird Maschinencode erzeugt.
3. Das Maschinenprogramm kann ausgeführt werden, und bekommt vom Rechner und
Betriebssystem Eingabedaten zur Laufzeit, und generiert Ausgabedaten.
➥ Überprüfung der Funktion des Programms. Bei Fehler wieder 1.) und 2.) und Korrektur.
➤ Der obige Zyklus Edit-Compile-Run ist im Allgemeinen recht (zeit-) aufwendig und unhandlich bezüglich Fehleranalyse und Korrektur (getrennte Programme). Bei einem Interpreter
befindet sich der Compiler und das Ausführungssystem in einem Programm
➤ Die Erzeugung von Maschinencode entfällt teilweise bis gänzlich. Häufig wird eine virtuelle
Maschine im Interpreter zur Ausführung des zu bearbeitenden Programms verwendet.
Seite 159
Dr. Stefan Bosse •
Grundlagen der Informatik
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmerstellung (II)
Seite 160
Programmiersprachen (I)
Def.
Eine Programmiersprache ist eine Notation für Programme, also für Beschreibungen von
Berechnungen.
➤ Diese Notation soll
1. für den menschlichen Leser verständlich,
2. effizient auf einer Maschine implementierbar sein, und
3. ein Hilfsmittel zur Strukturierung, Modularisierung und Partitionierung eines großen Gesamtproblems in kleinere Einheiten bieten.
➤ Man unterscheidet maschinennahe und höhere Sprachen, die sich mehr am menschlichen
Verständins orientieren.
➤ Maschinennahe Sprachen entsprechen umkehrbar eindeutig der Befehlskodierung der Maschine, die sog. Assembler-Sprachen, z.B. VTURI:
LOAD 0;
STORE R[0];
STORE R[1];
L: READ;
⇔
⇔
⇔
⇔
1010000100000000
1011001000000000
1011001000000001
1000000000000000
Dr. Stefan Bosse •
Seite 161
Grundlagen der Informatik
Programmiersprachen (II)
➤ Vor- und Nachteile:
⊕ Sprache und Übersetzer sind leicht zu implementieren.
Programmierung mit diesen Sprachen ist aufwendig und fehleranfällig ➽ siehe VTURI!
Direkte Abhängigkeit von der Rechnerarchitektur, Programme sind nicht portabel, d.h.
für jede Rechnerarchitektur muß ein vollständig neues Programm entwickelt werden.
Keine Möglichkeit der Strukturierung und Modularisierung (Kapselung).
Datenkodierung muß vom Programmierer erfolgen, keine Unterstützung durch Typen.
➤ Höhere Programmiersprachen sind Abstraktionen von maschinennaher Programmierung
und der Rechnerarchitektur.
➤ Vorteile:
⊕ Implementierung eines Algorithmus und Beschreibung der Berechnung mit komplexen
Befehlskonstrukten und Datenstrukturierung, dadurch Reduktion von Programmierfehlern.
⊕ Unterstützung durch Datentypen und Typüberprüfung zur Erkennung von fehlerhaften
Ausdrücken und Anweisungen.
⊕ Programmstrukturierung durch Funktionen, Module und Objekte, portable Programme.
Seite 162
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen (III)
➤ Nachteile:
Fehlender Bezug zur Rechnerarchitektur reduziert Möglichkeiten der Optimierung (Laufzeit und Speicherbedarf), nur durch den
Übersetzer möglich.
Fehler im Übersetzer (!) schwer aufzudecken.
➤ Höhere Programmiersprachen lassen sich durch
das zugrunde liegende Berechnungsmodell
klassifizieren:
Imperative Programmiersprachen
Speichermodell ➽ {C, Pascal, Modula}
Funktionale Programmiersprachen
Funktionsmodell ➽ {ML, Haskell, LISP,
OCAML, SML}
Logische Programmiersprachen
Aussagenlogik ➽ {Prolog}
Hardwarebeschreibungssprachen
Verhaltens- und Strukturbeschreibung von
Hardware ➽ {VHDL, Verilog}
Seite 163
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Die Anfänge: Programmierer als Drahtstöpsler
ENIACComputer,
ca. 1947
Seite 164
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Übersicht
Dr. Stefan Bosse •
Seite 165
Grundlagen der Informatik
Programmiersprachen :: Imperativ
➤ Imperative Sprachen beschreiben eine Berechnung als Folge von Zustandsänderungen
und einzelnen Anweisungen. Es wird eine sequenzielle Ablaufsteuerung explizit beschrieben.
Zustandsänderung ⇔Speicheränderung
➤ Variablenkonzept: benannte Datenkontainer, die in beliebiger Reihenfolge gelesen und denen
Werte zugewiesen werden können (inklusive Rückwirkung).
➤ Alle maschinenahen Sprachen für v. Neumann-Rechner sind imperativ.
➤ Ein imperatives Programm besteht aus einer Vielzahl teils komplexer Anweisungen und Befehle:
1. Zuweisungen von Werten an Variablen, Lesen von Werten aus Variablen, Verknüpfungen von Werten zu neuen Werten mit arithmetischen und logischen Operatoren.
Beispiel C: x=x+5;
➥ wesentliche Zustandänderung
2. Ablaufsteuerung:
A)
B)
C)
D)
Seite 166
Bedingte Verzweigungen
Schleifen
Funktionen
Fallunterscheidungen (Mustersuche)
Beispiel C: Schleife
while (x != y)
{ x=x+1;};
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Imperativ :: Charakteristica [PEP02]
➤ Ein Programm ist eine Arbeitsweisung für eine Maschine.
➤ Als Nebenprodukt ihrer Arbeit liefert diese Maschine zu den gegebenen Eingabedaten die
➤
➤
➤
➤
zugehörigen Ausgabedaten.
Das Ein-/Ausgabeverhalten läßt sich anhand der Arbeitsweise der Maschine analysieren.
Daher werden Programme sehr konkret auf Maschinen bezogen, die Maschine ist zentraler
Bestandteil des Programmiermodells.
Was ein Programmstück tut, hängt vom Zustand ab, in dem sich die Maschine gerade befindet. Dieser Zustand ändert sich mit der Zeit, z.B. die Zählvariable einer Schleife.
Um ein Programm zu verstehen, muß man immer seinen zeitlichen Ablauf betrachten!
Beispiele
ALGOL
ALGOrithmic Language
C
B ➽ C?
Hochsprache, ab 1958, für wissenschaftliche und
numerische Zwecke: Prozeduren, Blöcke, höhere
Kontrollstrukturen, dynamische Arrays,
benutzerdefinierte Typen, reservierte
Schlüsselwörter, Syntax formal definiert
Problemorientierte Programmiersprache, ab
1974, aber maschinennah (ähnlich
Assemblersprache). Entwicklung verknüpft mit
der Entwicklung des Betriebssystems Unix.
Dr. Stefan Bosse •
Seite 167
Grundlagen der Informatik
Programmiersprachen :: Imperativ :: Charakteristica (II)
Beispiele (fortz.)
FORTRAN
FORmula TRANslator
Hochsprache, ab 1954, für numerische
Zwecke:Ursprache aller algorithmisch
orientierten wissenschaftlichen
Programmiersprachen, Programmcode war
klar strukturiert, Formeln konnten in nahezu
mathematischer Syntax eingegeben werden,
der Programmierer mußte sich nicht mehr um
die explizite Speicherverwaltung kümmern,
im Vergleich zu Assemblerpogrammierung.
PASCAL
französicher Hochsprache, ab 1982, für Lehrzwecke,
Mathematiker und
• Strukturierte Programmierung: Zusammenfassung von
Philosoph,
Anweisungen in Prozeduren und Funktionen bzw. von
Blaise
Datengruppen in komplexe Datentypen. Lesbarkeit und
Pascal
Fehlerkorrektur
werden erleichtert.
(16231662)
• Top Down Entwurf: Der Programmierer zerlegt seine Aufgabe in
Teilprobleme, ohne sich zunächst um die Realisierung auf den
unteren Ebenen zu kümmern
• objektorientierte Programmierung
Seite 168
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Funktional :: Charakteristika [PEP02]
➤ Ein Programm ist eine Ein-/Ausgaberelation, d.h. eine Abbildung von Eingabedaten auf zugehörige Ausgabedaten.
➤ Diese Abbildung wird im Programmtext direkt als Funktion hingeschrieben.
➤ Programme sind ”zeitlos”. Eine Funktion liefert zu jedem Zeitpunkt die gleichen Ergebnisse,
wie z.B. die mathematischen Sinusfunktion.
➤ Die Formulierung von Programmen findet auf einem recht abstrakten, mathematisch orientierten Niveau statt.
Beispiele
LISP
LISt Processing
language
OCAML
Objective Categorical
Abstract Machine
Language, INRIA
Hochsprache, ab 1959, für wissenschaftliche
Zwecke: LISP ist eine der am weitesten
verbreiteten symbolverarbeitenden
Programmiersprachen in den Bereichen
Künstliche Intelligenz und Computerlinguistik.
Die Syntax von Lisp ist im Gegensatz zu der
anderer Programmiersprachen sehr einfach.
Einzige funktionale Programmiersprache mit:
funktionalen Kern ⊕ imperativen Anweisungen ⊕
objektorientiertes Programmieren ➽ universelle
Programmiersprache, maschinenunabhängig!
Dr. Stefan Bosse •
Seite 169
Grundlagen der Informatik
Programmiersprachen :: Funktionen (I)
Funktionen sind Bestandteil des Programmiermodells einer Vielzahl von Programmiersprachen,
sowohl imperative als auch funktionale!
DEF. Funktion
Eine Funktion f ist eine Tripel hDf ,Wf ,Rf i bestehend aus:
Definitionsmenge Df
Menge aller Funktionsargumente.
Wertemenge Wf
Menge aller Resultatwerte.
Relation Rf
Die Realtion Rf ⊆ Df × Wf gibt die Abbildung der Funktionsargumente (Eingabe) gegeben durch Df =ha1 ,a2 ,..i in Ergebniswerte Wf =hb1 ,b2 ,..i an, auch Funktionsgraph
genannt.
➽ Bei funktionalen Sprachen und Systemen muß dieser Funktionsgraph linkseindeutig
sein, d.h. es gibt keine zwei Parre ha,b1 i und ha,b2 i mit b1 ,b2 .
Beispiele
1. Funktion Quadrat f: x → y mit y=x2 für natürliche Zahlen der Menge ℵ ist gegeben
durch hℵ,ℵ,Ri mit R={h0,0i,h1,1i,h2,4i,h3,9i,...}.
2. Funktion Addition f: u × v → y mit y=u+v für natürliche Zahlen der Menge ℵ ist gegeben
durch hℵ×ℵ,ℵ,Ri mit R={hh0,0i,0i,hh0,1i,1i,...,hh3,2i,5i,...}.
Seite 170
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Funktionen (II)
Totale und partielle Funktionen
Es gibt Funktionen, die nicht für alle Werte definiert sind, wie z.B. bei der Division durch Null,
die kein Ergebnis hat. Diese funktionen nennt man partiell. Ist die Funktion für alle Werte
definiert, spricht man von einer totalen Funktion, z.B. Addition.
Totalisierung
Partielle Funktionen sind nicht nur in der Mathematik unbeliebt, auch in der Datenverarbeitung. Deshalb werden Tricks angewendet, um partielle Funktionen zu totalisieren.
Beispiel Division
Bei der binären Fließkommadarstellung wird eine nicht gültige reelle Zahl speziell kodiert,
symbolisch durch NaN (Not a Number) gekennzeichnet, als Binärkode z.B. durch ein spezielles Bit gekennzeichent, oder ein außerhalb des gültigen Bereiches liegender Exponentwert.
Dieser spezielle Wert kann aber im Programm weiter verarbeitet werden, und z.B. abgefragt werden, um eine ungültige arithmetische Operation (genauso wie Überlauf) abzufragen!
➽ Erweiterung des Definitionsbereichs D∗ =D∪{⊥} mit einem künstlichen Element ⊥
(genannt Bottom/undefiniertes Element) und des Wertebereichs W ∗ =W∪{⊥}
Beispiel Division
Totalisierung ist Tripel hℵ∗ ×ℵ∗ ,ℵ∗ ,Ri mit R={...,hh7,0i,⊥i,hh7,1i,7i,...}.
Seite 171
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Funktionen (III)
Zentrale Operationen mit Funktionen
Applikation f(x)
Die Applikation liefert dasjenige Element y (möglicherweise ⊥), das im Funktionsgraph x
zugeordnet ist, d.h. hx,yi ∈ Rf
Beispiel:
f: x → y mit y(x)=x-1 und h1,0i
Komposition h = f • g
Bildung einer neuen Funktion h, für die für alle Werte x gilt:
h(x) = (f • g)(x)=f(g(x))
Seite 172
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Ausdrücke & Funktionen (I)
➤ Ein elementarer Ausdruck, auch Grundterm genannt, setzt sich zusammen aus:
Konstanten
Konstante Werte eines bestimmten Datentyps, z.B. ganze Zahlen {0,1,2,...}, Gleitpunktzahlen, Textzeichen usw. Ein Konstante kann mit einem symbolischen Name ausgedrückt werden, der einmalig mit einem Wert durch das Schlüsselwort DEF definiert wird,
und an Stelle des Wertes im folgenden Kontext nach der Definition verwendet werden
kann:
DEF const == value
Beispiel: DEF pi == 3.1415
Funktionen
Geschachtelte Anwendung von Funktionen, wie z.B. der elementaren Sinus-Funktion
oder zusammengesetzten Funktionen.
Mathematische Lamba-Notation von Funktionen
DEF fun == λ par1,par2,... • (Implementierung)
➽ Funktionsparameter werden in der Funktionsimplementierung verwendet.
Beispiel:
DEF grad == λ r • (r/(2.0*pi)*360.0)
DEF pyth == λ a,b • (a*a+b*b)
Dr. Stefan Bosse •
Seite 173
Grundlagen der Informatik
Programmiersprachen :: Ausdrücke & Funktionen (II)
➤ Die Lambda-Notation ist eine weit verbreitete universelle Notation für funktionale Systeme,
ursprünglich ein Notation aus der Mathematik (ca 1908). Imperative Programmiermodelle
besitzen aber ebenfalls funktionale Konzepte, d.h. die Lambad-Notation ist grundsätzlich
universell.
➤ Der Rumpf einer Funktionsdefinition ist die eigentliche Implementierung und Beschreibung
der Funktionsweise, wie Eingabedaten, also die Funktionsparameter, auf Ausgabedaten, die
Ergebnisse, abgebildet werden.
Die Funktionsparameter sind an den Funktionsrumpf gebunden (λ-Bindung), d.h. nur dort
verwendbar, und sind nicht nach außen sichtbar, man nennt sie verschattet!
➤ Wird eine Funktion angewendet (≡ aufgerufen), wir den Funktionsparametern durch die
Funktionsargumente ein Wert zugewiesen.
Beispiel:
DEF phyth2 == λ x,y •
LET xg == grad(x) IN
LET yg == grad(y) IN
(xg*xg+yg*yg)
➤ Innerhalb einer Funktionsdefinition können neue symbolische Variablen, denen nur einmalig ein Wert oder Ausdruck zugewiesen wird, mittels des Schlüsselwortes LET erzeugt
werden. Symbolische Variablen dienen nur zur Vereinfachung von Ausdrücken ➽ Substitution!
Seite 174
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Ausdrücke & Funktionen (III)
Prinzip der Programmierung
Benutze nie Konstanten (mit Ausnahme trivialer Werte wie 0,1,2...) direkt in Ausdrücken,
sondern führe Namen für sie ein!
➤ Von großer Bedeutung für die Lesbarkeit wird bei einigen Funktionen die Infix-Notation verwendet, d.h. die Funktion steht zwischen ihren (zwei) Argumenten. Beispiel sind die arithmetischen Operationen:
DEF add == λ a,b • a + b
... LET y1 == add (2,3) IN
... LET y2 == 2 + 3 IN
⇒ Postfix−Notation
⇒ Infix−Notation
➤ Zur Generalisierung betrachtet man Konstanten als Funktionen nullter Ordnung, d.h. Funktionen, die kein Argument erwarten, und bereits zum Zeitpunkt der Definition vollständig
evaluiert sind.
➤ Neu eingeführte Funktionen können in den Definitionen anderer Funktionen benutzt werden.
➤ Man unterscheidet:
1. die Reihenfolge der Definitionen ist maßgeblich, d.h. eine Funktion darf erst dann angewendet werden, nachdem sie definiert wurde {C,OCAML,PASCAL},
2. die Reihenfolge der Definitionen spielt keine Rolle!
Seite 175
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Ausdrücke & Funktionen (IV)
Definitions- und Wertebereiche: Typisierung
Zweck der Typisierung ist es, Programmierfehler möglichst frühzeitig im Entwicklungsprozeß
aufzudecken und sie möglichst exakt klassifizieren zu können!
➤ Ideal wäre eine Typisierung des echten Definitions- und Wertebereiches. Zum Beispiel sind
reale Datentypen in ihrer Wertemenge eingeschränkt. Beispiel: 32 Bit Integer. Oder ein Datentyp wird ausschließlich für Abzählungszwecke verwendet (Beispiel: Anzahl von Studenten in einem Kurs, Wertemenge festgelegt auf {5,6,...,100}.
Eine solche exakte Charaktersierung unterstützen nur wenige Programmiersprachen.
➤ Typisierung wird auf Funktionen angewendet: Definitions- und Wertebereich.
Dazu wird das Schlüsselwort FUN verwendet. Diese gibt eine Typ-Deklaration der Funktionsschnittstelle an (Signatur), analog der mathematischen Schreibweise:
FUN fun: par1typ × par2typ ... → ergebtyp
Beispiele:
FUN sq : int → int
FUN pyth : real × real → real
➤ Der Definitions- und Wertebereich können nicht nur aus elementaren Mengen bestehen (ein
Funktionsparameter), sondern auch aus Produkten von Mengen (Anzahl Funktionsparameter > 1).
➤ Elementare Typmengen: {nat,int,real,char,string,...}
Seite 176
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Ausdrücke & Funktionen (V)
Funktionstypisierung: Definitions- und Wertebereiche
Name
sq
pyth
pi
Def.bereich
Wertebereich
int
real×real
int
real
real
Bestandteile von Funktionsdefinitionen
Name
sq
pyth
pi
Parameter
Rumpf
x
a,b
x*x
a*a+b*b
3.1415
➤ Als Grenzfall von Funktionen wurden Konstanten eingeführt. Diese besitzen einen leeren
Definitionsbereich und keine Parameter!
Dr. Stefan Bosse •
Seite 177
Grundlagen der Informatik
Programmiersprachen :: Bedingte Ausdrücke (I)
Bedingte Ausdrücke
Entscheidungen zu treffen ist eine der zentralen Aktivitäten bei der Lösung von Problemen.
Fallunterscheidungen sind bereits aus der Mathematik bekannt:
max(a, b) =
a, f alls a ≥ b
b, sonst
(35)
➤ Diese Schreibweise der Mathematik wird in Programmiersprachen ähnlich beschrieben. Dazu wird für eine dual Fallunterscheidung das IF-THEN-ELSE-Konstrukt verwendet:
IF bool_expr THEN expr_true ELSE expr_false FI
Beispiel
DEF max == λ a,b • IF a ≥ b THEN a ELSE b FI
➤ Die Bedingung ist ein boolescher Ausdruck der entweder den Wert true oder false hat.
Der Typ solcher Ausdrücke ist bool.
➤ Die Ausdrücke im THEN- und ELSE-Zweig müssen Werte des gleichen Typs zurückgeben.
➤ Der Ausdruck expr_true wird ausgeführt wenn bool_expr=true, expr_false bei
bool_expr=false!
Seite 178
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Bedingte Ausdrücke (II)
Bewachte Ausdrücke
Häufig steht man vor der Notwendigkeit, mehr als zwei Fälle zu unterschieden. Dazu können
bedingte Ausdrücke geschachtelt werden.
➤ Beispiel
DEF sign == λ x • IF x > 0 THEN +1
ELSE
IF x = 0 THEN 0
ELSE −1
FI
FI
➤ Die Lesbarkeit von geschachtelten Fallunterscheidungen ist gerade bei einer großen Anzahl
von Fällen unübersichtlich! Sinnvoller ist die gleichberechtigte Mehrfach-Fallunterscheidung:
DEF sign == λ x • IF x > 0 THEN +1
IF x = 0 THEN 0
IF x < 0 THEN −1 FI
Dr. Stefan Bosse •
Seite 179
Grundlagen der Informatik
Programmiersprachen :: Bedingte Ausdrücke (III)
Bewachte Ausdrücke (Forts.)
➤ Mehrere Fälle können gleichberechtigt nebeneinander formuliert werden, d..h mat eine FallListe. Diese Variante muß aber folgende Eigenschaften erfüllen:
1. Die Bedingungen (Wächter oder Guards genannt) sollten paarweise disjunkt sein, d.h.
nicht gleichzeitig gelten,
2. die Bedingungen sollten vollständig sein; es sollte also nie vorkommen, daß keiner der
Fälle/Guards gilt (undefiniertes Verhalten!)
➤ Neben dieser universellen bewachten Fallunterscheidung gibt es noch wertebasierte Fallunterscheidungen, sog. Musteranpassung (pattern matching):
_:
MATCH expr_cond WITH
Beschreibt
vollständige
val1 => expr_val1
Wertemenge eines Typs
| val2 => expr_val2
➽ anonyme Variable,
| _ => expr_others
Wildcard-Notation!
x:
➤ Beispiel:
Variable
enthält
alle
sonstigen
Fälle
von
n!
DEF text == λ n • MATCH n WITH
1 → ”one”
| 2 → ”two”
| x → IF x > 0 THEN ”pos” ELSE ”neg”
| _ → ”others”
Seite 180
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Bedingte Ausdrücke (IV)
Bedingte Ausdrücke im Flußdiagramm
Dr. Stefan Bosse •
Seite 181
Grundlagen der Informatik
Programmiersprachen :: Strukturieren durch Teilausdrücke
➤ Ein wichtiges Hilfsmittel, um große und unübersichtliche Ausdrücke zu strukturieren, besteht
darin, abkürzende Bezeichnungen für Teilausdrücke einzuführen, ähnlich in der Mathematik.
➤ Lokale Deklaration:
◆ Die abkürzenden Namen werden als lokale Deklarationen eingeführt, entweder in der
Form LET ... IN ... vor der Anwendung oder in der Form ... WHERE ... nach der Anwendung.
◆ Die Definition eines Namens kann sich auf andere lokal deklarierte Namen inklusive gebundenn Funktionsparametern beziehen, die Verwendung ist nur innerhalb des lokalen
Kontext der Funktion möglich!
◆ Die Reihenfolge der Deklaration spielt i.A. keine Rolle, es dürfen aber keine zyklischen
Abhängigkeiten entstehen.
➤ Beispiel: Berechnung der Fläache eines Dreiecks nach der Heron’schen Formel
F∆ =
p
s(s − a)(s − b)(s − c) mit s =
a+b+c
2
FUN heron : real × real × real → real
DEF heron == λ a,b,c • LET s == (a+b+c)/2 IN
sqrt(s*(s−a)*(s−b)*(s−c))
DEF heron == λ a,b,c • sqrt(s*(s−a)*(s−b)*(s−c))
WHERE s == (a+b+c)/2
Seite 182
Dr. Stefan Bosse •
Grundlagen der Informatik
(36)
Programmiersprachen :: Tupel von Ausdrücken
➤ Die Bildung von Tupelausdrücken oder Tupeltermen dient der anonymisierten Bindung und
Strukturierung von Ausdrücken bzw. Elementen.
➤ Sie erfolgt durch Bindung von Ausdrücken in einem Klammerpaar, wobei die einzelnen Ausdrücke bzw. Elemente durch Kommas getrennt werden.
➤ Tupelausdrücke sind z.B. eine Liste von Funktionsargumenten, können aber auch von Funktionen als Wertemenge zurückgegeben werden! Wird naber nur von einigen wenige Programmiersprachen unetrstützt (OCAML).
➤ Ein Tupel ist eine Gesamtheit, und kann in einzelne Ausdrücke oder Elemente mittels Musteranpassung (pattern matching) wieder zerlegt werden:
LET t == (a1,a2,a3,...) IN
LET (b1,b2,b3,...) == t IN ⇔ MATCH t WITH (b1,b2,b3,...) → ...
Beispiele:
FUN sqrts : real → real × real
DEF sqrts == λ x • (sqrt(x), −sqrt(x))
DEF (sq1,sq2) == sqrts(2.0)
DEF sq12 == sqrts(2.0)
...
LET (s1,s2) == sq12 IN
...
FUN min : real × real
→ real
DEF min == λ a,b • IF a > b THEN b ELSE a
Dr. Stefan Bosse •
Seite 183
Grundlagen der Informatik
Programmiersprachen :: Polymorphie
➤ Sinn einer Typsisierung von Ausdrücken und Funktionen ist die Erkennung von Programmierfehlern.
➤ Häufig kann es aber sinnvoll sein, Funktionen bei deren Definition noch nicht auf einen konkreten Typ zu binden, sondern dieses erst bei der Anwendung durchzuführen.
➤ Beispiel sind arithmetische Operator-Funktionen wie die Addition, die wenigstens auf den
Datentyp INT und REAL anwendbar sind.
➤ Bei einer strengen und konkreten Typisierung müsste man aber zwei Funktionen definieren,
jeweils für den entsprechenden Datentyp:
FUN add_int : int × int → int
FUN add_real : real × real → real
DEF X == add_int 1 2; DEF Y == add_real pi 2.0
➤ Praktischer ist die Definition einer universellen Funktion, die auf verschiedene Datentypen
angewendet werden kann, man spricht von polymorphen Funktionen (Polymorphie).
FUN add : α × α → α
DEF X == add 1 2; DEF Y == add pi 2.0
➤ Der polymorphe Typ α (bzw. jeder griechische Buchstabe) umfaßt eine nicht näher spezifizierte Datentypmenge, z.B. {INT,REAL}.
Seite 184
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Funktionen höhere Ordnung
➤ Bisher wurden nur Funktionen erster Ordnung betrachtet, d.h. Funktionsargumente und
➤
➤
➤
➤
Ergebniswert der Funktion waren elementare (oder zusammengesetzte) Datentypen.
Ein generisches Funktionsmodell erweitert den Definitions- und Wertebereich um Funktionen
als Funktionsparameter ➽ Funktionen höherer Ordnung.
D.h. Funktionen können als Argumente übergeben, und auch wieder als Ergebnisse zurückgegeben werden, d.h. es können neue Funktionen über Funktionsargumente gebildet werden!
Imperative Sprachen unterstützen i.A. nur Funktionen erster Ordnung, funktionale hingegen
auch höherer Ordnung.
Beispiele
(*) : α × α → α
sin : real → real
sq == λ x • x*x
sq : α → α
sqsin == sq (sin)
≡ λ x • sin(x)*sin(x)
FUN sqsin : real → real
DEF Z == sqsin pi
FUN
FUN
DEF
FUN
DEF
Dr. Stefan Bosse •
Seite 185
Grundlagen der Informatik
Programmiersprachen :: Rekursion
➤ Rekursion bildet das wichtigste Prinzip bei der Formulierung von Algorithmen. Dabei wird das
gleiche Berechnungsmuster geschachtelt immer wieder angewendet, allerdings jedesmal auf
eine reduzierterer Menge von Daten, bis nur noch ein elementares Datum vorliegt.
➤ Bei rekursiven Funktionen kann eine Funktion sih in ihrem Funktionsrumpf selbst aufrufen.
➤ Klassisches aber ”langweiliges” Beispiel: die Fakultätsfunktion, die mathematisch ausgedrückt als Iterationsgleichung lautet:
Mathematisch: fac(n)=fac(n−1)*n
FUN fac: nat → nat
DEF fac == λ n • IF n = 0 THEN 1 ELSE n*fac(n−1) FI
➤ Eine rekursive Funktion bedarf eines Terminierungskriteriums, ansonsten hat man eine endlose Verschachtelung von Funktionen, die bei einer Maschine zu einem Speicherfehler führen
muß (endlicher Speicher, Funktionsaufrufe benötigen jedesmal Speicherplatz), im Beispiel ist
es der bedingte Ausdruck mit der booleschen Bedingung n=0.
➤ Beispiel:
fac(3) ⇒
fac(2) ⇒
fac(1) ⇒
fac(0) ⇒
Seite 186
3*2
2*1
1*1
1
⇔ fac(fac(fac(fac(0))))
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen
➤ Datenstrukturen dienen zur strukturierten Verabeitung und Handhabung von Daten.
➤ Datenstrukturen sind wie Typen reine Programmierparadigmen (∈ Programmiermodell), und
finden sich im Maschinenprogramm nicht wieder!
➤ Konstruktion von Datenstrukturen setzen sich wie bei Funktionen aus elementaren Konstruktionsprinzipen zusammen:
Funktionen
◆
◆
◆
◆
Funktionsapplikation
Tupelbildung
Fallunterscheidung (bedingte Ausdrücke)
Rekursion
Datenstrukturen
◆
◆
◆
◆
Produktbildung ➽ Tupelbildung, Aggregation
Summenbildung ➽ Variantenbildung
Aufzählung
Rekursion
➤ Prinzip der Programmierung: Arbeite intensiv mit Datentypen! Wo immer logisch zusammenhängende Werte im Programm auftreten, sollte man für sie einen eigenen Typ
einführen!
Seite 187
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Produktbildung (I)
➤ Logisch zusammenhängende Daten werden in einer Gruppe namentlich und typisiert zusammengefaßt durch Einführung einer neuen Datenstruktur.
➤ Diesen Vorgang bezeichnet man als Aggregation. Da neue Typen, und nicht neue Datenobjekte definiert werden, wird anstelle des DEF Schlüsselwortes TYPE verwendet:
TYPE typename == Constr(el1: el1type, el2: el2type,...)
TYPE point == Point(x: real, y: real)
TYPE circle == Circle(center:point, radius: real)
TYPE datum == Datum(tag:char, monat:string, jahr:nat)
➤ Es können Daten mit verschiedenen Datentypen zusammengefaßt werden. Jedes Strukturelement ist im Gegensatz zum anonymen Tupel namentlich bezeichnet.
➤ Durch die Deklaration eines neuen Produkttyps wird implizit erzeugt:
Sorte (typename)
Der neue Typname, in den Beispielen point und datum.
Konstruktorfunktion (constr)
Eine Funktion, die ein neues Datenobjekt von diesem Typ erzeugt, in den Beispielen
gleichnamig Point und Datum:
FUN Point : real × real → point
FUN Datum : char × string × nat → datum
Seite 188
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Produktbildung (II)
➤ Durch die Deklaration eines neuen Produkttyps wird implizit erzeugt (Fortsetz.):
Selektorfunktionen/operatoren (el1,...)
Funktionen (Operatoren), mit denen die einzelnen Strukturelemente el1, el2, ... in Ausdrücken ausgewählt werden können, in den Beispielen x,y,tag...:
FUN x: point → real
FUN y: point → real
FUN tag : datum → char
Beispiele:
DEF p == Point(x=10.0,y=20.0)
DEF s == sq(x(p))+sq(y(p))
Die Verwendung von Selektorfunktionen kann durch eine isomorphe vereinfachte Darstellung ersetzt werden (z.B. ML, C):
FUN sel : typeobj → element
⇔
typeobj.sel
Beispiele:
DEF s == sq(p.x)+sq(p.y)
Dr. Stefan Bosse •
Seite 189
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Produktbildung (III)
➤ Beispiel
(* Typdeklaration *)
TYPE point == Point(x: real, y: real, col: int•int•int)
TYPE circle == Circle(center:point, radius: real)
(* Anmerkung: int•int•int ist ein anonymes Datentupel *)
(* Definition von Datenobjekten *)
DEF p1 == Point(x=10.0,y=20.0,col=100,100,100)
DEF p2 == Point(x=20.0,y=10.0,col=100,100,100)
DEF c == Circle(center=p1,radius=10.0)
DEF is_gray == λ p •
LET (c1,c2,c3) == col(p) IN
c1 = c2 AND c1 = c3 AND c2 = c3
FUN is_gray : point → bool
DEF p1_gray == is_gray(p1)
DEF p2_col == NOT (is_gray(p2))
FUN set_color : int•int•int → unit (* setzt Zeichenfarbe *)
FUN linto : real × real → unit (* zeichnet Linie *)
DEF draw == λ c •
LET c = center(c) IN
set_color(col(c));
lineto(x(c),y(c))
Seite 190
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Summenbildung (I)
➤ Zusammenfassung von Elementen in einem Typ, die inhaltlich Gemeinsamkeiten besitzen
(Semantik), aber strukturell verschieden aufgebaut sind.
➤ Beispiel: Zusammenfassung von Zahlen der Typen {nat,int,real} zu einem übergeordneten Typ zahl.
➤ In diser Situation lassen sich die Elemente des Typs in verschiedenen Varianten klassifizieren
(disjunkte Vereinigung im Sinne der Mengenlehre):
TYPE typname ==
Constr1(el11:el11typ, el12:el12typ ...)
| Constr2(el21:el21typ, ...)
...
| ConstrN(elN1:elN1typ, ...)
Beispiele:
TYPE figure == Line(l1: point, l2: point)
| Circle(center: point,radius: real)
| Rect(c1: point, c2: point)
TYPE zahl == Real(real) | Nat(nat) | Int(int)
DEF r1 == Real(3.14); DEF i1 == Int(10);
Seite 191
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Summenbildung (II)
➤ Die Angabe eines Elementnamens bei einem einzigen Typelement kann optional sein (z.B.
Typ zahl).
➤ Die Anwendung solcher Summentypen in Ausdrücken erfordert explizite oder implizite musterbasierte Ausdrücke bzw. Funktionen mit dem MATCH-Konstrukt:
DEF farbe == λ f •
MATCH f WITH
Line (l,_) → col(l)
| Circle (c,_) → col(c)
| Rect(c,_) → col(c)
FUN add_real: real×real→real;FUN add_int: int×int→int
FUN add_nat: nat×nat→nat
DEF add0 == λ a,b •
MATCH a WITH
Real(ra) →
MATCH b WITH
Real(rb) → add_real(ra,rb)
| _ → ERROR!
| Int(ia) →
MATCH b WITH
Int(ib) → add_int(ia,ib)
| _ → ERROR!
...
Seite 192
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Aufzählungen
➤ Einführung eines neuen Aufzählungs-Typs, der aus einer (kleinen) Anzahl von symbolischen
Elementen besteht.
➤ Entspricht dem Summentyp, wobei alle Typelemente vom gleichen (elementaren) Datentyp
(oder abstrakt) sind, und die einzelnen Typelemente nur durch einen Werte oder Namen
repräsentiert werden.
➤ Auch hier sind musterbasierte Ausdrücke anwendbar, es können aber auch direkte Wertvergleiche bzw. Diskriminatorfunktionen ? verwendet werden.
➤ Beispiel:
TYPE day == montag | dienstag | mittwoch | donnerstag
freitag | samstag | sonntag
TYPE nums == 1 | 2 | 3 | 4
TYPE switch == ”On” | ”Off”
TYPE color == red | blue | green
DEF mycol == red
DEF is_red == λ col •
MATCH col WITH
red → true
| blue | green → false
DEF is_red2 == λ col •
IF col = red THEN ”Yes it0 s red” ELSE ”Other color”
DEF is_red3 == λ col •
IF red?(col) THEN ”Yes it0 s red” ELSE ”Other color”
Dr. Stefan Bosse •
Seite 193
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Arrays (I)
➤ Arrays sind Produkttypen, hier aber beschränkt auf Elemente vom gleichen Datentyp!
➤ Das Programmiermodell eines Arrays hat seinen Urpsprung im speicherbasierten (imperativen) Programmiermodell, sie sind ein Zugeständnis an die Neumann-Rechnerarchitektur.
➤ Ein Array ist dabei in eine Anzahl N von Datenzellen (≡Elemente gleichen Datentyps) unterteilt (wie ein Datenspeicher), die einzeln selektiert werden können. Ein Array wird daher
i.A. direkt im Programmspeicher der Maschine abgebildet, und einzelne Arrayzellen können
mittels einfacher Adreßrechnung erreicht werden.
E1
WR ➽
➽ RD
E2
···
EN
➤ Man kann Arrays aber auch als spezielle Funktionen auffassen!
Der Definitionsbereich (d.h. der Wertebereich des Funktionsparameters) setzt sich aus Intervallen der ganzen Zahlen zusammen, z.B. {1,2,3,...,N}. Der Startindex kann aber belibieg
sein, abhängig von der Programmiersprache (C fordert generell für I 1 =0!).
Arrays sind aber statische Funktionen die als tabellarische Auflistung ihrer Werte vorliegen.
Seite 194
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Datenstrukturen :: Arrays (II)
➤ Der Inhalt von Arrayelementen kann jederzeit verändert werden, so daß ein Array den Zustand eines Programms bestimmt, und daher imperativen Charakter, und nicht funktionalen
Charakter besitzt! Arrays machen i.A. nur Sinn mit Variablen und Schleifenkonstrukten in imperativen Programmiermodellen.
➤ In funktionalen Sprachen müssen daher Arrays immer mit Werten initialisiert werden, da das
Programmiermodell immer gültige Werte von Variablen und Ausdrücken verlangt! Ein nicht
initialisertes Array (wie z.B. in C üblich) ist undefiniert in einem funktionalen und nicht zustandsorientierten Kontext.
➤ Definition eines Arrays:
TYPE Array α
ARRAY arname == artype[interval] := {INIT}
interval == A TO | DOWNTO B
Beispiele:
ARRAY data == real[1 TO 4] := {0.0,0.0,0.0,0.0}
VAL data : Array real
DEF nilpt == Point(x=0.0,y=0.0,col=0,0,0)
ARRAY points == point[0 TO 99] := ALL nilpt
➤ Elementselektion in Ausdrücken:
arname.[index] == get(array,index)
DEF x1 == data.[2] == get(data,2)
Dr. Stefan Bosse •
Seite 195
Grundlagen der Informatik
Programmiersprachen :: Variablen (I)
➤ Bisherige Ausdrücke waren konstant in ihrem Wert oder variabel mit Funktionen durch deren
Funktionsparameter.
➤ Streng genommen sind wertverändernde Anwendungen auf einzelne Zellen von Arrays im
funktionalen Modell keine Änderungen der Werte von Zellen, sondern jede Änderung eines
Arrayelements führt zur Erzeugung eines komplett neuen Arrays:
update(array,index,value) , array.[index] := value
FUN update : Array α × nat × α → Array α
... LET data0 == update(data,2,3.0) IN ...
➤ Erst im Speichermodell können einzelne Elemente eines Arrays verändert werden:
set(array,index,value) == array.[index] := value
FUN set : Array α × nat × α → unit
... data.[2] := 3.0 ...
➤ Da in der Realität durch einen Compiler aus einem Programm das mit einem funktionalen
Modell beschrieben wird ein Maschinenprogramm wird, bleibt es dem Compiler überlassen,
wie er mit dieser Situtaion umgeht (Optimierung; Erzeugung von neuen Datenobjekten ist
eine teure Operation: Speicher, Laufzeit)
Seite 196
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Variablen (II)
➤ Variablen können äquivalent zu Arrays auf zwei Arten modelliert werden:
Referenzvariablen
Durch Referenzen auf Datenobjekte bzw. Ausdrücke/Elemente, in Anlehnung an das
funktionale Modell, wo Datenobjekete unveränderlich sind, und nur die Referenz variabel
ist, aber immer auf ein vorhandenes Datenobjekt verweist (Zeiger):
DEF refvar == REF value
DEF x == REF 0
... LET a == 1 IN x := a; LET b == !x + 1 IN ...
⇒ ≡ x == REF a
➥ Im Beispiel enthält x einen Zeiger zuerst auf den konstanten Wert 0, dann auf den
Ausdruck (unveränderliche ”Variable”) a.
Speichervariablen
Durch echte veränderliche Ausdrücke/Elemente, die nur mit dem Speichermodell beschrieben werden können.
DEF realvar == VAR value
DEF x == VAR 0
... LET a == 1 IN x ← a; LET b = x + 1 IN ...
⇒ ≡ x == a == 1
Seite 197
Dr. Stefan Bosse •
Grundlagen der Informatik
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Variablen (III)
Seite 198
Programmiersprachen :: Schleifen und Rückwirkung
➤ Rein funktionale Modelle beschreiben Datenpfade, d.h. Abhängigkeiten und Zusammenhänge von Daten und Ausdrücken. Iterative Abarbeitung eines Problems mittels Funktionen und
Funktionsrekursion.
➤ Imperative Programmierung bedeutet zusätzlich Beschreibung von Kontrollpfaden, d.h. der
Ablaufsteuerung eines Programms.
➤ Imperative Programmierung kennt neben Funktionen noch Schleifen (des Kontrollflusses!) als
ein Mittel, ein Programmteil (-block) wiederholt auszuführen:
Zählschleife
Eine Schleife mit einem Schleifenzähler, der bei jedem Durchlauf des Schleifenblocks
inkrementiert oder dekrementiert wird. Der Wert des Schleifenzählers kann im Schleifenblock abgerufen werden.
FOR i = a TO b DO ... DONE;
Bedingte Schleife
Ein Schleifenblock wird solange wiederholt ausgeführt, bis eine Abbruchbedingung
(boolescher Ausdruck) erfüllt ist.
WHILE expr DO ... DONE;
Dr. Stefan Bosse •
Seite 199
Grundlagen der Informatik
Programmiersprachen :: Bedingte Schleife (I)
➤ Eine bedingte Schleife führt Anweisungen A1,A2,... im Schleifenblock S wiederholt aus, solange ein boolescher Ausdruck B im Schleifenkopf den Wert wahr ergibt.
WHILE B
DO
A1;
A2;
...
DONE;
➤ Beispiel:
LET i = VAR 0 IN
WHILE i < 3
DO
i ← i + 1;
DONE;
⇔
i ← i+1;
(* i == 1 *)
i ← i+1;
(* i == 2 *)
i ← i+1;
(* i == 3 *)
Seite 200
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Bedingte Schleife (II)
➤ Eine bedingte Schleife setzt Speichervariablen und das Speichermodell voraus, da bei der
Schleifeniteration eine Zustandsänderung des Schleifenausdruckes erreicht werden muß.
➤ Bisher konnten Werte von Ausdrücken nur nach deren Zuweisung abgerufen werden. Bei einer Schleife muß es aber eine Rückwirkung geben, da der Schleifenausdruck (Zeile 1) VOR
der zustandsverändertenden Zuweisung (Zeilen 4,5) auftritt (man spricht auch von Seiteneffekten):
0:
1:
2:
3:
4:
5:
6:
LET i,j,k,... = VAR 0 IN
WHILE exprS(i,j,k,...)
exprS: bool. Ausdruck mit i...
DO
...
i ← exprI;
exprI: neuer Wert von i
j ← exprJ;
DONE;
➤ Beispiel:
LET i,j = VAR 0 IN
WHILE (i+j) < 10
DO
i ← i + 1;
DONE;
(* i == 0
*)
(* i und j werden gelesen *)
(* i wird verändert, j nicht! *)
Dr. Stefan Bosse •
Seite 201
Grundlagen der Informatik
Programmiersprachen :: Bedingte Schleife (III)
➤ Das letzte Beispiel zeigt die Problematik und die Risiken von Schleifen bei der Programmierung:
◆ Die Abbruchbedingung B=false kann von einer Vielzahl von Variablen abhängen, die
sich auf verschiedenste Weise durch Ausdrücke innerhalb des Schleifenkörpers ändern
können.
◆ Das Terminierungskriterium B=false ist im Gegensatz zur Funktionsrekursion nicht direkt
ersichtlich, insbesondere die Frage der Erfüllbarkeit ist durch die Wertrückwirkung nicht
immer beantwortbar.
◆ Das führt zur Gefahr von Endlosschleifen, bei denen das Terminierungskriterium niemals erfüllt ist:
LET i,j = VAR 0 IN
WHILE j < 10
DO
i ← i + 1;
DONE;
Seite 202
(* i == 0
*)
(* j wird gelesen *)
(* i wird verändert, j nicht! *)
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: Zählschleife (I)
➤ Eine Zählschleife führt Anweisungen A1,A2,... im Schleifenblock S wiederholt aus, solange
sich ein Schleifenzähler I innerhalb eines vorgegebenen Intervalls befindet, d.h. es gibt indirekt einen booleschen Ausdruck B im Schleifenkopf und einen Ausdruck E am Ende des
Schleifenblocks S, der den Schleifenzähler inkrementiert oder dekrementiert:
FOR I = A TO | DOWNTO B hSTEP Di
DO
A1;
A2;
...
DONE;
➤ Der Schleifenzähler ist innerhalb des Schleifenblocks als lokale Variable verfügbar (kann gelesen werden).
➤ Beispiel:
FOR i = 1 TO 3
DO
j ← j + i;
DONE;
⇔
j ← j + 1;
j ← j + 2;
j ← j + 3;
Dr. Stefan Bosse •
Seite 203
Grundlagen der Informatik
Programmiersprachen :: Zählschleife (II)
➤ Eine Zählschleife kann in eine bedingte Schleife transformiert werden, indem der Schleifenzähler durch eine Speichervariable (TYP INTEGER) realisiert wird, die Schleifenvariable vor
der Schleife initialisiert wird, und am Ende des Schleifenblocks ein Ausdruck zur Änderung
des Schleifenzählerwertes hinzugefügt wird:
FOR I = A TO | DOWNTO B STEP D
DO
A1;
A2;
...
DONE;
⇔
LET I = VAR 0 IN
I ← A;
WHILE I < B
DO
A1;
A2;
...
I ← I +/− D;
DONE;
Seite 204
(* +:TO −:DOWNTO *)
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C [RRZN98]
➤ Die Entwicklung der Programmiersprache C ist eng mit der Entwicklung des Betriebssystems
UNIX verbunden. Die Anfänge sind in den Jahren um 1970 datiert (Dennis Ritchie).
➤ C ist eine klassische imperative Programmiersprache mit mitteleren Abstraktionsgrad bezüglich Maschine und Betriebssystem: basiert auf Speichermodell.
➤ Wichtige Elemente eines C-Programms:
◆
◆
◆
◆
◆
Funktionen
Blöcke
Typen
Anweisungen
Variablen, Arrays und Strukturen (benutzerdefinierte Typen)
➤ Zeichensatz (zulässige Zeichen):
A..Z,a..z,0..9
Leerzeichen, Zeilenendzeichen (NL/CR)
()[]{} <> +−*/ %⊥~&|_=!?#\,.;:0 ”
➤ Bezeichner und Namen:
➥ Bezeichner dienen zur eindeutigen Identifizierung von Objekten in einem Programm. Ein
Objekt ist in C ein Speicherbereich, der aus einer zusammenhängenden Folge von Bytes
bestehen muß.
Dr. Stefan Bosse •
Seite 205
Grundlagen der Informatik
Programmiersprachen :: C (II)
➤ Für Bezeichner in C-Programmen gilt:
◆ Ein Bezeichner besteht aus einer Folge von Buchstaben, Ziffern oder dem _ Zeichen,
wobei das erste Zeichen keine Ziffer sein darf.
◆ Ein Bezeichner darf beliebig lang sein, wobei aber nur eine besteimmte Länge signifikant
ist (abhängig von C-Implementierung/Compiler)
◆ Schlüsselwörter dürfen nicht als Bezeichner verwendet werden.
➤ In C-Programmen sind Name Bezeichner von Variablen, Funktionen und Typen.
➤ Bei Namen unterscheidet man
interne Namen
die nur innerhalb einer Quellcode-Datei gültig und sichtbar sind, und
externe Namen
die im gesamten Programmkontext gültig und sichtbar sind.
➤ Bei
internen Namen
sind die ersten 31 Zeichen signifikant, es wird zwischen Klein- und Großschreibung
unterschieden, bei
externen Namen
sind mindestens die ersten 6 Zeichen signifikant (Unterscheidung Groß- und Kleinschreibung ist abhängig von C-Implementierung).
Seite 206
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Typen (I)
➤ C ist eine typsisierte Programmiersprache, d.h. alle in einem C-Programm verwendeten Objekte besitzen einen Typ.
➤ Die Typen von Variablen und Funktionen müssen daher deklariert werden.
➤ Elementare Datentypen:
Integer-Typ int
Verwendung:
1. Ganzzahlige Werte
unsigned int
Kodierung der natürlichen Zahlen ohne Vorzeichen
signed int (default)
Kodierung der ganzen Zahlen (positiv & negativ), 2-er-kompl. Darstellung!
short int
Integer-Zahl mit kleinem Werte-Intervall (i.A. Datenbreite 2 Byte)
long int
Integer-Zahl mit großem Werte-Intervall (i.A. Datenbreite 4-8 Byte)
2. Bit-Vektoren (boolesche Operationen)
3. Boolesche Werte (ersetzt nicht vorhandenen Typ bool). Nur ein Bit wird verwendet!
Dr. Stefan Bosse •
Seite 207
Grundlagen der Informatik
Programmiersprachen :: C :: Typen (II)
➤ Elementare Datentypen (Forts.):
Character-Typ char
➥ Datenbreite entspricht kleinster logischer Speicherzellengröße (1 Byte)
Verwendung:
1. Ganzzahlige Werte
unsigned char
Kodierung der natürlichen Zahlen ohne Vorzeichen, Datenbreite 1 Byte
signed char
Kodierung der ganzen Zahlen (positiv & negativ), 2-er-kompl. Darstellung, Datenbreite 1 Byte!
2. Textzeichen
3. Bit-Vektoren (boolesche Operationen)
4. Boolesche Werte (ersetzt nicht vorhandenen Typ bool). Nur ein Bit wird verwendet!
Fließkomma-Typ float/double/long double
Darstellung reeller Zahlen (positiv&negativ) mit Fließkomma-Darstellung. Datenbreite
i.A. 4 Byte (float) und 8 Byte (double).
Seite 208
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Typen (III)
➤ Elementare Datentypen (Forts.):
Leerer Typ void
Der void-Typ ist ein besonderer Typ, er besitzt keinen Wert und auf ihm sind keine
Operationenen definiert. Der Datentyp void steht für eine leere Menge.
Er wird in folgenden Kontext verwendet:
Zeiger
Typ-anonyme Referenzen auf Datenobjekte, d.h. eine Speicheradresse ohne konkreten Datentyp.
Funktionen
Als ”Typangabe” in einer parameterlosen Funktion, d.h. es wird expliziz das Fehlen
von Parametern in einer Funktionsdeklaration angegeben.
Prozeduren
In C gibt es nur Funktionen. Soll eine Funktion keinen Rückgabewert liefern, d.h.
eine Prozedur, muß der Rückgabetyp der Funktion void sein.
Dr. Stefan Bosse •
Seite 209
Grundlagen der Informatik
Programmiersprachen :: C :: Variablen (I)
➤ Variablen sind benannte Datenkontainer, die durch das Speichermodell beschrieben werden.
Eine Variable ist gekennzeichnet durch:
Name oder Referenz
Gültiger Bezeichner zusammengesetzt aus Buchstaben, im Speichermodell eine Speicheradresse im Hauptspeicher.
Behälter
Eigentlicher Datenspeicher der Variable.
Wert
Der Inhalt der Variable.
Typ
Datentyp der Variable. Der Datentyp ist zum einen ein Programmierparadigma, und dient
der Unterstützung des Programmierers zur Vermeidung von Dateninkonsistenzen, zum
anderen bestimmt er die Größe des Speicherbereichs.
➤ Definition und Typdeklaration einer Variablen mit dem Namen v eines bestimmten Datentyps
vartype:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF v == VAR value
⇔
vartype v h=valuei; (Definition)
VAL v : type
⇔
extern vartype v; (Deklaration)
Seite 210
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Variablen (IB)
➤ Die Referenz ist unveränderliches Kennzeichen im Gegensatz zum Wert einer Variablen. Die
Referenz bestimmt die Identität einer Variablen.
Es werden zwei Modelle von Variablen unterschieden:
Wert- oder Kopiersemantik
Die Referenz identifiziert umkehrbar eindeutig einer Variable. D.h. zu jeder Referenz
existiert genau ein Behälter. Eine Schreiboperation ändert den Wert der Variable.
Referenzsemantik
Mehrere Referenzen können auf denselben Behälter zeigen. Eine Schreiboperation ändert gleichzeitig den Wert aller durch ihre Referenzen unterschiedenen Variablen, die
auch zuvor den gleichen Wert besaßen.
➤ C unterstützt sowohl Wert wie Referenzsemantik!
D.h. Variablen deren Namensreferenz
eindeutig und einmalig einen Behälter zuordnet, und Variablen mit unterschiedlichen Namensreferenzen, aber
alle auf den gleichen Behälter verweisen ➽ Zeiger (Pointer)
Dr. Stefan Bosse •
Seite 211
Grundlagen der Informatik
Programmiersprachen :: C :: Variablen (II)
➤ Da C-Variablen direkt einem Speicherbereich zugeordnet werden, gekennzeichnet durch
1. die erste Speicheradresse und
2. durch die Größe des Speicherbereichs,
kann die Speicheradresse ℘(v) mittels eines Adreßoperators ermittelt werden:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
?
⇔
vartype v;
(Definition)
&v
(Adresse)
sizeof(v)
(Größe)
➤ Variablen kann ein Wert zugewiesen werden (linke Seite eines Ausdrucks LHS) oder der Wert
einer Variable kann gelesen werden (rechte Seite eines Ausdrucks RHS):
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
v ← hexpri;
⇔
v = hexpri;
(Wertzuweisung)
x ← hv∈expri;
⇔
x = hv∈expri;
(Wert lesen)
Seite 212
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Variablen (III)
➤ Beispiele
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF x == VAR 0
⇔
int x=0;
(Definition)
x ← 0;
⇔
x = 0;
(Zuweisung)
x ← x + 1;
⇔
x = x + 1; (Ausdruck)
➤ Neben den eigentlichen Datenvariablen gibt es explizite Referenzobjekte, die auf ein Datenobjekt zeigen (es referenzieren). In C bezeichnet man solche Referenzobjekte als Zeiger
(Pointer).
➤ Ein Zeiger ist in C selbst eine Variable. Sie besitzt einen
Behälter, der Speicherzellen
belegt! Der Wert des Behälters ist die Speicheradresse
eines Datenobjektes!
Dr. Stefan Bosse •
Seite 213
Grundlagen der Informatik
Programmiersprachen :: C :: Variablen (IV)
➤ Definition, Deklaration und Verwendung von Zeigern:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF x == VAR v0
⇔
vartype x; x = v0;
DEF xr == REF x
⇔
vartype *xp; (Definition Zeiger)
xp=&x;
(Zuweisung Zeiger)
xr := v1;
⇔
*xp = v1; (Wertzuweisung)
DEF y == !xr
⇔
y = *xp;
(Werterhalt)
Deklaration: Bekanntgabe einer Variablen, Name und Datentyp; Definition: Deklaration mit
gleichzeitiger Belegung von Speicherressourcen ➽ Erzeugung des Behälters!
➤ Beispiele:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF u == VAR 3.14
⇔
float u; u=3.14;
DEF ur == REF u
⇔
float *up;
up=&u;
ur := 2*3.14;
⇔
*up = 2*3.14;
DEF y == !ur
⇔
y = *up;
➥ y hat jetzt den Wert 6.28!!!
Seite 214
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Lebensdauer von Variablen
➤ Variablen können in C einen begrenzten Kontext besitzen (Lokalität), in denen Variablen
sichtbar sind bzw. Speicherzellen belegen.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF a =
{ /* Block 1 */
LET b = VAR v2 IN
vartype a=v1;
(expr b)
{ /* Block 2 */
...
vartype b=v2;
expr b...
};
...
};
➤ Ein lokaler Kontext wird in C durch ein Klammerpaar {} eingeführt. Die Variable a ist im gesamten nachfolgenden Kontext sichtbar, wird aber im ersten Block durch eine lokale Variable
überdeckt, die Variable b hingegen nur innerhalb des zweiten Programmblockes! Beispiel:
{int a=0;
if (a==0) {int a=2;a=a+2;} else {int b=3;a=b+1;}
};
Dr. Stefan Bosse •
Seite 215
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (I)
➤ Einsortige Datenstrukturen: Arrays (Feldtyp) ⇔indizierte Variable.
Definition und Verwendung in Ausdrücken:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ARRAY name == type[size]
type name[size];
:= {v1,v2,...};
name.[i] ← expr;
name[i] = expr;
LHS ← expr(name.[i]);
LHS = expr(name[i]);
➤ Der Typ eines Feldes ist durch seinen Elementtyp und seinen Indextyp gekennzeichnet. Der
Indextyp muß ein ordinaler Typ sein, d.h. entweder ganzzahlig oder mit diesem verträglich
sein, z.B. eine endliche Menge von Namen {x,y,z,...}.
➥ C unterstützt nur ganzzahlige Werte. Das erste Element eines Arrays hat immer Index 0!
➥ Der Elementdatentyp kann beliebig sein, muß aber bei der Definition festgelegt sein.
i=0
1
2
3
Speicheradresse →
Seite 216
4
5
6
7
≈ Index
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (II)
➤ Einsortige Datenstrukturen: Arrays (Feldtyp) ⇔indizierte Variable.
Beispiele in C:
int x;
float yr[10];
int ar[100];
char str[8]=”ROBOTIK”;
...
ar[0] = 0;
for(x=1;x<100;x++)
{
ar[x] = ar[x−1] + 1;
};
...
➤ Zeichenketten (strings) können als Felder des Datentyps char dargestellt werden. Zeichenketten werden in C mit einem zusätzlichen End-Of-String (EOS)-Zeichen vom Wert 0 abgeschlossen, d.h. eine Zeichenkette mit 7 Zeichen benötigt 8 Speicherstellen (siehe Beispiel)!
➤ Das EOS wird benötigt um die Länge einer Zeichenkette ermitteln zu können!
Seite 217
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (III)
➤ Mehrsortige Datenstrukturen: Aggregation ⇔Produktbildung.
Definition eines Strukturtyps und Erzeugung von Objekten dieses Typs:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TYPE typname == Constr(
struct typname {
el1: type1,
type1 el1;
el2: type2,
type2 el2;
...
...
)
};
◆
DEF objname == Constr(
struct typname objname
h{el1=v1,...}i;
el1 = v1,
el2 = v2,
objname.el1 = v1;
...
...
)
➤ Die neue Typdefinition deklariert nur. Es muß eine Variable von diesem Datentyp explizit
erzeugt werden.
Um auf eine Komponente einer solchen Strukturvariablen zugreifen zu können, wird dem
Variablennamen der Komponentenname angehängt, getrennt durch einen Punkt.
Seite 218
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (IV)
➤ Mehrsortige Datenstrukturen: Aggregation ⇔Produktbildung.
Beispiele
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TYPE point == Point(
struct point {
x: real,
float x;
y: real,
float y;
col: int•int•int
struct color col;
)
};
◆
struct color { int r;
int g; int b;};
DEF p1 == Point(
struct color gray={100,100,100};
x=1.0,
struct point p1={1.0,2.0,
y=2.0,
gray};
col=100,100,100
);
DEF x == p1.x
float x;
x = p1.x;
Seite 219
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (V)
➤ Mehrsortige Datenstrukturen: Aggregation ⇔Produktbildung.
Neben Strukturvariablen, die direkt mit einem Variablenbehälter verknüpft sind, kann man
auch Zeiger auf Strukturvariablen definieren:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TYPE typname == Constr(
struct typname {
el1: type1,
type1 el1;
el2: type2,
type2 el2;
...
...
)
};
◆
DEF objname == REF Constr(
struct typname obj;
el1 = v1,
struct typname *objpointer;
el2 = v2,
objpointer=&obj;
...
...
);
... !objname.elx...
...objpointer→elx...
➤ Ein Zeiger in C ist zunächst uninitalisiert, d.h. ungültig. Der Zeiger muß erst noch mit einem
Objekt verknüpft werden. Die Derreferenzierung findet mit → statt.
Seite 220
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (VI)
➤ Mehrsortige Datenstrukturen: Aggregation ⇔Produktbildung.
Beispiele mit Zeigern
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TYPE point == Point(
struct point {
x: real,
float x;
y: real,
float y;
col: int•int•int
struct color col;
)
};
◆
struct color { int r;
int g; int b;};
DEF pp1 == REF Point(
struct color gray={100,100,100};
x=1.0,
struct point p1={1.0,2.0,
y=2.0,
gray};
col=100,100,100
struct point *pp1=&p1;
);
DEF x == !pp1.x
float x;
x = pp1→x;
Dr. Stefan Bosse •
Seite 221
Grundlagen der Informatik
Programmiersprachen :: C :: Zusammengesetzte Datentypen (VII)
➤ Mehrsortige Datenstrukturen: Summenbildung.
Summenbildung ist in C auf Aufzählungen von symbolischen Namen beschränkt.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TYPE name ==
enum name {
el1 |
el1,
el2 |
el2,
...
...
};
➤ Die Symbolliste name wird in C als Integer-Datentyp verwendet. Die symbolischen Namen
werden dabei beginnend mit dem Wert 0 aufsteigend inidiziert, d.h. el1==0, el2==1 ... ➽
Nur der Listentyp Integer wird in C unterstützt.
➤ Bespiele:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
TYPE color ==
enum color {
red | blue | green
red,blue,green};
DEF mycol == red
color mycol; | int mycol;
mycol=red;
Seite 222
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Ausdrücke
➤ Ausdrücke in C sind
1. Zuweisungen mit arithmetischen und logischen Ausdrücken; beinhalten das Lesen des
Wertes (rechte Seite RHS) von Variablen und die Wertänderung von Variablen (linke
Seite LHS),
2. boolesche und relationale Ausdrücke, die in Kontrollanweisungen verwendet werden.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF x == expr
{
LET y == expr IN
vartype x;
...
x=expr;
{
vartype y;
y=expr;
➤
➤
➤
➤
Arithmetische Ausdrücke: +,-,*,/,%,...
Boolesche Ausdrücke: &&,||,!,...
Logische Ausdrücke (Bitvektoren): &,|,~,...
Relationale Ausdrücke: <,>,<=,>=,!=,==
Dr. Stefan Bosse •
Seite 223
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (I)
➤ Kontrollanweisungen
Ausdrucksanweisung
Durch Anhängen eines Semikolons wird aus einem Ausdruck eine Anweisung:
ausdruck ;
Block
Ein Block besteht aus Anweisungen, die durch geschweifte Klammern {} eingeschlossen
sind. Ein Block dient der anonymen Bindung (Komposition) von Anweisungen:
{
Deklarationen
Definitionen
Anweisungen
};
➥ Jeder Block kann neben Anweisungen auch Deklarationen und Definitionen enthalten. In einem Block definierte Variablen sind nur innerhalb diese Blocks sichtbar und
gültig (lokaler Kontext).
Seite 224
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (II)
➤ Kontrollanweisungen
Bedingte Schleife
Wiederholte Ausführung eines Blocks, solange ein boolescher Ausdruck B=true ist.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
while (B)
WHILE B
DO
{
...
...
DONE;
};
◆
first ← true;
WHILE B OR first
do
DO
{
...
...
first ← false;
DONE;
} while (B);
➥ Bei der do-while-Schleife wird der Schleifenblock mindestens einmal ausgeführt!
Dr. Stefan Bosse •
Seite 225
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (III)
➤ Kontrollanweisungen
Zählschleife
Bestimmte Anzahl von wiederholten Ausführungen eines Blocks,
solange sich eine Indexvariable x innerhalb eines vorgegebenen Werteintervals [a,b]
befindet..
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
int x;
for(x=a;x<b;x=x+1)
FOR x = a to b
DO
{
...
...
DONE;
};
◆
for(init,cond,appl)
➥ Die for-Schleife ist eine universelle Schleife wie die while-Schleife mit expliziter Angabe 1. des Initialisierungsausdrucks init, der Durchlaufbedingung cond, und dem
zustandsverändernden Ausdruck appl, der nach jedem Schleifendurchlauf ausgeführt
wird.
➥ Alle drei Ausdrücke im for-Schleifenkopf können auch aus einer Liste von Ausdrücken
gebildet werden: expr1,expr2,...
Seite 226
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (IV)
➤ Sprunganweisungen
break
Die break-Anweisung bewirkt, daß die innerste umgebende Schleife sofort verlassen
wird (Ausgangspfad im Kontrollfluß).
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
?
break;
continue
Die continue-Anweisung bewirkt, daß der aktuelle Schleifendurchlauf beendet wird
und die Schleife mit der nächsten Iteration fortgesetzt wird.
Dr. Stefan Bosse •
Seite 227
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (V)
➤ Beispiele
int x;
x=0;
while(x<10)
{
x=x+1;
if (x==5) break;
if (x==3) continue;
x=x+1;
};
◆
int y=10;
for(x=0;x<10;x=x+1)
{
y=y−1;
if (y==4) break;
};
Seite 228
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (VI)
➤ Auswahlanweisungen ➽ Boolesche Auswahl
Mit Auswahlanweisungen kann der Ablauf von Programmen geändert werden, die Ablaufänderung ist von booleschen Bedingungen oder der Evaluierung und den Vergleich von
Ausdrücken abhängig.
if-then-else
Die Ausführung einer Anweisung oder eines Blocks wird abhängig von dem Ergebnis
eines booleschen oder relationalen Ausdrucks B.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
IF B THEN
if (B)
expr_true
anweisung_true;
ELSE
helse
expr_false;
anweisung_false;i
Beispiel:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
IF b<10 THEN
if (b<10)
b+1
x=b+1;
ELSE
b−1;
Dr. Stefan Bosse •
Seite 229
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (VII)
➤ Auswahlanweisungen ➽ Mehrfachauswahl
select-case
Die Ausführung einer Anweisung oder eines Blocks wird abhängig von dem Ergebnis
eines Vergleichs von Konstanten C={v1,...} mit einem Ausdruck E.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
MATCH E WITH
select E {
| v1 ⇒ a1;
case v1: a1; break;
| v2 ⇒ a2;
case v2: a2; break;
...
| _ ⇒ aN;
default: aN; break;
};
➥ Der letzte Fall default beinhaltet alle Werte R der möglichen Wertemenge
W(E)=C∩R, die nicht durch die beschriebenen Werte v∈C aufgeführt sind.
➥ In C können nur Ausdrücke und Konstanten vom Typ Integer (int) eingesetzt werden!
➥ Jeder Einzelfall muß in C mit der break-Anweisung abgeschlossen werden!
Seite 230
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Anweisungen (VIII)
➤ Auswahlanweisungen ➽ Mehrfachauswahl
select-case
Beispiel:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
LET y ==
int b,x,y;
MATCH x WITH
select (x) {
| 1 → b+1;
case 1: y=b+1; break;
| 2 → b;
case 2: y=b; break;
| _ → 0 IN ...
default: y=0; break;
};
...
Dr. Stefan Bosse •
Seite 231
Grundlagen der Informatik
Programmiersprachen :: C :: Funktionen (I)
➤ Funktionen und Prozeduren definieren einen benannten Programmblock A, der aus einzelnen
Anweisungen besteht. In C wird dieser Programmblock durch ein Klammerpaar {} definiert.
➤ Dieser Programmblock A kann durch Nennung des Funktionsnamens an beliebiger Stelle im
Programm wiederholt ausgeführt werden.
➤ Die Zusammenfassung (Komposition) von Anweisungen im Funktionsblock zu einer neuen
Anweisung wird als Prozedurale bzw. funktionale Abstraktion bezeichnet.
➤ Der Funktionskopf spezifiziert:
◆ den Funktionsnamen,
◆ die Funktionsparameter (Name p, Typ ptype in C)
◆ den Rückgabetyp (Ergebnistyp rtype).
Funktionsdefiniton:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF fun == λ p1,p2,...•
rtype fun(ptype1 p1 h,
A...
ptype p2,...i)
{
A...
return (result);
};
Seite 232
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Funktionen (II)
➤ Es wird zwischen Funktionsdeklaration (Bekanntgabe der Funktion, Parametertypen und
Rückgabetyp) und Funktionsdefinition unterschieden:
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
VAL fun : ptype1 h×
extern rtype fun(ptype1 p1 h,
ptype2...i
ptype p2,...i)
{};
→ rtype
➤ Beispiele
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF sq == λ x •
int sq(int x) {
x*x
return (x*x)
};
DEF sum == λ a,b •
float sum(float a,float b){
a+b
float tmp;
tmp=a+b;
return (tmp);
};
Dr. Stefan Bosse •
Seite 233
Grundlagen der Informatik
Programmiersprachen :: C :: Funktionen (III)
➤ Funktionen besitzen in funktionalen und imperativen Programmiersprachen unterschiedliches Programmiermodell:
funktional
Eine Funktion beschreibt Datenabhängigkeiten und Verknüpfungen durch Operationen
und weitere Funktionen, eine Funktion ist am Ende eines Datenpfades implizit beendet.
imperativ
Neben den Datenabhängigkeiten und Verknüpfungen beschreibt eine Funktion den
Kontrollfluß, so daß in C explizit eine Funktion an beliebiger Stelle ”verlassen” werden
kann, was durch das Schlüsselwort return erreicht wird.
➤ Prozeduren in C sind Funktionen ohne Rückgabewert. Der Ergebnistyp ist void.
➤ Die prozedurale/funktionale Abstraktion ist rekursiv. Einige Programmiersprachen erlauben
daher weitere (lokale) Funktionsdefinitionen innerhalb von Funktionen. C unterstützt diese
geschachtelten lokalen Funktionskontexte nicht!
Es gibt nur
1. globale Funktionen,
2. Modul-(Datei-) lokale Funktionen, die mit dem Schlüsselwort static definiert werden.
DEF sq2 == λ x •
LET sum == λ a,b • a+b IN sum (x,1)*sum(x,1)
Seite 234
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Funktionen (IV)
➤ Funktionsaufruf:
Bei einem Funktionsaufruf werden die Parameter p der Funktion mit den Argumenten x initialisiert.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
...
vartype v;
LET v == fun(x1,x2,...) IN
v = fun(x1,x2,...);
Beispiel:
LET a == sum(1,2) IN
int a;
a=sum(1,2);
➤ Parameterübergabemechanismen:
Man unterscheidet verschiedene Arten der Parameterübergabe, wobei C nur den Wertaufruf
unterstützt:
Wertaufruf
Der Parameter wird mit einem Wert als Argument beim Funktionsaufruf initialisiert.
➥ Eine Änderung des Parameters innerhalb der Funktion hat keinen äußeren Einfluß
(auf das Argument).
Dr. Stefan Bosse •
Seite 235
Grundlagen der Informatik
Programmiersprachen :: C :: Funktionen (V)
➤ Parameterübergabemechanismen:
Ergebnisaufruf
Nach Beendigung der Funktion wird der (Ergebnis-)Wert an das Argument, eine Variable, zugewiesen.
➥ Änderung des Parameters hat äußeren Einfluß (auf das Argument)!
Referenzaufruf
Der Parameter wird mit einem Zeiger (einer Referenz) auf das Argument initialisiert.
➥ Argument und Funktionsparameter bezeichnen das gleiche Objekt, d.h. Änderungen
des Parameters haben sofort äußeren Einfluß!
➥ In C muß der Referenzaufruf explizit mit Zeigern realisiert werden.
{
int a;
int b;
a=5;
b=f_wert(a); ➥ a==5,b==7
f_ref(&b); ➥ b==5
}
Seite 236
int f_wert(int x)
{
return (x+2);
};
void f_ref(int *y)
{
*y=*y−2;
return;
};
Dr. Stefan Bosse •
Grundlagen der Informatik
Programmiersprachen :: C :: Funktionen (VI)
➤ Rekursion:
Eine Funktion f heißt rekursiv, wenn während ihrer Ausführung f (mit veränderten Argumenten) nochmals aufgerufen wird.
Pseudo−Notation
⇔
C−Notation
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
DEF REC fac == λ n •
int fac(int n) {
IF n>1 THEN
int tmp;
n*fac(n−1)
if (n>1) {
ELSE 1
tmp=n*fac(n−1);
return (tmp);
} else
return 1;
};
➤ Eine rekursive Funktion muß immer ein Abbruchkriterium besitzen, welches ein relationaler
oder boolescher Ausdruck sein muß, der wenigstens einen Funktionsparameter enthält, der
sich im Funktionsrumpf ändert!
➥ Gefahr der Endlosrekursion wie bei Schleifen!
Seite 237
Dr. Stefan Bosse •
Grundlagen der Informatik
Literatur
[PEP02]
P.Pepper
Funktionale Programmierung in Opal, ML, HASKELL und Gofer
Springer, 2002
[RRZN98]
Regionales Rechenzentrum für Niedersachsen/Universität Hannover
Die Programmiersprache C. Ein Nachschlagewerk
1998
Seite 238
Dr. Stefan Bosse •
Grundlagen der Informatik
Literatur
[GUM02]
H.P. Gumm, M. Sommer
Einführung in die Informatik
Oldenbourg, 5. Auflage
[OTT02]
T. Ottmann, P. Widmayer
Algorithmen und Datenstrukturen
Spektrum, 4. Auflage
[REC02]
G. Pomberger, P. Rechenberg
Informatik-Handbuch
Hanser, 3 Auflage
[TAN01]
Andrew Tanenbaum
Modern Operating Systems
Prentice Hall, 2. Auflage
Seite 239
Dr. Stefan Bosse •
Grundlagen der Informatik
Herunterladen