Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
in Form eines Programms zu beschreiben, daß sie von einer Maschine (Computer) nach festen Regeln interpretiert<br />
werden können. Aufgrund <strong>der</strong> fortgeschrittenen Technik <strong>der</strong> Hardware aber auch <strong>der</strong> Software sind<br />
Fehler in <strong>der</strong> Interpretation von Programmen selten. Unentdeckte Hardwarefehler treten inzwischen extrem<br />
selten auf und die geprüften Übersetzer sind praktisch fehlerfrei. 2<br />
In den Grundzügen <strong>der</strong> <strong>Informatik</strong> spielen in den ersten beiden Semestern die höheren und die maschinennahen<br />
Programmiersprachen die Hauptrolle. Fast alle Programme am Markt sind in Sprachen aus diesen beiden<br />
Bereichen programmiert. Sie sind gekennzeichnet durch Kombinationen von Anweisungen und heißen daher<br />
auch imperative Programmiersprachen. Hinter <strong>der</strong> Kennzeichnung imperativ steckt die Idee, daß man einer<br />
Maschine eine Folge von Befehlen gibt, die sie dann <strong>der</strong> Reihe nach abarbeitet. Aber man muß auch beschreiben<br />
können, was eigentlich ein Programm leisten soll. Dazu brauchen wir deskriptive Sprachen, die aus <strong>der</strong> Logik<br />
stammen. Der Ausdruck deskriptiv sagt, daß man beschreibt, was ein System leisten soll, ohne anzugeben, wie<br />
diese Leistung erreicht werden kann. Für das Verständnis, wie ein Programm einer Programmiersprache zu<br />
interpretieren ist, werden wir eine funktionale Sprache verwenden. Funktionale Sprachen basieren auf <strong>der</strong> Idee,<br />
daß Programme aus ihren Eingaben eine Ausgabe berechnen, also im wesentlichen aus Funktionen bestehen,<br />
wie sie in <strong>der</strong> Mathematik üblich sind. Funktionale Sprachen sind daher am leichtesten zu verstehen.<br />
Im Prinzip kann man mit jedem dieser drei Sprachtypen dieselben Aufgaben bewältigen, jedoch mit unterschiedlicher<br />
Eleganz, da die Wahl <strong>der</strong> Programmiersprache auch die Sicht auf die Welt bestimmt, die man mit<br />
seinem Programm modelliert. Um ein Gefühl für die verschiedenen Konzepte dieser Sprachen zu bekommen,<br />
stellen wir sie am Beispiel des größten gemeinsamen Teilers einan<strong>der</strong> gegenüber. Dabei werden wir für jeden<br />
Sprachtyp das Programm für den größten gemeinsamen Teiler darstellen und dann anschließend besprechen,<br />
nach welchen Regeln eine Maschine dieses Programm interpretieren könnte.<br />
Das Wort Programm ist im allgemeinen Wortschatz mehrdeutig. In unseren Kontext bedeutet es ein formal<br />
beschriebenes Verfahren, das für beliebig vorgegebene Werte durchgeführt werden kann. Es ist also mehrfach<br />
durchführbar. Eine an<strong>der</strong>e Bedeutung hat das Wort Programm im Wort “Besuchsprogramm”. Ein Besuchsprogramm<br />
ist zwar auch eine Beschreibung eines Ablaufs aber eben nur für einen speziellen Gast.<br />
Aus <strong>der</strong> Schule ist <strong>der</strong> größte gemeinsame Teiler noch als eine Funktion ggt bekannt, die zwei natürliche<br />
Zahlen m,n ∈IN in eine natürliche Zahl t ∈IN abbildet. Um diese Funktion zu erklären, ist <strong>der</strong> Begriff “eine<br />
Zahl teilt eine an<strong>der</strong>e” notwendig. Der Begriff beschreibt eine Aussage zwischen zwei Zahlen, die entwe<strong>der</strong><br />
wahr o<strong>der</strong> falsch ist: Die Aussage “a teilt b” – wir schreiben dafür teilt(a,b) – ist genau dann wahr, wenn<br />
a einer Teiler von b ist. Formal ist die Aussage teilt eine Funktion mit zwei Argumenten aus IN und dem<br />
Resultat aus den beiden logischen Werten wahr und falsch, d.h. aus <strong>der</strong> Menge IB= {wahr,falsch}:<br />
teilt:IN×IN→IB Lesweise: IN mal IN wird in IB abgebildet<br />
mit <strong>der</strong> für uns wichtigen Eigenschaft, daß eine Zahl a immer ein Teiler von sich selbst ist und je<strong>der</strong> <strong>der</strong> beiden<br />
Faktoren von a*b Teiler von a*b ist:<br />
für alle a ∈IN gilt teilt(a,a) = wahr und teilt(a,a*b) = wahr<br />
In <strong>der</strong> Logik hat sich bei Aussagen, die stets wahr sein sollen, eingebürgert “= wahr” einfach wegzulassen,<br />
“für alle” durch das Symbol ∀ abzukürzen sowie “und” durch ∧. 3 Wir schreiben daher kürzer:<br />
2 Für die Praxis gilt daher: Der Computer irrt nicht! Fehlverhalten eines informationstechnischen Systems beruht i.a. an den<br />
Fehlern <strong>der</strong> Entwickler <strong>der</strong> Programme o<strong>der</strong> Bedienungsfehler <strong>der</strong> Anwen<strong>der</strong>. Vermeiden Sie daher stets die falschen Ausdrucksweisen:<br />
“Der Computer hat Mist gebaut”. Die korrekte Ausdrucksweise lautet: “Ich habe die Anleitung fehlinterpretiert” o<strong>der</strong><br />
“<strong>der</strong> Entwickler hat ein fehlerhaftes Produkt hergestellt”. Für die Vorlesung und das Praktikum haben wir aus didaktischen<br />
Gründen die noch verhältnismäßig junge Sprache Eiffel gewählt. Hierfür gibt es bis jetzt noch keinen geprüften Übersetzer!<br />
3 Weitere logische Symbole, die wir dem Prädikatenkalkül erster Ordnung entnehmen, sind ¬ für “nicht”, ∨ für “o<strong>der</strong>”,<br />
⇒ für “daraus folgt”, ⇔ für “genau dann, wenn” und ∃ für “es gibt”. Da die Relation “genau dann, wenn” besagt, daß<br />
<strong>der</strong> Wahrheitswert <strong>der</strong> entsprechenden Aussagen gleich ist, verwenden die meisten Programmiersprachen anstelle von ⇔ das<br />
Gleichheitssymbol =. Dies führt aber bei Aussagen wie (4=5) = (6=7) eher zu Verwirrung. Wir verwenden deshalb innerhalb<br />
von logischen Aussagen üblicherweise das Äquivalenzsymbol ⇔ und schreiben (4=5) ⇔ (6=7).<br />
Die genaue Beschreibung dies Prädikatenkalküls kommt im Kapitel 2.