Computer & Technik

Standard-Software

TURBO-C++

Mit Objekten zukunftsorientiert programmieren

Borlands neuster Streich heißt Turbo-C++. Schneller noch als Erz­rivale Microsoft, brachte die Cali­fornische Software-Schmiede einen C++-Compiler auf den Markt. Turbo-C++ ist weitgehend kom­patibel zur Vorgängerversion 2.0 und entspricht der AT&T Norm 2.0, dem inoffizellen Standard für C++-Compiler.

Objektorientierte Programmierung galt lange als Modeerscheinung und Spielerei von forschungsver­liebten Professoren. Doch ange­sichts der gestiegenen Ansprüche der Anwendergemeinde und der im­mer komplexer werdenden Oberflächen und Programmstrukturen sehen sich immer mehr Softwarehäu­ser gezwungen, von der prozeduralen Programmierung auf die moderne objektorientierte Implementie­rung von Methoden umzusteigen.

Da aber ein Großteil der AT&T-Vorschläge ohnehin inzwischen in die ANSI-Normen aufgenommen und in den Libraries der meisten Compiler verfügbar ist, fällt der Übergang von C nach C++ weniger schwer als allgemein angenommen.

Im Mittelpunkt der objektorientierten Programmierung (OOP) in C++ stehen die sogenannten Klas­sen. Eine Klasse, die in C++ über das Schlüsselwort "class" definiert wird, ist zunächst nichts anderes als ein neuer Datentyp. Allerdings unterstützt eine Klasse die drei wesentlichen Aspekte der OOP:
- Datenkaspelung
- Vererbung
- Polymorphismus.

Datenkaspelung entspricht einer wesentlichen Forderung der struk­turierten Programmierung, ist aber mit normalen Mitteln nur schwer zu erreichen, da sie vom Programmierer leicht zu durchbrechen ist. Nicht so bei C++. Die Klassendefinition ermöglicht die konsequente Unterteilung von Funktionen und Daten, die nur von den klassenin­ternen Funktionen verändert werden können. Dies erhöht nicht nur die Modularität in Programmen, sondern erleichert auch die Fehler­suche, da auftretende Fehler sehr schnell zu einer einzigen Klasse zurück­verfolgt werden können.

Zu den fundamentalen Eigenschaften der objektorientierten Program­mierung gehört das Prinzip der Vererbung. Darunter ist zu verste­hen, daß Klassen aus bereits bestehenden Klassen entwickelt wer­den. Dabei übernimmt die neue Klasse alle Datenbereiche und Funk­tionen der alten Klasse, die automa­tisch Teil der neuen wird. Im Gegensatz zur konventionellen Strukturdefinition, wo ein hierachi­scher Aufbau von Datentypen ebenfalls möglich ist, bleibt in der OOP jedoch die volle Datenkapselung er­halten. Mehr noch, die Funk­tionen behalten ihre Gültigkeit und ermöglichen weiterhin die Bearbei­tung der Klassendaten. In konventionellem C wäre hier ei­nige Sprachakrobatik nötig, um mit einer Funktion alle abgeleite­ten Datentypen bearbeiten zu können.

Aus der Vererbung ergibt sich zwangsläufig die Polymorphie von Funktionen. Polymorphie ist ein griechisches Wort für "viele Aus­drucksformen" und genau das führt sie in die OOP ein: Die Möglich­keit, einer Funktion einen Namen zu geben, der in der ge­samten Objekthierachie gleich verwendet werden kann,  wobei aber jedes Objekt in der Hierachie die Funktion in einer für sie ange­brachten Art und Weise implementieren kann. So führt die Vererbung zwar zur Übernahme des alten Funktionsna­mens, nicht aber zur Über­nahme der exakten Implementierung. Diese kann bei Bedarf geändert wer­den und führt dann zur Überschreibung des vererbten Codes. Andererseits kann die alte Version der Funktion auch bebehalten werden. Der C++-Compiler löst diese komplexen Referenzen zur Laufzeit auf indem die Objekthierachien vom aktuellen Objekt bis hoch zur Wurzel durchlaufen werden, bis eine Implemtierung der benötigten Funktion gefunden wird. Spätestens bei der Wurzel muß diese Funktion vorhandenen sein, da sie sonst nicht hätte vererbt werden können.

Aber nicht alle C++-bedingten Neuerungen haben etwas mit objekto­rientierter Programmierung zu tun. Auch in konventionellen Be­reichen gilt es umzudenken. So ist beispielsweise die Standardbiblio­thek stdio.h durch stream.h ersetzt. Einzeilige Kommentare kön­nen jetzt mittels '//'-Zeichen markiert werden, Funktionsparameter können über den Referenz-Datentyp wahlweise als Wert oder als Adresse überge­ben werden und über den Inline-Bezeichner wird eine Funktion vom Compiler durch ent­sprechenden Maschinencode ersetzt.

Bedingt durch die Einführung von C++ unterstützt Turbo-C jetzt das Rechnen mit komplexen Zahlen und BCD-Arithmetik mit siebzehnstel­liger Genauigkeit, wie sie beispielsweise für finanzmathema­tische Berechnungen nötig ist.

Auffälligste Neuerung ist neben den C++-Befehlen die integrierte Entwicklungsumgebung, die jetzt IDE (für Integrated Development Environment) heißt. Die neue Oberfläche entspricht nun dem SAA-Standard und kann endlich auch mit der Maus bedient werden. Neben so angenehmen Spielereien wie schattierte Fenster mit freier Farb­auswahl erfuhr die IDE zahlreiche interne Verbesserungen. So ist jetzt zum Beispiel möglich, mehrere Quelltextfenster gleichzetig zu öffnen und in ihrer Größe zu va­riiren und verschieben. Ferner lassen sich markierte Textausschnitte über ein Clipboard zwischen den ein­zelnen Fenstern hin und her kopieren.

Auch der Overlay-Linker, der die bereits aus Quttro-Pro bekannte VROOM-Technik (Virtuell Runtine Object Oriented Memory Management) in C++ zur Verfügung stellt, ist neu.

Anders als herkömmliche Techniken, die einzelne Module bei Bedarf auslagern und dem Programmie­rer die Verantwortung für die Modulab­hängigkeiten auf­lasten, verwendet VROOM ein sogenanntes "dynamic segment swapping", das als kleinste Einheit Segmente auf Platte, EMS oder Extended Me­mory auslagert. Die Verwaltung der Abhängig­keiten er­folgt bis auf wenige Ausnahmen (Interrupt-Rou­tinen, etc.) durch den Overlay-Manager.

Ebenfalls neu ist der Profiler, der erstmals in einem Borland-Pa­ket enthalten ist. Ein Profiler ist eine Art Software-Stoppuhr, die über die kritischen Computerressourcen exakt Protokoll führt. Prozessor­zeiten, Diskettenzugriffe und Tastatur-, Drucker- und In­terruptaktivitäten werden erfaßt und ausge­wertet. Auf diese Weise lassen sich Engpässe in Programmen leichter lokalisieren. Dazu dient nicht zuletzt auch die Aufrufstatistik, die für jede Routine und jede Zeile die Anzahl der Aufrufe bzw. Durchläufe enthält. Eine ebenso interessante Information ist die Routinen-Crossre­fernz. Sie gibt Aus­kunft über die Aufrufhierachie des Programms: Von welchen Routinen erfolgten die Aufrufe an die zu untersuchende Routine.

Dieses Profilinig ist nicht zu verwechseln mit der Compilerinternen Optimierung. Der Compiler kann nur zeitaufwendige Konstruktionen gegen weniger zeitintensive Codepassagen austauschen. Die Optimie­rung der Algorithmen bleibt dem Programmierer überlassen, der mit dem Profiler ein mächti­ges Instrument für das Aufspüren schwacher Programmteile zur Hand hat.

Stark verbessert zeigt sich auch der Turbo-Debugger, der nun in der Version 2.0 vorliegt. Neben der jetzt möglichen Mausbedienung macht sich vor allem die verbesserte Speicherausnutzung bemerkbar. Im Hauptspeicher belegt der Debugger nur noch runde 70 KBytes. Der ganze Rest des Debuggers wird samt der umfangreichen Tabellen in das Extended oder Expanded Memory ausgelagert. Der Turbo-De­bugger unter­stützt natürlich das Arbeiten mit Klassen. In einem speziellen Fenster lassen sich die Klassenhierachien einse­hen und schrittweise verfolgen.

Ein völlig neues Feeling ergibt sich beim Debuggen von TSR-Pro­grammen und Gerätetreibern. Diese an sich haarsträubende Angele­genheit ist auf dem zweiten Blick weitaus harmloser als es zunächst den Eindruck hat. Dank der neuen Fähigkeiten ist der Turbo-Debugger nämlich in der Lage, sich selbst in ein TSR-Pro­gramm zu verwandeln. Erst dieser Trick macht das ansonsten unmög­liche Debuggen von residenten Programmen zur leichtesten Sache der Welt.

Nachdem man sich erst einmal daran gewöhnt hat, aus dem laufenden Debugger heraus ein TSR-Pro­gramm zu installieren (wo doch jeder Laie weiß, daß man gerade das eigentlich nie tun sollte), läuft die Debug-Sitzung recht normal ab:

1. Turbo-Debugger laden
2. TSR-Programm installieren
3. Breakpoint bei TSR-Entry-Punkt setzen
4. Turbo-Debugger ebenfalls resident machen
5. TSR-Programm auf DOS-Ebene über Hotkey aktivieren

Sobald das TSR-Programm aktiviert ist, läuft es ganz normal ab, bis es auf den Breakpoint trifft. Exakt an dieser Stelle meldet sich der Turbo-Debugger zu Wort und das Programm läßt sich wie jedes an­dere Programm debuggen.

Diese unkonventionelle Methode, die ähnlich auch bei Gerätetreibern funk­tioniert, macht den Turbo-Debugger zum derzeit wohl besten Software-Debug­ger. Selbst der mit Mircosoft-C 6.0 ausgelieferte Co­deView in der Version 3.0 kann Borlands Meisterstück nicht das Wasser reichen.

Neben diesen lauten Paukenschlägen haben die Entwickler des Turbo-Debuggers aber auch still­schweigend mit viel Liebe zum Detail einige interne Verbesserungen vorgenommen. So ist der Turbo-Debugger beispielsweise in der Lage, ein Programm schrittweise rückwärts auszuführen. Ein Kabinett­stückchen, das der Tester inzwischen so häufig nutzt, daß man sich fragt, warum solche Methoden nicht schon früher implementiert wurden.

Bei all diesen exotischen Leistungsmerkmalen darf man aber nicht vergessen, daß das A und O eines Compilers die Codeerzeugung ist und bleibt. Doch auch hier braucht sich Turbo-C++ nicht zu ver­stecken. Obwohl C++ einiges an Overhead erzeugt ist Turbo-C++ immer noch deutlich schneller als Quick-C 2.0 und erreicht Laufzeiten, die stellenweise an MS-C 5.1 heranreichen. Die Codequalität des neuen MS-C 6.0 wird von Turbo-C++ allerdings nicht erreicht. In Sachen Laufzeitoptimierung ist der Microsoft-Compiler derzeit wohl State-of-the-art und nicht zu schlagen.

Glanzpunkt aller Borland-Compiler ist nach wie vor die Grafiklibrary. Hieran hat sch auch unter Turbo-C++ nichts geändert. Das Borland Graphic Interface, kurz BGI genannt, arbeitet mit Treibern, die beliebig um Produkte von Drittanbietern erweiterbar sind. Damit erreicht Turbo-C++ eine Porta­bilität auf DOS-Grafik-Systemen, die ihresgleichen sucht. Wer will, kann unter Turbo-C problemlos SuperVGA mit 1024x768 Punkte bei 16 und neuerdings sogar 256 Farben für anspruchsvole Applika­tionen einsetzen.

Dafür fehlen Turbo-C wiederum Libraries für OS/2 und MS-WINDOWS. Trotz aller gegenteiligen Ge­rüchte ist Borland nicht bereit (oder in der Lage) diese Systeme zu unterstützen. Wer für diese Ober­flächen Programme entwickeln oder anpassen muß, ist nach wie vor auf Microsofts Produktpalette an­gewiesen. Ein Umstand der die ansonsten berechtigte Freude über Turbo-C++ ein wenig dämpft.





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 03:24:49 von textarchiv.alojado.de