Mehrsprachiges Programmieren
Für mehrsprachiges Programmieren gibt es viele gute Gründe. Der beste Grund ist der, daß viele Routinen schon in C geschrieben worden sind. Dazu gehören so bekannte Bibliotheksfunktionen, wie printf() oder auch selbstgeschriebene Anwendungen.
Ein weiterer Grund ist die Geschwindigkeit. Untersucht man ein größeres Programm mit Hilfe eines so genannten profilers so findet man immer einzelne Funktionen, in denen das Programm viel Zeit verbringt. Ein Profiler startet ein Programm und ermittelt die Verteilung der Laufzeit des Programms auf die einzelnen Funktionen. Muß man auf Geschwindigkeit achten, könnte man einen kleinen Teil der Funktionen in Assembler schreiben und optimieren.
Ein dritter Grund ist die Ein- und Ausgabe mit Registern. Will man die Hardware steuern, so bietet der C oder C++ Standard keine Befehle. Viele Compiler haben jedoch den Sprachstandard durch eigene Funktionen oder Makros erweitert. Damit lassen sich dann Unterbrechungsroutinen oder Registerzugriffe realisieren.
Einbinden von C Programmen
Am häufigsten werden sicher C Funktionen in C++ benutzt. Die Sprache unterstützt dies durch eine spezielle Deklaration. Die Informationsdatei stdio.h enthält die Deklaration vieler C- Funktionen, wie printf(), fopen() oder getchar(). Alle diese Funktionen haben wir in den Beispielen des Buches immer wieder benutzt.
Die Deklaration von Funktionen, die in anderen Sprachen geschrieben wurden, muß vom Compiler unterstützt werden. Bisher hat man sich oft auf hersteller-spezifische Erweiterungen verlassen. So kann man in TurboC eine Funktion als cdecl oder als pascal deklarieren. Das Steuerwort beeinflußt dann die Art der Parameterübergabe. C Funktionen können mit variabler Parameteranzahl geschrieben werden, Pascal- Funktionen nur mit fester Anzahl. Werfen wir einen Blick in die stdio.h Datei.
|
Mehrsprachiges Programmieren Seite 201 |
Rahmen1In der ersten Zeile (Bild 14-1) fragt man den Namen __cplusplus ab. Jeder C++-Compiler stellt diesen Namen während der Übersetzung bereit. Nur falls die Datei in einer C++ Übersetzung benutzt wird, stellt man in der Zeile zwei den deklarierten Funktionen den Namen der benutzten Sprache voran. Hier ist es C". Die geschweifte Klammer gibt an, für welche Funktionen dies gilt. Am Schluß wird wieder mit bedingter Übersetzung dafür gesorgt, daß nur ein C++ Compiler die schließende Klammer sieht. Damit kann die gleiche Datei von C und C++ Compilern benutzt werden. Welche Sprachen unterstützt werden, hängt vom Compiler ab.
Einfügen von Assemblerbefehlen
Eine andere Möglichkeit bietet das Schlüsselwort "asm", das in C++ erlaubt, Assemblerbefehle in ein Quellprogramm einzufügen. Die Idee dabei ist, daß der C++ Compiler letztlich eine Datei erzeugt, die vom Assembler übersetzt wird. Schauen wir uns diesen Mechanismus am Beispiel einer Sicherungsprozedur für Datenübertragungen an. Die Sicherheit der Übertragung eines Datensatzes stellt man durch eine spezielle Zusatzinformation sicher: die Bytes. CRC steht dabei für: cyclic redundancy check oder Zusatzprüfinformation. Da die Information bei jedem gesendeten oder empfangenen Byte neu berechnet wird, muß dabei auf Geschwindigkeit geachtet werden. Deshalb wird dafür der Assemblercode bevorzugt.
|
Seite 202 Einsteigerseminar C++ |
Definieren wir zuerst die Klasse crc. Sollten Sie weitere Einzelheiten zu diesem Beispiel suchen, sei auf das Buch Computer Netzwerke von Andrew Tanenbaum verwiesen.
Aus Geschwindigkeitsgründen wurde in der Klassendefinition mit inline-Makros gearbeitet. Die Implementierung geschieht soweit als möglich in C++. Nur die immer wieder verwendete Berechnungsfunktion schreiben wir mit asm-Anweisungen.
Innerhalb der Assembleranweisungen kann man auf Parameter, lokale Variable und C++-Sprungmarken zugreifen. Nutzt man diese Möglichkeiten sollte man das Compilermanual sorgfältig lesen. Man darf keine Register benutzen, die der Compiler zur eigenen Verwaltung benötigt. Insbesondere alle Speicher- und Stackverwaltungsregister dürfen nicht benutzt werden.
|
Mehrsprachiges Programmieren Seite 203 |
Das Beispiel wurde mit einem älteren Borland Compiler übersetzt. Interessant ist auch die Zeile 9. Hier wird der automatische Objektzeiger this gelesen, damit die Routine auf die Eigenschaft des Objektes indirekt zugreifen kann.
|
Seite 204 Einsteigerseminar C++ |
Das Mischen von unterschiedlichen Sprachen bei der Programmerstellung erfordert einige Kenntnis und Erfahrung. Außerdem muß man über den verwendeten Prozessor und die Spezialitäten des Compilers Bescheid wissen. So bleibt dieses Thema einem dickeren Buch vorbehalten.
Hinweise zur Weiterarbeit
1) In den header-Dateien befinden sich viele Beispiele für die Deklaration von C-Funktionen. Welche?
2) Welche Programmteile werden in Assembler geschrieben?
|
Mehrsprachiges Programmieren Seite 205 |
Im nächsten Kapitel
Den einführenden Überblick über die Objekt Orientierte Welt von C++ soll ein zweites Kapitel über die Ein- und Ausgabe beschließen. Die in den Informationsdateien beschriebenen Klassen zur Ein- und Ausgabe bilden eine voneinander abgeleitete Klassenhierarchie. Aus diesem Grund konnten wir bisher nur die einfachen Methoden kennen lernen. Im nächsten Kapitel werfen wir noch einmal einen Blick auf die Ein- und Ausgabe mit Objekten.
|
Seite 206 Einsteigerseminar C++ |