home *** CD-ROM | disk | FTP | other *** search
-
- PASCOMP
-
- PASCAL baut einen Pascal-Compiler!
-
- Wollen Sie nun, nach dem wir Ihnen auf wenigen Seiten komprimiert
- einen Einblick in das Übersetzen von Programmiersprachen ver-
- schafft haben, ganz genau wissen, wie Ihr Compiler aus Ihren Pro-
- grammtexten eine für den Computer verständliche Angelegenheit
- macht? Was für eine Arbeit er beim "dolmetschen" zwischen Ihnen
- und Ihrem Rechner zu leisten hat? Welcher Mittel und Strategien
- er sich dabei bedienen kann, um Sie mit einem "optimalen" Ergeb-
- nis zufrieden zu stellen? Dann verfol gen Sie einfach den Bau von
- "PASCOMP", unserem Pascal-Compiler, programmiert in Pascal!
-
- Bevor wir aber ab der nächsten Ausgabe ausführlich zur Sache ge-
- hen und anfangen, Ihren Pascal-Programmen gegenüber handgreiflich
- zu werden, sollen unsere neue Serie und "PASCOMP" ersteinmal vor-
- gestellt werden: Wie ist "PASCOMP" entstanden, was kann er und
- was kann man mit ihm machen und - weshalb die Serie?
-
- Fangen wir bei letzterem an! Sicherlich sind Ihnen Begriffe wie
- "Einpass-" bzw. "Zweipass-Compiler", "linkfähig", "optimierend",
- "Native-" und "P-Code" etc. beim Studium von Tests und Werbean-
- zeigen schon in genügender Zahl untergekommen. Was verbirgt sich
- hinter diesen Techniken und welche Vor- und Nachteile bringen
- diese für den Programmierer mit sich?
-
- Die Klärung solcher Fragen ist ein Grund - es gibt aber noch ei-
- nen anderen: Die Erlernung von Programmiertechniken, die bei wei-
- tem nicht nur in Compilern, sondern vor allen Dingen auch in all-
- täglichen Programmen ihre Verwendung finden. Denn es reicht ein-
- fach nicht mehr aus, sich mit Spielen und Joystickübungen schein-
- bar einen Einblick in die Computerei zu verschaffen.
-
- Gerade die immer größer werdende Differenz zwischen Hardwareent-
- wicklung und Rückständigkeit der Versorgung der Hardware mit an-
- gemessenen Programmen zwingt jeden ernsthaft Interessierten, sich
- ständig mit neuen, meist in Fachchinesisch verschlüsselten Veröf-
- fentlichungen zu beschäftigen. Um das stundenlange Wühlen in sol-
- cher Literatur zu vermeiden, zieht der "Otto-Normal"-Verbraucher
- Fachzeitschriften zu Rate, die ihm oftmals den Einblick in den
- gewünschten Bereich ermöglichen.
-
- Und dies soll anhand des Baus von "PASCOMP" geschehen, obwohl
- mittlerweile Pascal-Compiler für (fast) jeden Rechner, welcher
- Größe auch immer, existieren. Wir werden uns nämlich nicht nur
- auf die Beschreibung der in ihm angewanden Verfahren beschränken,
- sondern auch andere, vielleicht elegantere Vorgehensweisen
- aufzeigen. Hier erhoffen wir uns auch ein reges Echo von Ihrer
- Seite, am liebsten in Form von kreativer Kritik, Vorschlägen und
- Anregungen zu "PASCOMP"!
-
- Und hier zur Vorbereitung und Erbauung die Aufteilung der
- kompletten Serie, die Sie stückchenweise mit dem Komplex
- Compilerbau vertraut machen wird:
-
- - Einführung und Grundlagen zum Compilerbau.
-
- - Lexikalische Analyse
-
- - Parsing und semantische Analyse
-
- - P-Code-Erzeugung
-
- - P-Code-Interpreter
-
- - Optimierungen
-
- - Erweiterungen
-
-
- Was ist "PASCOMP"
-
- Im Gegensatz zu anderen Veröffentlichungen wurde bei "PASCOMP"
- keine Teilmenge der Programmiersprache Pascal, sondern der volle
- Sprachumfang zur Grundlage der Implementierung gemacht. Wie
- eigentlich bei den meisten populären Programmi ersprache gibt es
- auch von Pascal verschiedene Dialekte. Fast jeder
- Compilerhersteller schafft seinen eigenen, in dem er den Pascal-
- Standard um nützliche Konzepte erweitert. Probleme treten nicht
- auf, solange man sich als Anwender mit einem speziellen Dialekt
- beschäftigt. Daß diese sich aber häufen, wenn man es sich zur
- Aufgabe gemacht hat, eine Sprache publik zu machen, die trotz
- Standard eigentlich nur aus Dialekten besteht, ist nicht
- verwunderlich. Die Leserbriefe einer jeden PASCAL-Ausgabe
- dokumentieren dies "par excellence" (Programm A läuft mit
- Compiler B, aber nicht mit Compiler C oder nur manchmal oder nur
- unter den Bedingungen x,y,z).
-
- Abhilfe schaffen da zwei mögliche Lösungen:
-
- 1. Es gibt nur eine 'Hochsprache' und keinen Dialekt. Dann tritt
- aber eine neue Problemstellung auf: Existiert überhaupt eine
- effiziente Implementierung eines Algorithmus ohne Verwendung von
- Non-Standards (Graphik, Strings, Systemvariablen ade!).
-
- 2. Wenn schon Dialekt, dann einen eigenen, erweiter- und
- anpassbaren. Und diese Forderung benötigt einen frei zugänglichen
- Quellcode des Compilers.
-
- Desweiteren sollen "PASCOMP" und die von ihm übersetzten
- Programme auf möglichst vielen Rechnern einsatzfähig sein. Aus
- diesem Grund wird unser Compiler innerhalb der Serie einen
- Pseudo-Code (P-Code) erzeugen, der von einem Interpreter, der
- wiederum in Standard-Pascal verfaßt und somit auch nur irgend
- einen Pascal-Compiler auf irgendeinem Rechner vorraussetzt,
- ausgeführt wird. Doch wollen wir hier nun nicht weiter der Serie
- vorweggreifen, sondern noch aufzeigen, unter welchen Bedingungen
- "PASCOMP" entstanden ist - und mit welchen Wiedrigkeiten dabei zu
- kämpfen war.
-
-
- Wie "PASCOMP" entstand:
-
- Am Anfang war der gute Wille ....
-
- Um einen Eindruck von der Entstehung des Compilers zu gewinnen,
- sei hier ganz kurz die Geschichte des Pascal-Compilers erzählt :
-
- Irgendwann im August 1986 stand es fest: "PASCOMP", ein Pascal-
- Compiler, wird gebaut. Hilfsmittel: ein Atari ST (1 MB), ST-
- Pascal von CCD, Programmtools und ein Berg von Compilerliteratur.
-
- Wunsch war es, einen 1-Pass-Pascal-Compiler mit Native-Code- Er-
- zeugung zu konstruieren (wie gesagt, das "Fachchinesisch" erklärt
- die Serie). Schon sehr bald wurde deutlich, daß diese Zielsetzung
- unter den bestehenden Voraussetzungen (vor allen Dingen die feh-
- lende Zeit für Portierungen) zu hoch gegriffen war. Das Problem
- mußte irgendwie 'zerteilt' werden. Modularisierung war angesagt.
- Um die Code-Erzeugung zu vereinfachen, sollte jetzt auf eine Zwi-
- schensprache (P-Code, Pseudo-Code) hin compiliert werden.
-
- So ausgerüstet, mit guter Laune und vielen Ideen, wurde die
- Implementierung im September 1986 gestartet. Die Hardware- und
- Softwarekonfiguration erwies sich dabei als sehr brauchbar. Die
- "turn-around"-Zeiten (editieren, compilieren, linken, testen und
- wieder editieren) in der Entwicklung betrugen selbst beim fast
- fertigem Compiler (ca. 5000 Pascal-Zeilen) nicht wesentlich
- länger als 30 Sekunden. Dabei wurde natürlich das
- Modularisierungskonzept von ST Pascal verwendet. Langeweile -
- oder das unstillbare Bedürfnis des Programmierers nach einer
- Tasse Kaffee, traten zwischen zwei Übersetzungsvorgängen somit
- fast gar nicht auf (mit Ausnahme einiger Krisensituationen!).
-
- Nach etwa dreimonatiger Programmiererei und Auseinandersetzung
- mit dem P-Code war es Anfang Dezember 1986 endlich soweit, ein
- "Programm" mit dem "eigenen" Compiler zu übersetzen. Reiflich
- überlegt und allen 'hello world'-Programmen zum Trotz wurde es
- eingetippt:
-
- program test;
- begin
- writeln('the big brown fox jumps',
- ' over the lazy dog')
- end.
-
- Abgespeichert, übersetzt -fertig. Der P-Code stand. Was nun? Ein
- Interpreter für diesen Code mußte her. Also schnell einen
- "zusammengebaut" (natürlich nur einen für das spezielle
- Programm!).
-
- Eingetippt, abgespeichert, übersetzt - Start. Und siehe da, da
- stand's auf dem Monitor:
- "the big brown fox jumps over the lazy dog"
-
- Die Begeisterung über diesen Erfolg war so groß, daß die gegen
- unendlich strebenden Systembomben des Atari ST, die einen
- fürchterlichen Systemabsturz am Ende des Programms
- signalisierten, einfach ignoriert wurden. War es doch ein Anfang
- gewesen .....
-
- Nun ja, es kam 1987. Neues Jahr, neues Glück. In zahlreichen
- Testprogrammen wurde der Compiler soweit verbessert, daß es
- durchaus einmal vorkam, daß ein korrektes Pascalprogramm auch
- korrekt übersetzt wurde. Der Ruf nach einem P-Code-Interpreter
- oder einem P-Code-Transformer wurde laut. Die Entscheidung fiel
- zuerst zugunsten des Transformers. Unter Zuhilfenahme von DRI-
- Assembler, Debugger, Linker und STPascalbibliotheken war es
- relativ einfach, den P-Code in ein ausführbares 68000er-Programm
- zu überführen.
-
- Nachteilig wirkten sich jedoch jetzt folgende Tatsachen aus:
- Wurden früher zwei Schritte bis zum fertigen Programm benötigt
- (Übersetzung und Interpretation), so sah der Vorgang jetzt
- folgendermaßen aus:
-
- 1. Übersetzen des Programms (wie gehabt). Ausgabe war eine P-
- Code-Folge.
-
- 2. Starten des P-Code-Transformers. Dieser formte den P-Code in
- entsprechenden M-68000-Assembler-Text um.
-
- 3. Starten des Assemblers.
-
- 4. Zusammenbinden des fertigen Programms mit Hilfe von
- vorgegebenen Standardbibliotheken.
-
- Die "turn-around"-Zeiten betrugen selbst bei kleineren Programmen
- mehrere Minuten - und der erzeugte M-68000-Text belegte nicht
- selten bei 50-100 Zeilern bis zu 20 KB, so daß die auf 660 KB
- angelegte Ram-Disk (ca. 60 KB frei) regelmäig im Assemblerpass
- überlief und ein effizientes Austesten nicht mehr uneingeschränkt
- möglich war.
-
- Was jetzt?
-
- Zwei Lösungen boten sich an:
-
- a) Aus dem P-Code wird direkt linkfähiger Objektcode fabriziert.
- Der Assemblerpass wird dann überflüssig und die Erzeugung von
- platzverschlingendem M-68000-Text wird vermieden. Die "turn-
- around"-Zeiten würden sich erheblich reduzieren. Wurde doch
- die meiste Zeit im Assembler "verbraten"....
-
- b) Konstruktion eines kompletten P-Code-Interpreters. Die Vortei-
- le liegen klar auf der Hand:
-
- - kürzere "turn-around"-Zeiten
-
- - größere Flexibilität gegenüber Veränderungen im Compiler (*)
-
- - Maschinenunabhängigkeit (*)
-
- - einfache Implementierung (*)
-
- - größere "Absturzsicherheit". Leichte Implementierung von "post
- mortem dumps"
-
- und die Nachteile ...
-
- - geringere Ausführungsgeschwindigkeit
-
- - weniger Speicherplatz.
-
- Trotz der Nachteile fiel die Entscheidung zugunsten des
- Interpreters aus. Besonders die mit (*) gekennzeichneten Punkte
- trugen entscheidend zur Wahl bei: Ziel des Ganzen soll in erster
- Linie die Vermittlung des Grundwissens für den Bau eines
- Compilers anhand einer Programmiersprache sein - und nicht deren
- supereffiziente Implementierung.
-
- Und dies ist der aktuelle Stand: Es gibt also einen Pascal-
- Compiler mit P-Code-Interpreter, programmiert in Standard-Pascal
- und somit für jeden interessant, der zwar schon einen Pascal-
- Compiler hat, aber sich für dessen "Innerei" interessiert.
- Natürlich hat er zum gegebenen Zeitpunkt noch seine (kleinen)
- Macken (wie könnte es auch anders sein!).
-
- Das eine Veröffentlichung der kompletten Quelltexte des
- lauffähigen Compilers innerhalb einer Zeitschrift wenig Sinn
- macht, dürfte Ihnen sicherlich einleuchten. Wer möchte schon ca.
- 120 kB Programmtext "eintippen". Innerhalb der Serie werde n
- deshalb nur die relevanten Teile zur Förderung des Verständisses
- der verbalen Beschreibung in gedruckter Form erscheinen. Das
- gesamte "Ding" wird es dagegen komplett auf der PASCAL-DATABOX
- geben, wenn es ernst wird: zum Thema der Codeerzeugung.
-
- Aber auch dann wird der Compiler sicherlich noch den ein oder
- anderen 'Bug' enthalten. Dann wird auch, wie gesagt, die
- Leserschaft aufgerufen sein, mit kreativer Kritik, Vorschlägen
- und Anregungen zum Themengebiet Compilerbau sowie zum Pascal-
- Compiler "PASCOMP" Stellung zu nehmen.
-
- Nach diesem kleinen Vorgeschmack geht's dann in der nächsten Fol-
- ge mit dem Thema 'Einführung und Grundlagen zum Compilerbau' los.
- (Johannes Velmans/mc)
-