Das neue C-Entwicklungssystem von Megamax heißt Laser C. Wir gehören zu den Glücklichen, denen eine englische Testversion mit englischem Handbuch vorliegt. Wie das bei solchen Testversionen üblich ist, traf sie erst kurz vor Redaktionsschluß ein und Application Systems /// Heidelberg, der deutsche Distributor versicherte uns, daß die endgültige Version ganz anders und natürlich viel besser, deutscher und fehlerfreier sei.
Was ist neu an Laser C gegenüber dem bekannten Megamax C? Alles, oder besser gesagt, fast alles. Das Resource Construction Programm (RCP.PRG) trägt jetzt die Versionsnummer 2.1, ist aber kaum verändert worden. Auch an der Tatsache, daß ein Ordner mit Namen MEGAMAX in der obersten Ebene des Dateiverzeichnisses stehen muß, hat sich nichts geändert. Alles andere ist neu oder zumindest nicht mehr zu erkennen.
Die wichtigste Veränderung, die der Compiler erfahren hat, ist die direkte Adressierung anstatt der PC-relativen Adressierung. Dadurch fällt die oft bemängelte Einschränkung der Länge eines Codesegments auf 32 KByte weg. Der Preis dafür sind längere Programme mit längeren Ausführungszeiten. Aber keine Angst, es geht dabei nicht um Faktoren, sondern um 5-10 Prozent.
Wie es sich für einen modernen C-Compiler gehört, kann Laser C auch Aufzählungstypen (Enumeration Types) und die Zuweisung von Strukturen (Structure Assignment). Letzteres war auch schon in Megamax C erlaubt. Der Datentyp int ist immer noch 2 Byte bzw. ein Wort lang. Eine Tatsache, die beim Portieren von Programmen aus der UNIX Welt immer zu Problemen führt.
Der Linker hat auch ein paar neue Features erhalten. Er ist in der Lage, Objekte im DRI-Format zu verarbeiten. Dadurch ist eine Verbindung zu anderen Programmiersprachen geschaffen (z.B. Pascal). Er kann außerdem eine Symboltabelle erzeugen, in das erzeugte Programm einbinden und ein Mapfile erzeugen. Beides erleichtert die Fehlersuche mit dem Debugger, auf den ich noch zu sprechen komme. Es besteht weiterhin die Möglichkeit ein Programm an eine frei wählbare Adresse zu linken. Für diese Option fällt mir in der normalen ATARI-Umgebung keine Anwendung ein. Man kann damit Programme für einen Einplatinen-Computer ohne Betriebssystem erstellen und den ST als Entwicklungsmaschine benutzen. Der gewöhnliche Benutzer wird diese Option aber nicht brauchen.
Will man ein Desk-Accessory linken, muß man nicht wie bisher eine Library zusätzlich angeben, sondern der Linker erkennt an der Extension '.ACC', daß es sich um ein Accessory handelt und bindet den erforderlichen Code automatisch mit ein.
Um eigene Objektbibliotheken (Libraries) zu erstellen, wird ein Archiver oder auch Librarian mitgeliefert. Die Ansteuerung Programms erfolgt über eine Kommandozeile und nicht interaktiv wie bei Megamax C. An dieser Stelle macht Laser C in punkto Benutzerfreundlichkeit einer klaren Rückschritt. Dafür kann man sowohl Laser C- als auch DRI-Bibliotheken verwalten.
Auch vor dem Disassembler wurde nicht halt gemacht. Er kann jetzt nicht nur Laser C, sondern auch DRI-Objektfiles unc GEMDOS-Programme entschlüsseln Dabei werden eventuell vorhandene Symbole verwendet oder neue generiert.
Das Make-Utility hat zu meiner persönlichen Freude einen erheblich gesteigerten Funktionsumfang erhalten. Offensichtlich wurde eine Anleihe bei UNIX gemacht. Es gibt Macros, implicit Macros, dynamic Dependencies und Transformation Rules. Es würde den Umfang dieses Beitrags sprengen, wenn ich an dieser Stelle die Funktionalität von Make erklären wollte. Aber lassen sich versichern, daß die Lektüre der 10 Seiten im Handbuch keine verlorene Zeit ist, auch wenn der Groschen nicht auf anhieb fällt.
#include <stdio.h> long Fac(n) long n; { if(n > 1) return(n * Fac(n-l)); eise return(n); } main() { printf("Fakultaet von 7 = %ld",Fac(7L)); getchar(); }
Bild 3: Beispiel für Rekursion
Bis jetzt habe ich mich mit den Veränderungen an Programmteilen, die schon von Megamax C her bekannt sind beschäftigt. Nun möchte ich auf Neuheiten eingehen. Um fremde (oder auch eigene) Objektfiles zu erforschen, gibt es den Symbol Namer. Dieses Hilfsprogramm zeigt die Symbole in einem Objektfile im Laser C-oder DRI-Format oder im GEMDOS-Programmformat an. Ein weiteres Hilfsmittel ist Egrep (UNIX, ick hör dir trapsen), mit dem man einen Textstring in einer oder mehreren Dateien suchen lassen kann. Dabei sind sogenannte Wildcards erlaubt, die es ermöglichen, z.B. alle Kommentare aus einem C-Programm aufzulisten oder auch zu entfernen, sich die Namen aller in einem C-Programm definierten Funktionen ausgeben zu lassen usw.
Unter der Kategorie Neuheiten läuft auch die Shell von Laser C, die es wirklich in sich hat. Sie ist eine gelungene Mischung aus Kommando-Interpreter und GEM-Shell. Man kann die meisten Funktionen sowohl von einer Kommandozeile, als auch über die Menüleiste mit entsprechenden Dialogboxen aufrufen. Es ist also hinsichtlich der Benutzerschnittstelle für jeden Geschmack gesorgt. Das beste an der Shell ist aber der Cache. Das heißt, man kann Programme und Daten, nachdem sie erst einmal im Speicher sind, immer wieder verwenden, ohne sie erneut von der Disk zu laden. Die daraus resultierende Verarbeitungsgeschwindigkeit schlägt die Konkurrenz um Längen. In Bild 2 gibt eine kleine Tabelle die gemessenen Zeiten wieder. Bei der Tabelle handelt es sich um die gleichen Werte wie auf Seite 11 in der ST-Computer 6/88, erweitert um die Daten von Laser C. Bei Laser C sind jeweils zwei Werte für die Compile+Link-Zeit angegeben. Der erste Wert gibt die Zeit wieder, die beim ersten Durchlauf, also ohne Cache, und beim zweiten Durchlauf mit Cache gemessen wurden. Die Zeiten sind handgestoppt und wurden auf einem 520 ST+ mit einer SH 204 unter Blitter-TOS gemessen.
  | Compile+Link | Ausführung | Größe | Test |
Laser C | 5.3 s/4.8 s | 2.7s | 12052 Byte | Sieb |
Turbo C | 12.3s | 2.8s | 3357 Byte | Sieb |
Megamax | 26.5s | 2.6s | 6955 Byte | Sieb |
Laser C | 18.1s/13.3s | 845 D/s | 13918 Byte | Dhrystone |
Turbo C | 20.0s | 1436 D/s | 9108 Byte | Dhrystone |
Megamax | 45.1s | 920 D/s | 9047 Byte | Dhrystone |
Bild 2: Testergebnisse |
Wer mit einer Floppy arbeitet, kann sich bei Laser C die RAM-Disk sparen. Wenn erst einmal alles im Speicher ist, hat die Floppy nichts mehr zu tun. Man kann angeben, welche Programme gleich nach dem Start in den Speicher geladen und dort resident gemacht werden sollen. Die Quelltexte und Objektdateien werden automatisch in den Cache geladen und von dort aus verwendet. Die Cache-Logik ist der Schlüssel zu den superschnellen Turn-around-Zeiten von Laser C. Um Geschwindigkeit zu erreichen, muß man meistens Kompromisse eingehen, so auch bei dem Cache von Laser C. Das Programm ist nicht mehr unabhängig von der TOS Version. Es werden zwar alle bisher bekannten Versionen unterstützt, aber es kann mit neueren Versionen Probleme geben. Oliver Joppich von Application Systems /// Heidelberg versichert jedoch, das die Anpassung auf ein neues TOS im Configurationsfile der Shell erfolgen kann und kein teures Update erfordert.
Noch ein paar Worte zur Benutzeroberfläche der Shell. Wie schon erwähnt, gibt es einen Kommando-Interpreter, der in einem Fenster läuft. Wer UNIX oder ähnliches gewöhnt ist, fühlt sich dort schnell zu Hause, wenn auch nur ein kleiner Teil der UNIX-Tools zur Verfügung steht. Wer wie ich zu faul ist, sich Kommandos und Dateinamen zu merken, kann auch interaktiv die Kommandos, die man normalerweise im Desktop ausführt, verwenden. In Bild 1 ist die Dialogbox zu sehen, mit der man Dateien kopieren, löschen, umbenennen und verschieben kann. Die Auswahl in der linken Selectorbox ist dabei die Quelle und die rechte Selectorbox das Ziel. Klickt man auf eine Datei, wird in der linken, unteren Ecke die Länge sowie Zeit und Datum der letzten Veränderung angezeigt.
Ähnlich sieht auch die Dialogbox aus, mit deren Hilfe man den Linker aufrufen kann. Man wählt aus einem Fileselector Objektfiles aus und hängt sie an die Liste der zu linkenden Objekte an. Diese Liste kann gespeichert und ähnlich wie ein Makefile verwendet werden. Ruft man den Menüpunkt 'Run' auf, so prüft die Shell, ob die Objektfiles aktuell sind. Falls nicht, compiliert sie die entsprechenden Quelltexte und linkt dann die Applikation und startet sie. Man hat zwar nicht die volle Funktionalität von Make, aber für Programme, die sich aus nur wenigen Dateien zusammensetzen, reicht dieses Minimake völlig aus und hat den Vorteil, daß es fast keinen Aufwand erfordert. Die Objekte zum Linken muß man ja sowieso angeben, und ein zusätzlicher Klick zum Abspeichern erspart später viele Klicks zum Compilieren und Linken.
→C:\FAC.C:main()
→ C:\FAC.C:Fac(n = 7)
→ C:\FAC.C:Fac(n = 6)
→ C:\FAC.C:Fac(n = 5)
→ C:\FAC.C:Fac(n = 4)
→ C:\FAC.C:Fac(n = 3)
→ C:\FAC.C:Fac(n = 2)
→ C:\FAC.C:Fac(n = 1)
←\FAC.C :Fac(l)
←\FAC.C :Fac(2)
←\FAC.C :Fac(6)
←\FAC.C:Fac(18)
←\FAC.C:Fac(78)
←\FAC.C:Fac(2dO)
←\FAC.C :Fac(13bO)
←\FAC.C:main(a)
Program Terminated.
→exit
Bild 4: Ansage der Funktionsaufrufe im Debugger
Die Shell enthält auch den Editor. An dieser Stelle ist es schwer ein objektives Urteil abzugeben. Ich bin von dem Editor begeistert. Mein Kollege Stefan Höhn, übrigens ein Tempus-Fan wie ich, war nicht sehr begeistert. Es ist also Geschmackssache. Wer den Artikel über Turbo-C, der auch aus meiner Feder stammt, gelesen hat, weiß, daß ich ein Freund des Apple Macintosh und der Entwicklungsumgebung MPW bin. Der Editor von Laser C bedient sich wie sonst üblicherweise ein Editor auf dem Mac. Möglicherweise ist das gewöhnungsbedürftig, aber ich glaube, man kann sich damit anfreunden. Der Funktionsumfang und die Geschwindigkeit ist für einen Quelltext-Editor ausreichend (ich gebe zu, Tempus ist schneller). Was mir nicht gefallen hat, ist die Tatsache, daß nicht zeilenweise gescrollt wird. Wenn der Cursor am unteren Rand eines Textfensters angekommen ist und man drückt noch einmal die Cursordown-Taste, wird der Text um 5 Zeilen nach oben gescrollt, und der Cursor steht nicht mehr am Ende, sondern mitten im Fenster.
Den wichtigsten Punkt habe ich mir für das Ende aufgehoben, nämlich den Debugger. Auch zu diesem Thema wurde ein eher unkonventioneller Ansatz gewählt. Der Debugger wird zu dem Benutzerprogramm gelinkt und ist dessen fester Bestandteil. Startet man sein Programm, meldet sich direkt der Debugger und lädt als erstes die Symboltabelle. Anschließend kann man Kommandos des Debuggers ausführen. Alle Kommandos verstehen Symbole. Man kann also Variablen oder Funktionen mit ihrem Namen ansprechen. Die Funktion 'list' zeigt Funktionen, Variablen, Breakpoints, Trace-points und Memory Watches an. Breakpoints und Tracepoints setze ich als bekannt voraus. Was aber sind Memory Watches? Das sind Variablen, die der Debugger ständig überwacht, und falls sie ihren Wert ändern, bewirken, daß von der Applikation in den Debugger verzweigt wird. Diese Funktion ist sehr nützlich, wenn Variablen ohne ersichtlichen Grund plötzlich ihren Wert ändern. Wenn man mit mehreren Personen an einem Programm arbeitet, will es ja nie einer gewesen sein. Memory Watches helfen den Übeltäter dingfest zu machen. Leider muß ich anmerken, daß diese Funktion in der Testversion nicht einwandfrei funktionierte. Ich gehe aber davon aus, daß ein so wichtiges Feature in der endgültigen Version voll verfügbar ist.
Ein besonderer Clou des Debuggers ist die Erweiterbarkeit. Wer will kann den Debugger um zusätzliche Datentypen oder Funktionen erweitern. Die Schnittstelle ist offen gelegt und von C aus problemlos zu benutzen. Für dieses Schmankerl gebührt den Entwicklern ein dickes Lob. Offenheit ist Trumpf.
Ich habe ein kleines Programm geschrieben, um Ihnen die Arbeitsweise des Debuggers zu demonstrieren. Das Listing ist in Bild 3 abgedruckt. Das Programm berechnet rekursiv die Fakultät der Zahl 7. Bild 4 Zeigt die Ausgabe des Debuggers. Wie man sieht wird zu jedem Funktionsaufruf der Name des Sourcefiles und der Funktionsname mit den Übergabeparametern angezeigt. Die Schachtelungstiefe wird durch Einrücken kenntlich gemacht. An der Richtung des Pfeils vor der entsprechenden Zeile erkennt man, ob die Funktion aufgerufen oder verlassen wurde. Beim Verlassen wird anstelle der Übergabeparameter der Rückgabewert der Funktion ausgegeben.
Soviel zu der getesteten Version von Laser C. Es ist eine englische Testversion mit englischem Handbuch. Das Paperback-Handbuch beschreibt auf 640 Seiten alles, was man über Laser C und die Libraries wissen muß. Es gibt UNIX-kompatible Libraries und natürlich GEMDOS, BIOS, XBIOS, VDI und AES. Die Funktionen der einzelnen Libraries sind ausführlich beschrieben, oft sogar mit Beispielen vertieft.
Das ganze System wird als eingedeutschte Version (auch mit deutschem Handbuch) voraussichtlich zur ATARI Messe verfügbar sein. Der Preis soll 398 DM betragen. Wer schon stolzer Besitzer von Megamax C ist kann für 80 DM ein Update in Form von 2 Disketten und dem englischen Handbuch bekommen.