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.


Rahmen3

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


Rahmen5

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++