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