Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
1.2.2.3 Diskussion<br />
Bei <strong>der</strong> deskriptiven Problembeschreibung gab es keinen Aufwand für die Programmierung, d.h. Problembeschreibung<br />
ist gleichzeitig die Problemlösung. Für funktionale Programme muß man die deskriptive Beschreibung<br />
(Regeln 1 bis 3 aus 1.2.1.1) erst in ein Programm umsetzen und diese Umsetzung auch begründen<br />
(beweisen) können. Der Aufwand ist also höher. Wozu dann das Ganze, wenn man zusätzlich keine Fragen<br />
(ggt(?,n)=t) stellen, son<strong>der</strong>n nur Funktionen (ggt(m,n)=?) beschreiben kann? Im wesentlichen liegt <strong>der</strong><br />
Unterschied in <strong>der</strong> Effizienz. In funktionalen Programmen beschreibt man direkt das Verfahren und überläßt<br />
die Lösungssuche nicht einer allgemeinen Suchstrategie. Das Opfer, das zugunsten einer verbesserten Effizienz<br />
gebracht werden muß, ist die Programmentwicklung und wesentlicher noch die Rechtfertigung o<strong>der</strong> Verifikation<br />
des Programms. In unserem Fall ist die Rechtfertigung noch einfach: Die Implikationen <strong>der</strong> Regeln werden in<br />
die beiden Fallunterscheidungen überführt. Die Zulässigkeit dieser Transformation kann bewiesen werden.<br />
Der Programmieraufwand für funktionale Programme auf <strong>der</strong> Basis einer deskriptiven Problembeschreibung<br />
ist relativ gering, wie Sie im Vergleich zu den nächsten Sprachen sehen werden. Da sie konzeptuell sehr einfach<br />
und daher leicht erlernbar sind, werden sie an an<strong>der</strong>en Universitäten als erste Programmiersprachen in dem<br />
Grundstudium eingeführt. Daß sie noch nicht allgemein verwendet werden, liegt ebenso wie bei deskriptiven<br />
Sprachen an <strong>der</strong> Effizienz. In diesen Sprachen steht keine Möglichkeit zur Verfügung einen Wert zu verän<strong>der</strong>n.<br />
Bei <strong>der</strong> Auswertung von Formeln benötigen die neuen Werte auch neue Plätze im Speicher. Das ist beson<strong>der</strong>s<br />
kritisch bei komplexen Werten wie Matrizen, bei denen sich nur eine Teilinformation än<strong>der</strong>t (Wertän<strong>der</strong>ung<br />
eines Elements <strong>der</strong> Matrix). Hier wird stets eine vollständig neue Version des komplexen Wertes aufgebaut,<br />
statt nur in <strong>der</strong> alten Version die Teilinformation zu än<strong>der</strong>n. Der Effekt ist, daß viel Zeit und Platz benötigt<br />
wird beim fortwährenden Umbau von Werten (Matrizen, die sich nur in einem Wert voneinan<strong>der</strong> unterscheiden).<br />
Eine Vermeidung dieses Aufwands kann man durch Kenntnis des “Platzes” <strong>der</strong> Teilinformation erreichen,<br />
um dort nur die Teilinformation aber nicht die an<strong>der</strong>en Teilkomponenten zu än<strong>der</strong>n.<br />
Wir kommen damit zu einem Speicherbegriff, <strong>der</strong> Plätze bereitstellt, in denen Werte abgespeichert und dort<br />
auch abgeän<strong>der</strong>t werden können. Diese Abän<strong>der</strong>ungvorschriften nennt man Anweisungen. Sie bilden die Basis<br />
<strong>der</strong> imperativen Programmiersprachen. Ist die notwendige Kenntnis <strong>der</strong> Speicherstruktur beschränkt auf das<br />
Wissen, daß z.B. nur ganze Zahlen, reelle Zahlen, Texte usw. gespeichert werden können, so spricht man<br />
von höheren o<strong>der</strong> problemorientierten Programmiersprachen (Pascal, Modula, Ada, Fortran, Cobol, Eiffel, disziplinert<br />
verwendetes C usw.). Ist jedoch auch das Wissen über die interne Darstellung <strong>der</strong> Werteklassen als<br />
Bitmuster (Codierung <strong>der</strong> Werte in eine Folge von Nullen und Einsen) notwendig, so spricht man von maschinennahen<br />
Sprachen (Familie <strong>der</strong> Assembler, aber z.T. auch C). Jede dieser Programmiersprachen basiert auf<br />
einem ihr eigenen abstrakten “Maschinenmodell”, das erklärt, wie die Programme durchgeführt werden. Für<br />
die höheren Programmiersprachen ist dieses Modell konzeptionell einfach, für die maschinennahen Sprachen<br />
durch seine Menge von Details unübersichtlich.<br />
1.2.3 Problemorientierte imperative Sprachen<br />
Im Gegensatz zu den funktionalen Sprachen, <strong>der</strong>en Interpretation auf dem bekannten Mechanismus <strong>der</strong> Funktionsauswertung<br />
aufsetzt, müssen wir für die Programmiersprachen zuerst das Grundkonzept einer abstrakten<br />
Maschine erklären, damit die Anweisungen an diese Maschine verständlich sind.<br />
In ihrer einfachsten Form besteht eine abstrakte Maschine (für Programmiersprachen) aus einer Tabelle, die<br />
links die Variablennamen (Namen von Plätzen) und rechts Werte (die momentan gespeicherten Werte <strong>der</strong><br />
Variablen) hat. Diese Tabelle wird Speicher genannt. Neben dem Speicher gibt es noch den Befehlszähler,<br />
<strong>der</strong> angibt, welcher Befehl im Programm als nächster durchgeführt wird. Die wichtigsten Befehle sind die<br />
Vorschrift, den Wert einer Variablen zu än<strong>der</strong>n (Wertzuweisung) und die Befehle, die angeben, welcher Befehl<br />
als nächstes ausgeführt werden soll (Kontrollanweisungen). Bei den letzteren sind die Fallunterscheidung und<br />
die Schleife die wichtigsten Befehle.