Es ist möglich, mit dem Atari ST C-Programme zu schreiben, die man auch auf einer MS-DOS Umgebung programmieren könnte. Man benutzt also einen konventionellen Editor wie ED oder Mince, schreibt sich ein Batch Programm, daß das C-Source Programm durch den C-Compiler schickt und danach mit dem Linker zu einem ablauffähigen Programm verarbeitet. Der ganze Ablauf wird dann möglichst auf einer Kommandoebene gesteuert, wo von Maus und Fensterumgebung nichts zu merken ist und alle Kommandos artig über die Tastatur in den Rechner eingegeben werden.
Mit anderen Worten, möglichst konventionell auf IBM Standardumgebung bleiben, daran haben sich die Programmierer/innen sowieso gewöhnt. Es geht aber auch anders: wenn schon ein Rechner mit einer recht guten grafischen Schnittstelle und Menüsteuerung zur Verfügung steht, sollten auch die Programme auf diese Oberfläche (sprich GEM) abgestimmt sein. Bisher konnte man bei der Programmierung in C auf die Compiler von Digital Research und Lattice zurückgreifen, die recht brauchbar funktionierten, aber leider nur unter normaler Standardumgebung arbeiten. Seit kurzem ist ein neuer Compiler der Firma Megamax Inc. (Vertrieb in Deutschland: Application Systems Heidelberg) verfügbar, der komplett unter GEM läuft. Nicht nur die Bedienung gestaltet sich damit sehr komfortabel, auch die Compilier- und Linkzeiten sind beim Megamax sehr viel kürzer als bisher gewohnt (siehe Benchtabelle).
Der Megamax wird als komplettes System mit Compiler, Linker, Grafischer Kommandooberfläche (Shell), Gem-Editor, Disassembler, Bibliothekverwalter (Librarian), Kodeoptimierer (Code Improver) und einem kompletten Resource Construction Program und Demofiles auf zwei Disketten geliefert.
Als ich das Megamax Paket zum ersten mal sah war ich sehr erfreut über Umfang und Qualität der in Englisch mitgelieferten Dokumentation: Ein DIN A4 Ringbuch mit ca. 360 Seiten. Knapp 260 Seiten davon behandeln alleine die Programmierung unter GEM (VDI, AES, GEM DOS), wobei die wichtigen Grundlagen über die GEM Manager Routinen genauso enthalten sind wie die Beschreibung der einzelnen GEM Objekte und deren Strukturen sowie die BIOS und XBIOS Funktionen. Abgerundet wird die Dokumentation durch eine Auflistung der BIOS Variablen (0x400 bis Ox4fe), eine Erklärung der BIOS Fehlermeldung, eine Liste der Systemerweiterungen gegenüber dem C-Standard sowie einem ausführlichen Index (5 Seiten).
Zu Beginn der ST Software Entwicklung gab es MINCE, d. h. wenn man auf ä, ö, ü, ß kam, befand man sich wieder auf dem Desktop und das Textfile war verschollen. Als Ausgleich kam dann der ED, bei dem zwar keine Textfiles mehr verschwanden, der aber neben schnellem Scrollen und der Wiederholung von Kommandos keine großartigen Fähigkeiten hatte. Natürlich auch kein GEM.
Der Editor von Megamax arbeitet hingegen konsequent unter GEM, was heißt: Mit der Maus erfolgt die Steuerung des Cursors. Es können einzelne Wörter, Textblöcke, oder sogar der Text zwischen zwei Klammern (egal ob "(", "[" oder "[") durch einfaches Klicken der Maustaste ausgewählt, kopiert oder gelöscht werden. Falls die letzte Funktion nicht gewollt war, braucht nur UNDO" gedrückt zu werden, und die letzte Funktion wird rückgängig gemacht. Ein AUTOIN-DENT (d. h. der Cursor geht beim nächsten < Return > nicht ganz bis an den Zeilenanfang, sondern direkt unter das erste Wort der letzten Zeile) kann ebenso eingestellt werden, wie ein AUTOSAVE, das nach einer gewissen Zeit das Textfile automatisch auf Diskette abspeichert. Um auf eine bestimmte Zeile zu springen, kann man mit dem Befehl Goto line..." arbeiten. Bestimmte Textstellen können vorwärts und rückwärts gesucht und bei Bedarf auch ausgetauscht werden. Dadurch, daß alle Texte in Fenstern (bis zu 4) dargestellt werden, kann komfortabel mit mehreren Texten gearbeitet werden, und mit den Kopierfunktionen lassen sich sehr schnell Textstücke aus den einzelnen Texten austauschen. Mit Wahl des Menüpunktes INFO" können die aktuellen Informationen des jeweiligen Files abgefragt werden (wieviel Speicher ist noch frei, in welcher Zeile/Spalte ist der Cursor usw.). Mit < Help > erfolgt eine Erklärung der wichtigsten Befehle und mit C Operators" können die C Operatoren dargestellt werden. Diese beiden Dialogboxen sind frei mit dem MM Resource Construction Set zu ändern, so daß man eigene Hilfstexte einbauen kann.
Die Länge eines Textfiles darf 32 K nicht überschreiten, was aber bei einer modularen Programmierung, wie sie in C stattfinden sollte, nicht als Einschränkung gelten sollte, sondern eher dazu führt, daß man in überschaubaren Modulen programmiert.
Beachtenswert sind die Details bei diesem Editor:
Die Scrollpfeile an den Fenstern haben eine Wiederholfunktion. Eine neue File Selector Box" ermöglicht die komfortable Ansteuerung von mehreren Diskettenstationen. Und Tastatur-freaks können fast alle Menübefehle auch schnell per <Control> < Taste > erreichen.
Der Compiler hat die C Definition nach Kernighan & Ritchie implementiert. Im folgenden soll auf die Ergänzungen und die maschinenabhängigen Teile eingegangen werden.
Die Standard Definition der Datentypen sehen wie folgt aus:
char, short: 1 Byte
long, float, *pointer: 4 Bytes
int, unsigned: 2 Bytes
double: 4 oder 8 Bytes
Die Register D4-D7 des 68000 sind als Registervariablen für normale Variablen, und die Register A2/A3 für Pointervariablen reserviert, so daß bei Anwendung von register" sechs Register für eine noch schnellere Bearbeitung zur Verfügung stehen.
Wenn sehr schnelle Routinen benötigt werden, kann man im C-Source File in Assembler programmieren, wobei eine direkte Verwendung der Registervariablen im Assemblerkode möglich ist. Alle anderen Variablen in C können mit einem Offset durch Register A4 (static/extern) bzw. A6 (auto) vom Assemblerkode angesprochen werden. Zur Illustration:
An Standardfunktionen stehen alle GEM DOS, BIOS und XBIOS Routinen zur Verfügung, sowie die Standard C Erweiterungen (abs(), atof(), ..., un-link(), writeQ). LINE A kann einfach über INLINE Assembly" angesprochen werden. Außerdem ist es möglich, mit einer einfachen = " Anweisung ganze Strukturen zuzuweisen.
Das Compilieren eines Files erfolgt außergewöhnlich schnell und der erzeugte Code ist sehr kompakt (Bench Tabelle).
Wenn die Programmentwicklung abgeschlossen ist, kann das Objektfile (.0") mit diesem Programm bearbeitet werden. Das Objektfile wird dabei in mehreren Optimierungsstufen noch kompakter und kürzer gemacht. Es wird ein Geschwindigkeitsgewinn bis 3 % und eine Reduzierung der Filelän-ge bis 10 % erreicht.
clear__scrn(scrn__address) /* löscht 32 K ab scrn__adress */
register char *scrn-adress;
{
asm {
moveq.I *0x7FFFF,D0
loop: move.b *0,(scrn__address) +
dbf D0,loop
}
}
Nachdem der Compiler ein .O" Objekt File angefertigt hat, muß dieses noch in ein direkt ausführbares Programm File gewandelt werden. Diese Aufgabe übernimmt der Linker, in dem er das gewünschte .O" File lädt, sich aus der Systemlibrary die gewünschten Routinen heraussucht und in ein Programmfile aus 32 K Segmenten hineinkopiert. Die Routinen, die nicht notwendig sind, werden dabei nicht überflüssigerweise in das Programmfile übernommen. Das Linkformat ist anders als beim klassischen DIGITAL Linker, da fast keine Verschiebeinformationen benötigt werden. Der Linkvorgang selbst erfolgt auch in nur einem Durchgang, da der übliche RELMOD" Vorgang entfällt. Die Zeiten für das Linken sind wieder der Tabelle zu entnehmen.
Der Linker holt sich normalerweise alle benötigten Funktionen aus der Systemdatei SYSLIB". Eigene Routinen können auf einfache Weise mit dazu gelinkt werden. Bei Routinen, die man sehr häufig benötigt, z. B. eine Fensterverwaltung, kann diese Routine in die SYSLIB hineinkopiert werden. Unter dem SHELL kann das sehr komfortabel mit dem Programm MMLIB geschehen.
Beim Austesten von C-Routinen kann es von Vorteil sein, die Routine direkt im Assemblerformat zu analysieren, möglichst mit den richtigen Namen der einzelnen C-Routinen und nicht nur den einfachen Adressen.
Da der C Compiler aus dem Sourcefile gleich ein linkbares Objektfile erstellt, ist es nicht ohne weiteres möglich, sich das erstellte 68000'er Programm als Assemblerfile mit Symbolen anzuschauen. Zu diesem Zweck ist ein Disassembler beigefügt, der die .0 Files direkt als Assemblerlisting mit den Namen der C-Funktionen und C-Variablen auf den Bildschirm oder in ein neues File ausgeben kann. Mit Ausnahme der Segmentbefehle liegt dann ein komplettes Assembler Source Listing vor.
Auch die aus der SYSLIB herausgeholten Funktionen können mit dem DISASSEMBLER in Assemblerfiles gewandelt werden, so daß eine Betrachtung der System-Funktionen möglich ist.
Mit dem Graphik-Shell wird zum Me-gamax ein Programm geliefert, das als sinnvolle Weiterentwicklung des Batch Betriebes unter der GEM Grafikoberfläche angesehen werden kann. Mit dem GEM Shell kann ein beliebiges Programm gestartet, die speziellen Megamax Programme mit den benötigten Parametern angewählt, oder mit MAKE" ein Interpreter gestartet werden, der das Compilieren und Linken übernimmt. Für die Megamax Programme (Compiler, Linker, Editor, Disassembler, Librarian) stehen jeweils komfortable Dialogboxen zur Verfügung, die die Anwahl der einzelnen Parameter sehr vereinfachen.
Bei MAKE" kann ein File angegeben werden, in dem die Programme verzeichnet sind, die bei Bedarf compi-liert/gelinkt werden sollen. Das File kann zum Beispiel folgende Form haben:
In der ersten Zeile stehen die C-Teilprogramme, die compiliert werden sollen, in der zweiten Zeile die Files, die gelinkt werden sollen. MAKE" schaut sich jezt an, ob die ".0"-Files älter sind als die dazugehörenden ".C"-Files und compiliert nur die benötigten Files. Anschließend werden alle Objekt Files zum fertigen Programm gelinkt. Nachdem das MAKE"-File einmal erstellt worden ist, kann man durch einfaches Anklicken von MAKE" das fertige Programm erstellen lassen.
Bastelset für Boxen, Texte und Ikonen
Zum eigentlichen Entwickeln unter GEM gehört auch das Erstellen der ".RSC" Dateien, in denen die Menüs, Dialogboxen, Texte und die anderen Objekte enthalten sind. Bisher gab es nur das RECS von Digital, aber beim Megamax ist ein neues Resource Construction Program enthalten. Der Aufbau dieses Programms ähnelt dem vom RCS, d. h. die Steuerung findet komplett in einer GEM Umgebung statt, und das Bewegen und Erstellen der einzelnen Objektstrukturen ist bei beiden Programmen gleich. In einem Punkt bietet das MMRCP aber einen großen Vorteil: Im Programm ist ein Icon Editor enthalten, mit dem beliebige Icons erstellt, und direkt in die Objektbäume eingebunden werden können.
Erwartet wird jetzt wahrscheinlich ein Test mit dem Programm SIEVE.C, das die Primzahlen bis 8190 berechnet. Das kommt jetzt aber nicht, weil:
Alle Compilerhersteller wissen, daß viele Testberichte den Primzahltest benutzen, und ihre Compiler unter anderem auf dieses Programm optimieren.
In seiner Funktion ist das Programm zu simpel, es besteht aus drei verschachtelten for-Schleifen in der nur Integerwerte addiert und Feldvariablen bestimmte Werte zugeordnet werden.
Es ist daher angebracht, ein Benchmark Programm zu benutzen, das auf mehr Aspekte von C eingeht. Außerdem sollte die durchschnittliche Benutzung der einzelnen C-Statements berücksichtigt werden sowie eine Vergleichbarkeit auf verschiedenen Compilern durch standardisierten Code gewährleistet sein.
Ein Beispiel für einen Benchmark, der diese Kriterien recht gut erfüllt, ist der DHAMPSTONE Benchmark. In diesem Programm werden alle Variablentypen, einschließlich von Strukturen, verwendet. Dhampstone besteht aus mehreren Routinen, die jeweils bestimmte Bereiche des Compilers abprüfen. Eine Routine kopiert Zeichen in Variablenarrays, eine weitere arbeitet mit Integerwerten. Mit den DOUBLE Variablen werden alle Grundrechenarten getestet, die Fibonacci-Funktion testet die rekursiven Fähigkeiten, und schließlich wird ein File auf der Diskette (Ramdisk) angelegt und Daten werden hineingeschrieben.
Neben diesen grundsätzlichen C-Funktionen ist es auch wichtig, wie die Einbindung der C-Routinen in das Betriebssystem erfolgt. Deshalb ist in der Tabelle ein Programm mit dem Namen GEMDOS BIND verzeichnet, das einige Standard GEM Funktionen häufig angesprochen hat. Um zu sehen, wie intelligent der Linker arbeitet, wurde noch eine File HELLO WORLD" mit in die Tabelle aufgenommen. Der Programmteil besteht lediglich aus der Zeile PRINTF("HALLO WELT");.
Und schließlich wurde noch ein längeres Programm getestet (DOODLE+), um einfach zu testen, wie der Compiler/Linker bei längeren Programmen arbeitet.
Beim Compilieren/Linken steht der Megamax eindeutig an der Spitze. Die Zeiten, die er benötigt, sind um Faktor 5,5 besser als vom Digital und Faktor 4 besser als von Lattice. Die Programme belegen im Durchschnitt nur die Hälfte des Platzes vom Lattice und sind ca. 30 % kürzer als die von Digital. Beim Laufzeittest ergeben sich in etwa gleiche Werte wie beim Digital, gegenüber dem Lattice ist der Megamax 20 % bis 30 % schneller. Bei längeren Files macht sich ein weiterer Vorteil bemerkbar: Während der Digital Assembler sehr viel Platz für seine Zwischenfiles benötigt, kann es bei der 1 MB Version des ST passieren, daß der Digital in einer Ramdisk nicht mehr für alle Files, die er zum Compilieren und Linken benötigt, Platz findet und einige Files auf die normale Disk ausgelagert werden müssen. Dadurch können sich beim Digital Compiler Linkzeiten ergeben, die über eine Viertelstunde hinausgehen. Der Megamax geht mit seinen Zwischenfiles sehr viel sparsamer um, so daß es kaum passieren wird, daß die Ramdisk nicht ausreicht. Die Compilier/Linkzeiten liegen auch im Extremfall noch unter einer Minute.
Benchmarkergebnisse: | in Sekunden [1] |
in Sekunden [1] |
in Bytes | in Sekunden [1] | |
COMPILER | Programm | Compilieren | Linken | Program mgröße | Ausführungszeit |
Digital Research Lattice Megamax |
DOODLE + DOODLE + DOODLE + |
264 183 37 |
50 67 28 |
20483 40329 19800 |
entfällt [2] entfällt [2] entfällt [2] |
Digital Research Lattice Megamax |
Hello World Hello World Hello World |
16 8 2 |
41 28 8 |
11522 14340 6575 |
entfällt [2] entfällt [2] entfällt [2] |
Digital Research Lattice Megamax |
GEMDOS BIND GEMDOS BIND GEMDOS BIND |
18 9 3 |
41 28 9 |
11759 15189 6861 |
26 29 28 |
Digital Research Lattice Megamax |
Dhampstone Dhampstone Dhampstone |
36 22 5 |
45 32 10 |
13753 16804 9765 |
26 35 24 |
[1] alle Zeiten bei Benutzung der gleichen Ramdisk ermittelt [2] die benötigte Zeit ist zum Messen zu kurz |
Insgesamt kann gesagt werden, mit dem Megamax steht endlich ein
Entwicklungssystem zur Verfügung, bei dem alles stimmt. Neben einem sehr
guten GEM Editor, erhält man den zur Zeit schnellsten Compiler/Linker der
den kompaktesten Code erzeugt. Auch bei der Laufzeit steht der Megamax an
der Spitze. Durch die Shell kann unter einer komfortablen GEM Oberfläche
programmiert werden, und die zusätzlichen Programme (RCP mit Iconeditor,
Code Improver, Disassembler, Librarian), sowie die ausgezeichnete
Dokumentation machen aus dem Megamax ein neues
Referenz-C-Entwicklungssystem.
Literatur: Dhampstone" Computer Language
2/86