22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!