Für den Atari gab es bisher nur den TDI Modula-2-Compiler. Jetzt erreichte uns ein Konkurrent aus den USA: Jefferson Modula-2. Kann das System dem Referenzcompiler aus Großbritannien Paroli bieten, und bekommt man für unter DM 100,- ein Billigprodukt oder einen Preisbrecher?
Geliefert wird das Entwicklungspaket, für das es noch keinen deutschen Distributor gibt, auf zwei einseitigen Disketten und einem kleinen Manual. Im Test steht hier die Version 1.1 in der “kleinen” Version, die Sie für $49.95 in den Staaten erwerben können. Bei einem momentanen Dollarkurs von DM 1,70 also ein Preisbrecher für ca. DM 85,-, zu denen allerdings noch etwa DM 15,- bis 20,- an Steuern und Zoll kommen.
Bei der Installation geht Jefferson Software einen bisher seltenen Weg: Alle Dateien sind mit dem Kompressionsprogramm ARC platzsparend auf den Disketten untergebracht. Die mitgelieferte Public-Domain-Shell Guläm (dazu noch mehr weiter unten) übernimmt per Batchfile das Kopieren auf Ihre Disketten oder Festplatte. Um das System in einem bestimmten Ordner zu plazieren, sind einige Zeilen mit Zugriffspfaden in dem Batchfile zu ändern. Nach ca. 20 Minuten i alle Zeiten mit Festplatte gemessen) stehen 760 KB Programme und Libraries auf dem Zielspeicher. Einen Kopierschutz gibt es glücklicherweise nicht.
Im Gegensatz zum TDI-Compiler benutzt Jefferson (JS) Modula keine GEM-Funktionen. Compiler und Linker sind TTP-Programme und schreiben ihre Meldungen auf die Standardausgabe. Das ist durchaus vertretbar, denn die Textfenster bei TDI bringen keinen wirklichen Gewinn.
Dennoch gibt es eine besondere Umgebung: die Public-Domain-Shell Guläm in der Version 05. Auch wenn hier die Früchte fremder Arbeit geerntet werden, wird das System erst durch diese Shell zu einem gut benutzbaren Entwicklungspaket. Guläm ist m.E. die leistungsfähigste Public-Domain-Shell. Sie besitzt eine hervorragende Alias-Funktion, mit Setenv können Suchpfade bei der Programmausführung gesetzt werden, Batchfiles arbeiten mit Schleifen, Bedingungen und Parameter. Dateinamen kann man bei der Eingabe mit der Insert-Taste von Guläm vervollständigen lassen. Insgesamt gibt es über 60 Kommandos, die alles Notwendige und ein bißchen mehr bieten (Bild 1). Bei voller Ausnutzung des Alias-Befehls kann man sich eine Umgebung schaffen, die genau den persönlichen Wünschen entspricht. Leider ist die Shell auf eine amerikanische Tastatur eingestellt, läßt sich allerdings für deutsche Verhältnisse patchen.
Einen Editor benötigt JS-Modula nicht, denn der bekannte und gute EMACS ist in einer etwas abgemagerten Version im Guläm enthalten.
Ladezeiten entfallen hier also. Man kann aber auch einen GEM-Editor aufrufen, da Guläm mit dem Präfix “gern” die TOS-Ebene verläßt. Allerdings hat dieses Vorgehen ohne speziellen Editor natürlich den entscheidenden Nachteil, daß Compilerfehler nicht wie bei TDI automatisch im Quelltext angezeigt werden. Vielmehr muß man zunächst das Hilfsprogramm OOPS laufen lassen, das aus den Informationen der Fehlerdateien einen Klartext erzeugt, in dem alle fehlerhaften Quelltext-Zeilen samt Meldungen enthalten sind. Bei der Fehlerkorrektur muß man dann diesen Text einblenden, was mit EMACS kein Problem ist. Das Zusammenspiel zwischen dem Quelltext und den Fehlermeldungen ist bei TDI allerdings erheblich besser gelöst.
Der Compiler wird - wie in Bild 2 zu sehen - einfach mit dem Namen des Quellprogramms aufgerufen. Dabei sind noch die Option -R und -V zum Umschalten der Bereichs- und Overflowüberprüfung möglich. Weitere Compileroptionen gibt es leider nicht.
Während des Übersetzerlaufs gibt JS-Modula auf dem Bildschirm die Namen der importierten Module und erzeugten Dateien aus. Das System ist eine Implementierung nach der neuesten (dritten) Revision von Modula-2 (siehe Info-Kasten im Bericht über Megamax-Modula in diesem Heft). Daher kann der Compiler den Quelltext in nur einem Durchlauf übersetzen und müßte somit schneller als TDI sein. Zur Einschätzung der Geschwindigkeit habe ich drei Programme durchlaufen lassen (Bild 3). Dabei zeigt sich, daß der Compiler keineswegs optimal programmiert ist und bei größeren Programmierprojekten auf jeden Fall zu langsam wird.
Bei den Tests zeigten sich einige herbe Überraschungen: Das InOut-Modul ist fehlerhaft und die damit com-pilierten Programme führen zum Absturz. Dadurch wird das System leider nur sehr eingeschränkt nutzbar. Ich nehme an, daß es sich um einen Fehler bei der Zusammenstellung des Systems handelt. Weiterhin sind LONGREALs entgegen den Aussagen im Handbuch nicht vorhanden. Ebenso gibt es keine Coroutinen, womit das System nur eine eingeschränkte Implementierung des Modula-2-Sprachumfangs ist. Jefferson Software bietet einen umfangreichen Support an. Auch wird man im Handbuch immer wieder aufgefordert, sich bei Problemen telephonisch oder per Mailbox zu melden. Wahrscheinlich wäre der Fehler in InOut auf diese Weise schnell behoben - für uns Europäer allerdings sehr kostspielig. Updates, über die man bei Registrierung automatisch Nachricht erhält, sind für $ 10 erhältlich.
Der Linker zeigt sich vom Aufruf und den Ausgaben her als dem Compiler ähnlich. Er arbeitet mit zufriedenstellender Geschwindigkeit, kann aber nicht so gut optimieren wie der TDI-Linker.
Die Länge der erzeugten Programme deutet darauf hin, daß der Linker alle Routinen eines Moduls einbindet, auch wenn sie nicht benutzt werden. Bei größeren Programmen kann sich nach meinen Erfahrungen dabei eine Verdoppelung der Programmlänge ergeben.
Bei der Verwendung von zu langen Pfadnamen für die Bibliotheken stürzt der Linker ab. Bei der Installation sollte man das System also möglichst weit oben im Dateibaum plazieren.
Die Library-Module werden größtenteils auch mit Source-Code ausgeliefert. was sehr erfreulich ist und bei TDI in der Commercial-Version teuer zu erkaufen ist. Die Standardmodule sind leider nicht ganz vollständig und teilweise fehlerhaft.
Die systemspezifischen Module für GEM, GEMDOS und BIOS sind etwas zu sehr aufgesplittet, trotzdem aber vollständig und brauchbar. Module für eine automatische Fensterverwaltung oder andere Komfort-Bibliotheken sind leider nicht vorhanden - TDI verkauft sie extra im Toolkit.
Modula-2 Compiler- und Linkerzeiten | |||||||
Nr. | Compilezeit | Linkzeit | Programm große | Programm | |||
JS | TDI | JS | TDI | JS | TDI | ||
1 | 0:17 | 0:20 | 0:20 | 0:19 | 5164 | 5442 | Backtracking |
2 | 0:21 | 0:18 | 0:21 | 0:18 | 5051 | 2244 | Rekursion |
3 | 0:38 | 0:34 | 0:43 | 0:52 | 17537 J | 14332 | größere IMPORTS |
Bild 3: Modula-2 Compiler- und Linkerzeilen
Letztlich entscheidend über die Qualität eines Compilers ist die Effizienz des erzeugten Codes. Dabei steht für die meisten die Geschwindigkeit im Vordergrund. Allerdings ist es sehr schwierig, ein Produkt mit Benchmarks richtig einzuschätzen, da die verwendeten Programme oftmals einseitig testen. Ich habe daher eine ganze Reihe von Geschwindigkeitstests durchgeführt, die auch für zukünftige Modula-2-Besprechungen verwendet werden sollen.
Die Benchmarks umfassen 30 Miniprogramme, die sich jeweils auf einen Teilaspekt konzentrieren. Es gibt Programme, die die Geschwindigkeit der Schleifenkonstrukte testen, die Verarbeitung von Ausdrücken überprüfen und die herauszufinden versuchen, ob der Compiler intelligent optimiert. Gerade durch geschickte Optimierung kann das Compilat Geschwindigkeitssteigerungen erreichen. Denkbar sind Umstellungen der Ausdrücke, Speicherung von Zwischenergebnissen in Registern oder die Errechnung von konstanten Aus- 1 drücken während der Compilierung. Die Ergebnisse dieser Tests sehen Sie 1 in Bild 4. Allerdings muß hierbei I berücksichtigt werden, daß JS-Modula keine Coroutinen kennt, die im allgemeinen einen kleinen Mehraufwand für das Laufzeitsystem bedeuten.
JS-Modula zeigt sich flink bei Schleifenkonstrukten und Parameterübergaben. REPEAT-Schleifen werden anscheinend hervorragend übersetzt. Auch die Auswertung von Expressions geht recht schnell.
Ansonsten ist JS-Modula dem TDI-Compiler ebenbürtig - wenn man von den Fließkommaoperationen absieht. Die sehr schlechte Verarbeitung von einfachen REAL-Operationen verstärkt sich bei der Bibliothek mit höheren Funktionen.
Die erzeugten Programme sind also annehmbar schnell. Die langsamen REAL-Operationen machen den Compiler allerdings für rechenintensive Anwendungen ungeeignet.
Die vorliegende Version kommt mit einem kleinen Handbüchlein mit 26 Seiten. In ihm werden nur die notwendigsten Dinge zu Installation und den Compiler- und Linkeraufrufen beschrieben. Für $ 80 erhält man eine “enhanced version”, die ein ausführlicheres Handbuch mit Listings aller Bibliotheksmodule miteinschließt. Man kann mit dem kleinen Manual arbeiten, sollte sich dann aber alle mitgelieferten Sourcen ausdrucken.
Die Installation ist hervorragend vorbereitet, läuft vollautomatisch und ist problemlos. Die Arbeitsumgebung ist Geschmacksache. Wer GEM-abhängig ist, wird sicherlich die TDI-Umgebung vorziehen. Es lohnt sich aber, die Möglichkeiten des leistungsstarken Guläm (nach Anpassung an die deutsche Tastatur) genauer anzuschauen, da schnellere Turn-Around-Zeiten zu erreichen sind.
Die Fehlerbehebung gestaltet sich umständlich und könnte besser unterstützt werden. Der Compiler selber ist noch zu langsam und eher eine Enttäuschung. auch wenn er seine Aufgabe vom erzeugten Code her gut bewältigt. Das Fehlen des Coroutinen-Konzepts ist ein echter Mangel, zudem es relativ leicht zu implementieren ist. Ebenso ist der Linker simpel implementiert und noch nicht optimal.
Viele kleinere und größere Fehler (InOut-Modul !) verursachen bei JS-Modula den Eindruck, daß bei der Zusammenstellung der Disketten sehr schlampig gearbeitet und nicht korrekt auf Bugs überprüft wurde. Das mag sich in den USA mit einem Telefonat schnell beheben lassen; ohne einen deutschen Vertrieb und Support hat man aber viele Schwierigkeiten. Die Risiken bei einem Kauf im Ausland zeigen sich hier deutlich. Für nur ein Drittel des Preises von TDI erhält man einen Modula-2-Compiler, mit dem man arbeiten kann. Bei sehr vielen Kleinigkeiten werde ich aber das Gefühl nicht los, es mit einem portierten Public-Domain-Compiler oder mit dem Ergebnis eines Universitätskurses über Compilerbau zu tun zu haben.
Bei der zu erwartenden Flut von Modula-Compilern für den ATARI (FTL, Megamax, ETH und andere Implementierungen) wird Jefferson Modula-2 vom Komfort her und in Feinheiten sicher seinen Meister finden, im Preis aber nicht. Trotzdem wäre eine gründliche Überarbeitung angesagt.
Modula-2 Benchmarks | |||||
Nr. | TDI Modul aA2 | JS Modula-2 | testet ... | ||
Min. | Ticks | Min. | Ticks | ||
1 | 0:07 | 1334 | 0:07 | 1489 | Prozeduraufruf |
2 | 1:42 | 20339 | 1:33 | 18548 | Addition |
3 | 1:21 | 16277 | 1:18 | 15518 | Increment |
4 | 1:47 | 21418 | 1:38 | 19634 | Additionsoptimierung |
1 5 | 1:27 | 17311 | 1:23 | 16550 | Increment als Vergleich |
6 | 2:09 | 25835 | 1:57 | 23480 | INTEGER-Addition |
7 | 2:09 | 25833 | 1:57 | 23471 | CARDINAL-Addition |
8 | 1:11 | 14228 | 1:18 | 15543 | FOR-Schleife |
9 | 1:21 | 16278 | 1:02 | 12437 | REPEAT-Schleife |
10 | 1:21 | 16191 | 1:18 | 1552 | WHILE-Schleife |
11 | 1:04 | 12743 | 0:54 | 10791 | INTEGER-Parameter |
12 | 1:04 | 12739 | 0:54 | 10791 | INTEGER VAR-Parameter |
13 | 1:06 | 13130 | 0:59 | 11821 | RECORD-Parameter |
14 | 0:34 | 6755 | 0:30 | 5977 | RECORD VAR-Parameter |
15 | 0:49 | 9837 | 0:49 | 9780 | Konstanten-Optimierung |
16 | 0:51 | 10249 | 0:51 | 10201 | Konstanten-Optimierung |
17 | 1:28 | 17655 | 1:26 | 17171 | Expression-Optimierung |
18 | 1:42 | 16822 | 1:22 | 16354 | Expression-Optimierung |
19 | 0:37 | 7431 | 0:36 | 7102 | Zwischenergebnis-Optimierung |
20 | 0:37 | 7435 | 0:35 | 7099 | Zwischenergebnis-Optimierung |
21 | 0:09 | 1831 | 0:11 | 2154 | IF-Statement |
22 | 0:13 | 2645 | 0:13 | 2688 | IF durch CASE ausgedrückt |
23 | 0:38 | 7689 | 0:33 | 6667 | CASE-Statement |
24 | 0:40 | 7960 | 0:39 | 7804 | CASE durch IF ausgedrückt |
25 | 0:47 | 9441 | 1:03 | 12636 | REAL-Arithmetik |
26 | 2:05 | 24924 | — | — | LONGREAL-Arithmetik |
27 | 1:52 | 22380 | 5:42 | 68358 | REAL-Library |
28 | 1:21 | 16264 | 1:21 | 16135 | String-Library |
29 | 2:10 | 26075 | 2:07 | 25437 | ARRAY-Zugriffe |
30 | 0:09 | 1896 | 0:10 | 2056 | RECORD-Zugriffe |
Alle Zeiten mit time-Kommando von Guläm gemessen
Bild 4: Benchmarks