Compilers / "Dragon Book" - Eigene Scriptsprache

Kriskra

Mitglied
Hallo Alle,

Ich überlege mir das berühmte "Dragon Book" von Aho, Sethi und Ullman, zum Thema Compilerbau zuzulegen. ("Compilers") Da das Buch mit einer Investition von 100€ doch eine Recht große Ausgabe wäre, wollte ich einfach mal Fragen wie ihr das Buch findet? Die, die das Buch kennen bewerten es eigentlich durchweg als "besser gehts kaum", jedoch wollte ich mich vorher mal Informieren.

Zum Hintergrund, ich plane eine eigene kleine Scriptsprache und eben auch den Compiler bzw. den Interpreter dazu zu schreiben. Was ich mir von diesem Buch erhoffe ist einen allgemeinen Einblick in den Compiler/Interpreterbau zu bekommen und ein paar Tipps wie ich z.B. am besten den Code auswerten und bearbeiten kann.

Ich wollte euch einfach mal Fragen, ob ihr Informationen zu diesem Buch habt, bzw. ob ihr mir andere Bücher über das Thema empfehlen könnt... Das Buch hat ja schliesslich auch ein paar Jährchen auf dem Buckel...

Danke schonmal und viele Grüße,
Kriskra

PS: Finde es ein bisschen dumm, wenn ein Post ohne begründung zu einem so sachlich korrekten Thema gelöscht wird... Eine PM, mit dem Grund der Löschung ist doch sicherlich nicht verkehrt, oder?
 
Zuletzt bearbeitet:
Ich hab mir die deutsche Fassung in zwei Teilen gekauft, mit dem selben Ziel: Eine eigene Scriptsprache.

Also das Werk ist Informatik auf Universitätslevel (beinhaltet sogar Übungen). Der Aufbau eines Übersetzers wird sehr gut beschrieben und es werden verschiedene Techniken/Algorithmen zur Implementierung vorgestellt. Im späteren Verlauf wirds allerdings extrem abstrakt / kompliziert, bin selbst nicht mehr mitgekommen.
Obwohl es im Buch um Übersetzer irgendwelcher Sprachen in beliebige Formate geht (also auch Text in Bild --> HTML...) beziehen sich die meisten Abschnitte auf Maschinencode Compiler in C. Interpreter werden zwar am Rande erwähnt aber das Buch wird dir bei der Implementierung der virtuellen Maschine nicht helfen.

Ich konnte nur den ersten Teil über die Analyse einer Sprache gebrauchen. Da meine Scriptsprache sehr laufzeit orientiert ist (keine Typenkontrolle zur Übersetzungszeit, Sprungzielauflösung erst bei der Ausführung) waren nur die ersten 400 Seiten interessant.

Um dieses Defizit auszugleichen hab ich mir dann noch "Build your own .NET language and compiler" gekauft. Das Buch hat praktisch nichts mit .NET compilern zu tun, erklärt aber wunderbar, wie man seine eigene virtuelle Maschine bauen kann. --> Stack orientiert.

Herausgekommen ist meine interpretierte .NET Scriptsprache "Command Script 4".

99-Bottles-of-Beer Beispiel

Was mir auch sehr geholfen hat, waren klare Ziele. Das fängt an mit dem Ziel der Sprache selbst: Wo soll die Sprache eingesetzt werden (Shell, Makros, Web...)? Welche Vorteile soll sie bieten (z.B. besonders elegante Behandlung von Strings...)? Wie dynamisch soll die Sprache sein (Ist es möglich Code während der Ausführung zu generieren/manipulieren?)? usw...

Du wirst während der Implementierung sehr viele Entscheidungen zu treffen haben...

Worum geht es denn bei deiner Sprache? Hast du schon irgendwelche Code-Prototyp-Fetzen? (Ich habe nämlich einfach mal etwas Code geschrieben und dann den passenden Interpreter dazu geschrieben ;-) )
 
Hallo Sunray,

Erstmal danke für deine ausgiebige Antwort. :)

Deine Beschreibung hört sich schonmal recht gut an, das es keine Interpreterbeispiele bzw. Tipps zur Implementierung einer VM gibt, habe ich mir fast gedacht. Da sich meine Fragen jedoch ebenfalls eher auf Grundlegende Dinge beziehen, denke ich das es sich schon lohnt diese Investition zu machen. Oder was meinst du? Das mit den Codebeispielen im Buch hört sich sehr gut an, damit kann man meist am meisten anfangen.


Was mir auch sehr geholfen hat, waren klare Ziele. Das fängt an mit dem Ziel der Sprache selbst: Wo soll die Sprache eingesetzt werden (Shell, Makros, Web...)? Welche Vorteile soll sie bieten (z.B. besonders elegante Behandlung von Strings...)? Wie dynamisch soll die Sprache sein (Ist es möglich Code während der Ausführung zu generieren/manipulieren?)? usw...

Du wirst während der Implementierung sehr viele Entscheidungen zu treffen haben...
Das denke ich auch @Entscheidungen. Da es sich bei meiner Sprache jedoch nicht um eine Vollständige Programmiersprache handeln soll, sondern eher um eine naja "Abgespeckte Makrosprache" die nur einen bestimmten zweck dienen soll, ist das ganze um einiges Einfacher.

Meine Sprache soll in eine von mir geschriebenes Programm implementiert werden. Da tut sich gleich die Frage auf in was für einer Programmiersprache so ein Interpreter zu realisieren ist. Mein Programm ist im moment in einer sehr Hohen Programmiersprache geschrieben (VB), ich denke es würde gehen auch den Interpreter in VB zu schreiben, aber ich denke auch das ich recht schnell an grenzen Stoßen werde. Oder was meinst du? Eine weitere möglichkeit wäre, mein Programm in VB zu belassen und den interpreter in C/C++ zu schreiben. Die dritte und natürlich die möglichkeit die am meisten Aufwand benötigen würde wäre Programm + Interpreter in C/C++...

Hoffe ich konnte dir Aufschluss darauf geben was ich vorhabe.

Danke und Viele Grüße,
Kriskra
 
Kommt ganz darauf an, wie gut du mit C/++ umgehen kannst... Ich beherrsche die Syntax zwar, bin aber ansonsten nicht so der C-Held...

Eine abgespeckte Makrosprache... Also dein Programm soll von der Sprache gesteuert werden können... das heisst: du musst ständig zwischen der "Programm-Welt" und der "Makro-Welt" hin und herwechseln (Programmfunktionen aufrufen / Makrofunktionen aufrufen). Dann gibts da noch die Datentypen... Makrosprachen haben normalerweise dynamische Typen. Was passiert z.B. wenn der Benutzer versucht einen String zu einer Zahl zu addieren? Erscheint eine Fehlermeldung? Wird der String als 0 interpretiert? oder wird die Zahl einfach ans Ende des Strings geschrieben?

Wie werden Listen/Arrays behandelt? Soll deine Sprache Unterfunktionen unterstützen oder werden einfach nur Dateien von 0 bis EOF abgearbeitet?

Wie stellst du die Verbindung zwischen Programm und Makro her? Programmierst du Programmfunktionen einfach hart oder wirst du irgend ein System einbauen, mit dem du VB bzw. C Funktionen direkt aufrufen kannst?

Gerade beim letzten Punkt ist VB klar im Vorteil, weil es sehr schwer ist in C/++ informationen über das eigene Programm zu sammeln (Reflection)....
 
Hallo Sunray,

Wow sehr gute einwände. Das mit der Verbindung zu anderen Programmen ist eigentlich schon geklärt. Anfangs wird es sich sowieso eher um eine Shellsprache handeln, da die Verbindung mit anderen Programmen eher ein optionales Feature sein sollte.

Unterprogramme soll meine Scriptsprache nicht untersützen, wie gesagt das ganze soll echt Basic sein, so das sie auch schnell und einfach erlernt werden kann. Es sollen gewisse Grundfunktionen geboten werden die ich für meine Zwecke benötige, mehr soll dann auch nicht gehen (Schleifen, Abfragen, Arrays, Variablen, Internet Transaktionen, paar Textbearbeitungsfunktionen, das wars auch im Grund genommen). Bei meiner Sprache soll es sich ganz klar nur um eine prozeduale Programmiersprache handeln. Eigentlich beschreibt der Begriff von 4GL meine Programmiersprache nahezu exakt.
Wickipedia hat gesagt.:
eine Programmiersprache, die darauf ausgerichtet ist, für einen bestimmten Anwendungsbereich rasch (d. h. mit möglichst wenigen Code-Zeilen) Funktionen oder komplette Anwendungen schreiben zu können.

Wenn ich fragen darf in was hast du deine Sprache geschrieben? Bist gleich bei Assambly geblieben oder wie? ;-)

Also meinst du eine Scriptsprache in VB zu realisieren ist ganz klar denkbar? Ich bin mir da im jetzigen Zeitpunkt nichma so sicher... Weil gearade wenn ich später Plane auf Threadprogrammierung zurrück zu greifen ist das bei VB nicht gerade eine schöne sache...

@Kentnissen in C/++... naja ich Programmiere fast alles, jedoch zählt C auch nicht gerade zu meinen Lieblingssprachen, ABAP und Java wären ja (Neben VB) meine Favoriten jedoch scheitert das denke ich an den Teschnichen mitteln (@ABAP ;-) ) und an der Geschwindigkeit (@Java ;-) )... Hmm was bleibt dann noch was ich kann... Alles andere ist eher Weborrientiert, PHP, ASP, JSP, Perl... also eher nicht das Perfekte einsatzgebiet. Assambler gehört auch zu den Sprachen die ich behrsche, aber vom Umfang diser Aufgabe schrecke ich von vorne herrein etwas zurrück, gerade was die Kompatibilität angeht.

Danke und Viele Grüße,
KK
 
Meine Sprache (Command Script 4) ist eine "Anwendungskontrollsprache" für .NET 2.0 Programme. Geschrieben in Visual Basic .NET 8.

Ich würde Java nehmen, wegen den Reflection APIs, class loading zur Laufzeit, du kannst deine Sprache ganz leicht um weitere Befehle erweitern...

Ich wage mal zu behaupten, dass du mit C/++ keine signifikanten geschwindigkeits Steigerungen erreichen wirst, dauert höchstens etwas länger bis dus geschrieben hast. Mit der HotSpot Technologie wird Java ja schliesslich in Maschinencode kompiliert und direkt im Prozessor ausgeführt. Das sollte also kein Problem darstellen...
Eines muss man C/++ aber lassen: richtig programmiert verbraucht es weniger Speicher als Java mit der Garbage Collection.

Assembler... hm... ist mir zu nahe an der Hardware um ehrlich zu sein...

Hast du dir schon überlegt, wie deine Scriptsprache aussehen soll (etwas Quellcode?) und wie die virtuelle Maschine genau funktioniert bzw. welche Zwischensprache sie interpretiert? Oder willst du auf eine VM verzichten und deine Scriptsprache gleich während dem Übersetzen ausführen? Könnte in deinem Fall eine gute Alternative sein...
Kompliziert wird dieser Ansatz dann bei der Übersetzung von Kontrollstrukturen.

Bei mir wäre das ziemlich im Weg gewesen, da vergleichsweise Häufig "herumspringe"
 
Hi Sunray,

Das mit dem Direkten ausführen hab ich mir auch überlegt ich denke auch das ich das so realisieren werde. Schon wegen der einfachheit ist eine direkte Ausführung nach der Interpretation um einiges einfacher denke ich. Ich denke eine eigene VM ist für diesen Einsatz zu viel des guten...

Ich denke ich habe mich entschieden, ich bleibe bei VB...

Ein codebeispiel *hmm* dazu muss ich mir Zeit nehmen, da ich morgen wieder um 6.30 raus muss is das jetzt etwas zu knapp von der zeit :p

Aber denke morgen abend kann ich damit mal dienen, mal schaun :)

Aber um ma zurück zum Thema zu kommen, denkst du das sich das Dragons Book lohnt? Und wenn ja, Englisch oder Deutsch?

Viele Grüße,
KK
 
Aus finanzieller Sicht, würde ich das Deutsche empfehlen, da dieses in zwei Bänden erschienen ist und du nur das erste kaufen müsstest. Band 2 enthält dann alles von der "Zwischencode Generierung" über "Optimierung" bis hin zur "Code Synthese", was du alles nicht benötigst.

Etwas hab ich noch vergessen: Für C gibt es Compiler/Parser Bau Tools, für VB nicht.

lexx und yacc sind die wichtigsten. Mit lexx kannst du alle Symbole, die in deiner Sprache vorkommen als Reguläre Ausdrücke definieren. lexx generiert dann entsprechenden C Code. Diese Symbole können dann mit einer kontext freien Grammatik (der Definition der Sprache, also z.B. dass ein [Ausdruck = Ausdruck "+" Ausdruck] sein kann...) an yacc weitergegeben werden und dieser generiert dann ganz viele Funktionen.

Also wirst du z.B. eine Funktion für die Addition bekommen, eine für die Subtraktion usw... Ich denke, das könnte fast noch einfacher sein als VB...

Falls du das ganze doch in VB machen willst, auch ok: du hast etwas mehr Kontrolle über den Aufbau deines Übersetzers.

Beim Designen einer Sprache hab ich gelernt: mehr Sonderzeichen (.:,?!$) beduten effektiveres Arbeiten, aber schlechter lesbaren code, Mehr Schlüsselwörter bewirken das Gegenteil:
Code:
$gu
gu=14.6;
$fu=gu+1;

!openwindow "MyWindow", fu, 0;

?(fu > 77)
   !print "Fu is small";
?(){
   fu -= 15;
   !print "Fu is now smaller";
}
oder
Code:
define	gu
set gu to 14.6
define	fu as gu plus 1

execute	openwindow "MyWindow" and fu and 0

if fu greater-than 77 then
   execute print "Fu is small"
otherwise
   subtract 15 from fu
   execute print "Fu is now smaller"
end
Beide Sprachen können genau das selbe während die erste stark auf Sonderzeichen setzt und damit auch nahe an bestehende Sprachen kommt, ist die zweite selbst für absolute programmier Anfänger "einigermassen" lesbar.
Mir wäre jetzt die erste Version sympatischer, weils weniger zu tippen gibt, aber Anfänger werden vielleicht mehr Mühe haben, Sonderzeichen mit bestimmten Bedeutungen zu assoziieren als sinnvolle Wörter

Diese Sprachen verlangen die Deklaration von Variablen aber vielleicht ist es für eine einfache Makrosprache angebrachter, Variablen automatisch zu erstellen, wenn sie bebötigt werden wie in PHP oder Ruby.

Was ich etwas gefährlich finde, ist das "Klonen" existierender Sprachen, weil der Benutzer dann auch erwartet, dass sie sich überall auch wie die Originalsprache verhält. Z.B. Die Zahl 0 als Boolean:false zu interpretieren wie in C/++ und damit auch PHP... Ruby hingegen wertet 0 als Boolean:true...
 
Hi Sunray,

Ich finds toll das du dir so viel Zeit für mich nimmst.

Bevor ich dir heute Abend mal das richtige Codebeipiel schicke, erstmal zu deinem Code.

Ich dachte auf jedenfall an ein Zwischending. Klar ist es einfacher Sonderzeichen auszuwerten als Wörter, klar weil sie nicht so oft vorkommen, jedoch ist es für meine sprache obligatorisch.

Ich dachte da an sowas: (Print solls garnich geben, hat einfach den Grund das es keine Log im Programm gibt, dafür kann man einen Status setzen)
Code:
$gu = 14.6;
$fu = $gu+1;

if ($fu > 77) then
   set_state("Fu is small");
else
   $fu = $fu - 15;
   set_state("Fu is now smaller");
endif
Hmm meine Scriptsprache mit Skalaren zu machen ist keine schlechte idee. In VB wäre das ja eigentlich ganz leicht mit Variants abbildbar.

Vielen Dank und Grüße,
Kriskra
 
Der Aufwand ist für den Übersetzer genau gleich gross, ob du jetzt Wörter oder Zeichen nimmst --> Am Ende der ersten Phase hast du nur noch Symbole. Wie diese Symbole zustande gekommen sind ist nicht wichtig... ;)

Noch was: Zeilenumbrüche. Windows = CR LF, Linux = LF, MacOS Classic = CR...
Falls dein Programm in irgend einer Form HTML (oder irgend ein textbasiertes WWW-Format) generieren sollte, müsstest du darauf achten, die CRs herauszufiltern.

Um auf Nummer sicher zu gehen würde ich das Ende der Zeile über LF definieren, dann können auch Scripts eingelesen werden, die mit einem "Linux-Editor" geschrieben wurden...
 

Neue Beiträge

Zurück