Kentnisse mit Compilerbau erweitern



  • Servus,

    ich studiere zur Zeit MB BA und habe auf Grund meiner Vorkenntnisse viel Freizeit. Ich möchte diese nutzen, um die Kenntnisse in einem Hobby zu erweitern. Über 10 Jahren programmiere ich kleinere Tools und Programme. Das letzte Projekt war eine CAD-Viewer für ein ERP-System. Das Hobby entdeckte ich beim erstellen meiner Homepage und habe folgenden Weg eingeschlagen JavaScript -> PHP -> Python -> Java, C++ (die letzten beiden seit ca. 6 Jahren).

    Nun würde ich gerne hinter die Kulissen schauen und mich tiefer in die Thematik einarbeiten. Mein erster Gedanke war, bastle dir eine Programmiersprache + Compiler und du siehst alles.

    Programmiersprache:
    Der Syntax ist so einfach wie nur möglich gestaltet (c, c++ und co sind zu komplex für den Einstieg 😉 ) und steht schon auf einem Blatt - Papier 🙂

    Compiler:
    Es gibt im Web einige Anleitungen zum Bau eines Compiler und auf der MSDN sogar ein Webcast für die .Net Plattform (Z#). Diese benutzen entweder einen C++-Compiler, .Net oder Java im Hintergrund. Und genau das gefällt mir nicht.

    Ich würde gerne das Rad neu erfinden und alles selber machen 🙂 Für mich ergeben sich zwei Fälle:
    - Die Sprache wird in Assembler übersetzt und hieraus der Code erzeugt
    - Direkte Codeerzeugung ohne Umwege

    So und genau hier hackt es bei mir. Ich habe keinen blasen schiemer, wie die Bibliotheken (dll, lib, so, ...) aufgebaut sind. Für den Compiler muss ich wahrscheinlich auf eine fremde Sprache zurück greifen, oder gibt es eine Möglichkeit den Compiler gleich in der neuen Programmiersprache zu bauen?

    Aufgabenstellung:
    - Einen Speicherbereich für zwei Integervariable reservieren und einen Wert zuweisen
    - Speicherbereich für eine dritte Variable (Gleitkommazahl) reservieren
    - Eine Funktion aufrufen, die als Ergebnis den Quotienten von zwei Zahlen (1) zurück gibt und in der Variable (2) speichert
    - Diesen Wert im DOS-Fenster bzw. Shell ausgeben

    Fragen:
    - Wie sehen die modernen Bibliotheken im inneren aus?
    - Was muss eine Bibliothek enthalten, damit sie ausführbar ist?
    - Wie funktioniert das Linken von Bibliotheken und woher weiß man die Einstiegspunkte?

    - Kann der erste Compiler gleich mit der neuen Programmiersprache erstellt werden oder muss ich diesen z.b. in C++ erstellen?
    - Wie funktioniert das Linken von Bibliotheken und woher weiß man die Einstiegspunkte?
    - Sehen die statische bzw dynamische Bibliotheken im inneren gleich aus?

    - Wer weiß eine gute Lektüre zu dem Thema Assembler?

    Gruß
    Thomas



  • Der erste Schritt waere einen Interpreter zu schreiben ...



  • jep das ist für den anfang genau das richtige. Ich habe dafür ein paar versuche gebraucht, bis ein brauchbares ergebnis rauskam. Dabei lernst du gut, wie du einen string parsen kannst.



  • Siassei schrieb:

    MB BA

    Tut nichts zur Sache, aber heißt das Maschinenbau Berufsakademie?

    Compiler:
    Es gibt im Web einige Anleitungen zum Bau eines Compiler und auf der MSDN sogar ein Webcast für die .Net Plattform (Z#). Diese benutzen entweder einen C++-Compiler, .Net oder Java im Hintergrund. Und genau das gefällt mir nicht.

    Ich würde gerne das Rad neu erfinden und alles selber machen 🙂

    Du siehst das IMO etwas zu sehr schwarz-weiß. Ein Compiler besteht in der Regel aus Frontend, also aus dem Teil, der das Quellprogramm einliest, analysiert und in irgendeiner gut handhabbaren Zwischensprache darstellt, und Backend, dem Teil, der den Zwischencode optimiert und letztlich Code für die Zielmaschine generiert. Es ist schon ein ziemliches Projekt, ein vernünftiges Frontend auf die Beine zu stellen, das sollte man nicht unterschätzen. Wenn du das Backend für den Anfang erstmal auf z.B. C als Zielsprache ausrichtest, hast du schon gut zu tun. Wenn das erstmal funktioniert, kannst du dich immer noch mit der Codeerzeugung beschäftigen.

    Für den Compiler muss ich wahrscheinlich auf eine fremde Sprache zurück greifen, oder gibt es eine Möglichkeit den Compiler gleich in der neuen Programmiersprache zu bauen?

    Natürlich gibt es die. Du müsstest ihn dann von Hand in Maschinensprache übersetzen. Der erste LISP-Compiler ist m.W. so entstanden. Ob man das heute noch machen sollte ist allerdings eine Frage, die ich mir dringend stellen würde 😉



  • Servus,

    danke für eure Antworten 🙂

    Bashar schrieb:

    Siassei schrieb:

    MB BA

    Tut nichts zur Sache, aber heißt das Maschinenbau Berufsakademie?

    Keine Ahnung 🙄
    MB ist die Abkürzung für Maschinenbau
    und BA für Bechalor

    BA benutzen alle mir bekannten HS, TU und Universitäten
    MA für Master
    MB ist im Fachbereich üblich.
    Aber das ist sowieso egal 😉

    Falls ich mich irre, sag bescheid. Ich erweitere gern mein Wissen 😃

    Bashar schrieb:

    Du siehst das IMO etwas zu sehr schwarz-weiß. Ein Compiler besteht in der Regel aus

    Eins nach dem anderen und ich möchte ja nicht eine neue Programmiersprache schreiben, sondern nur eine einfach, mit der ich alle Bereich durchgehen möchte. Selbst C ist hierfür zu komplex für eine einzelne Person.

    Bashar schrieb:

    Natürlich gibt es die. Du müsstest ihn dann von Hand in Maschinensprache übersetzen. Der erste LISP-Compiler ist m.W. so entstanden. Ob man das heute noch machen sollte ist allerdings eine Frage, die ich mir dringend stellen würde 😉

    Geil. Hatten die Entwickler der ersten Compiler auch ein Privatleben? 😉
    Ich dachte da an C++, C# oder Java. C# scheidet aus, da es nur auf MS-Plattformen läuft und das Mono-Project noch gans schön Buggy (schreibt man das so?) ist. Werd es wahrscheinlich mit C/C++ auf MS VC und GCC umsetzen.

    Ein Interpreter wird wohl das Vernünftigste sein und da hat sich im Laufe des Tages ein kleines Problem ergeben 🙂 Mit Sicherheit gibt es eine triviale Lösung, aber irgendwie komme ich nicht drauf.

    Es gibt die sogenannten atomaren Datentypen für z.B. den primitiven Typen. Wie setzt man so etwas um? Bei einem 32bit System sehe ich für byte, short und int kein Problem. Da die Operationen + und - auf jedem Fall in einem Takt durchgeführt werden können. Aber wie wird das z.B. für long gelöst?

    Gruß,
    Thomas



  • Bashar schrieb:

    Du müsstest ihn dann von Hand in Maschinensprache übersetzen. Der erste LISP-Compiler ist m.W. so entstanden.

    nicht ganz.
    teile des ersten interpreters waren in maschinensprache.
    http://www-formal.stanford.edu/jmc/history/lisp/node3.html
    der lisp-interpreter selber war dann schon zum teil in lisp.
    und der erste lisp-compiler wurde sicherlich ganz in lisp gemacht.



  • Siassei schrieb:

    und BA für Bechalor

    Aha.

    BA benutzen alle mir bekannten HS, TU und Universitäten
    MA für Master

    Komisch, die mir bekannten sagen B.Sc. für Bachelor of Science und B.A. für Bachelor of Arts, aber egal ...

    Bashar schrieb:

    Du siehst das IMO etwas zu sehr schwarz-weiß. Ein Compiler besteht in der Regel aus

    Eins nach dem anderen und ich möchte ja nicht eine neue Programmiersprache schreiben, sondern nur eine einfach, mit der ich alle Bereich durchgehen möchte. Selbst C ist hierfür zu komplex für eine einzelne Person.

    Ich habe von C als Zielsprache gesprochen. Deine Sprache geht rein, Compiler werkelt, C-Code kommt raus.

    Es gibt die sogenannten atomaren Datentypen für z.B. den primitiven Typen. Wie setzt man so etwas um? Bei einem 32bit System sehe ich für byte, short und int kein Problem. Da die Operationen + und - auf jedem Fall in einem Takt durchgeführt werden können. Aber wie wird das z.B. für long gelöst?

    Wenn es dir zuviel Arbeit ist, sowas rauszukriegen, dann bau doch eine Sprache ohne longs.


Anmelden zum Antworten