Einleitung
Computersprachen und Problemlösungen
Computersprachen dienen dazu bestimmte Probleme exakt formulieren zu können. Und natürlich soll die gefundene Lösung mit Hilfe einer Maschine, eines Computers, nützliche Arbeit verrichten. Eine Lösung besteht aus den beiden großen Teilen - Daten und Algorithmen. Die verwendete Sprache braucht also Möglichkeiten Daten und Verarbeitungsschritte zu formulieren.
Für Daten bieten die Sprachen immer eine gewisse Anzahl von eingebauten Datentypen, die uns bei der Formulierung helfen. Die bekanntesten Datentypen sind char (engl. character / Zeichen), int (engl. Integer / Ganzzahl), float (Fließkommazahl) und Zeiger auf solche Variable. Damit lassen sich schon viele grundlegende Anwendungen schreiben. Insbesondere konnte man damit in C bereits ganze Betriebssysteme entwickeln. Unix (und damit auch Linux) sind gute Beispiele dafür.
Überschreiten wir die Schwelle zu den Problemen der Benutzer, dann müssen wir in der Lage sein, Kunden und Artikel, Lagerpositionen und Auftragsbestände oder Drücke und Temperaturen zu bearbeiten. Dies geschieht an Hand eines Modells für einen Kunden oder eines beliebigen anderen Elements der Wirklichkeit. Die Frage stellt sich nach der Fähigkeit der Programmiersprachen, solche Modelle zu erstellen und korrekt einzusetzen. Das Hilfsmittel in "C" dazu ist die Struktur. Andere Sprachen, wie Pascal sagen auch record (Satz) dazu. Ein Element der Welt wird in "C" durch eine Struktur beschrieben. Ein solches Modell wird auch als privater Datentyp bezeichnet.
Datentypen beinhalten immer mehrere Aussagen. Zum einen verbergen sich hinter einem bestimmten Datentyp z.B. float Informationen zur Darstellung der Daten, wie viel Speicherplatz benötigt wird und wie der interne Aufbau einer Variablen ist. Bei dem gewählten Beispiel float ist eventuell festgelegt, daß der Aufbau sich nach dem "IEEE"-Standard des amerikanischen Verbandes der Elektroingenieure richtet.
|
Einleitung Seite 13 |
Manche Sprachen (z.B. C/C++) erlauben dem Compilerautor, die genauen Eigenschaften (Größe, Aufbau) festzulegen; andere Sprachen legen diese Eigenschaften generell fest (z.B. Java).
Die zweite große Information, die zu einem Datentyp gehört, ist die Menge der möglichen Aktionen, die auf eine Variable dieses Datentyps angewendet werden dürfen.
Von C zu C++
In C können private Datentypen zwar definiert und benutzt werden, aber der Compiler kann nur einen Teil prüfen. Ihm fehlt die Fähigkeit, die richtige Anwendung der Operationen auf private Datentypen zu garantieren. Und damit sind wir beim Thema der Sicherheit der Programmierung.
Leider schleichen sich in das schönste Programm gelegentlich Fehler ein. Manche lassen sich leicht mit Hilfe des Compilers finden. Hier einen Parameter vergessen oder dort ein Komma zu viel, der Compiler meldet sich. Unangenehmer wird es, wenn der Compiler die Fehler nicht entdecken kann, weil zwar die Syntax stimmt, nur leider ein falscher Name verwendet wurde. Hier braucht man einen Debugger und viel Zeit und Intuition zum Fehlersuchen.
Noch schlimmer wird die Fehlersuche, wenn der Fehler nur manchmal oder nur bei ganz bestimmten, zufälligen Kombinationen auftritt. Solche Fehler werden manchmal über Jahre nicht gefunden.
Solange sich ein solcher Fehler in ein kleines Programm am Heimcomputer einschleicht, sind die Folgen absehbar. In einem Betriebssystem oder in einem Bankprogramm können die Folgen dramatisch sein.
Ein Lösungsansatz verbirgt sich hinter der Abkürzung OOP (Objekt Orientierte Programmierung). Die OOP ist nicht eine einzelne Methode sondern eine bestimmte Sichtweise. Man spricht hier auch vom Paradigma der OOP.
|
Seite 14 Einsteigerseminar C++ |
Grundidee der OOP
Mit der OOP wird gedanklich die Aktion hin zu den einzelnen Objekten verlagert. An Stelle eines allwissenden Gesamtprogramms tritt die Verknüpfung vieler Objekte mit eigener Aktionsfähigkeit.
Die Ideen der OOP, die wir an Hand von C++ erörtern wollen, lassen sich in vier Bereiche aufteilen.
1) Wie erreicht man sicherere Programme?
Man kann bei der Definition von
Datenobjekten festlegen, wer sie verändern darf. Der Compiler überwacht
jede Veränderung. Seiteneffekte werden erheblich reduziert.
C++ kann Daten
in Objekten kapseln.
2) Wie kann man Programme natürlicher formulieren?
In C++ werden viele
Beschränkungen aufgehoben. So kann man den Namen eines Unterprogramms mehrfach
verwenden. Der Compiler erkennt Unterschiede an Hand der Parameterliste.
Oder ein Pluszeichen kann auch Bruchzahlen oder komplexe Zahlen addieren
- wenn sie dem Compiler sagen, wie.
C++ kann Operatoren überlagern.
3) Wie kann man Code wiederverwenden oder sogar zukaufen?
In einem Objekt
werden Daten und Code beschrieben. Ein solches Objekt kann in einem weiteren
Objekt einfach und geschützt wiederverwendet (vererbt) werden. Sollte der
gekaufte Code einen Fehler besitzen, kann dieser Fehler im äußeren Objekt
abgefangen werden.
C++ kann Klassen vererben.
4) Wie kann man intelligente Objekte anlegen?
In der OOP spricht man von
Botschaften, die man einem Objekt sendet. Sendet man verschiedenen Objekten
(einem Kreis, einem Rechteck...) die Botschaft drucke dich, dann erscheint
die richtige Figur. In der Denkweise der OOP wählt ein Objekt die Reaktion
auf eine Botschaft selber aus.
C++ kann während der Laufzeit die richtige
Aktion aus einer Menge der möglichen finden. (Polymorphismus)
|
Einleitung Seite 15 |
Die OOP besteht damit aus den vier Bereichen:
Beginnen wollen wir mit C und seinen Strukturen. Neben der Beschreibung von Strukturen wird insbesondere das Arbeiten mit Informationsdateien (header files) und Bibliotheken wichtig sein. Den Übergang von C zu C++ bildet danach die Erweiterung der Struktur zur geschützten Klasse.
Entwicklungsgeschichte von C++
Die Geschichte von C++ beginnt natürlich mit C. Die Entwickler des Betriebssystems suchten nach einer Möglichkeit, die in Assembler geschriebene Anfangsversion in einer Hochsprache neu zu schreiben. Hilfe kam von Dennis Ritchie, der die Sprache C entwickelte. Das Standardwerk zu C war lange Jahre The C Programming Language von Kernighan und Ritchie (kurz: K&R). 1985 stellt Bjarne Stroustrup seine Implementierung von C++ vor. C++ sollte C um eine verbesserte Typprüfung und das Klassenkonzept erweitern. Der erste Name der Sprache war C mit Klassen, bis ein Mitarbeiter im Inkrementieroperator von C eine treffende Beschreibung fand: C++. C++ sollte ein besseres C sein.
Viele Ideen und Details flossen in den aus dem Jahre 1989 ein (Standard X3.159). Insbesondere verhalfen die Prototypen (Funktionsdeklarationen) zu einer wesentlich verbesserten Typprüfung. Seit Anfang 1990 befasste sich ein ANSI-Kommittee mit der Standardisierung von C++. (Komitee X3.J16). Die Grundlage der Standardisierung findet sich in The Annotated C++ Reference Manual von Margaret Ellis und Bjarne Stroustrup (kurz: ARM). Seit November 1997 ist der Standard verabschiedet (siehe: www.cygnus.com/misc/wp).
C++ Compiler übersetzen immer auch C-Programme. Schließlich ist C++ eine Erweiterung von C. Übersetzt man existierende C-Programme neu, werden wegen der strikteren Syntaxprüfung oft bisher unentdeckte Nachlässigkeiten vom Compiler gemeldet.
|
Seite 16 Einsteigerseminar C++ |
Hinweis zur Gestaltung des Buches
Die Dateiendungen spiegeln ihre Verwendung wider. Für Informationsdateien wird im Buch die Erweiterung .h für C und .hpp für C++ benutzt. Programmdateien enden auf .c für C oder .cpp für C++. Diese Unterscheidung ist abhängig vom Compiler und oft nicht zwingend notwendig.
An vielen Stellen finden Sie kleinere Programmausdrucke. Ein Kasten mit einem Listing, dem Zeilennummern vorangestellt sind, ist ein syntaktisch korrektes Programm, das übersetzt und danach automatisch mit der Nummerierung versehen wurde. Es eignet sich gut für eigene Experimente.
Ein Kasten mit einem Listing ohne Zeilennummern stellt kein übersetzbares Programmstück dar, sondern soll einen bestimmten Sachverhalt erläutern. Auf die sonst notwendigen Details, wie Blockklammern, main() etc. wurde hier verzichtet.
Bitte beachten Sie, daß der Bildschirm ANSI-Steuerzeichen verstehen sollte. Dies geschieht z.B. durch das Laden eines Treibers (ansi.sys bei DOS/Windows) oder durch Auswahl eines geeigneten Terminals (TERM-Variable bei Linux/Unix). Bitte nutzen Sie hier zur Installation die Hilfemöglichkeiten Ihres Betriebssystems.
|
Einleitung Seite 17 |
Rahmen5
Die Beispiele dieses Buches beschränken sich auf Programme, die Sie auf einem Terminal (oder unter Windows: einer MS-DOS Eingabeaufforderung) ausführen können.
Programme für graphische Oberflächen benötigen das Wissen um diese Oberflächen und die zugehörigen Bibliotheken. Die Darstellung des notwendigen Wissens würde sicher den Rahmen eines Einsteigerseminares sprengen.
Für Ihre Experimente können Sie frei erhältliche Compiler aus dem benutzen: g++ für Linux/Unix, oder DJGPP für DOS/Windows (siehe: www.delorie.com/djgpp/getting.html)
Auch andere Hersteller bieten Einstiegsversionen ihrer Compiler sehr preiswert oder umsonst an. Schauen Sie doch einmal auf der Web-Seite Ihres bevorzugten Lieferanten vorbei. Auch von Verlagen gibt es immer wieder Kombinationen aus einem Buch und dem Compiler,
Übrigens genügt für die allermeisten Beispiele eine ältere Compilerversion. Suchen Sie sich also möglichst gleich eine Arbeitsumgebung mit dem Compiler, um mit den Beispielen arbeiten zu können.
Und noch etwas: auch wenn die Beispiele zum Download bereitstehen- Abtippen hilft immer beim Merken.
|
Seite 18 Einsteigerseminar C++ |