Programmiersprache Entwicklen



  • Tag Leute,
    ich will eine Programmiersprache entwickeln und würde gerne zur JVM oder zu Assembler kompilieren.
    Zum Thema Compilerbau gibt es viel, leider gibt es fast gar keine Infos wie man zur JVM oder Assembler kompiliert. Es gibt einen Artikel den ich gegoogelt habe, welcher die Codegenerierung zur JVM beschreibt
    http://teajay.org/TeaJay.pdf.

    Der ganze Vorgang der Codegenerierung ist für mich nicht verständlich und hoffe hier ein paar Erklärungen zu bekommen.

    Grüße,



  • Das Frontend eines Compilers ist häufig schwieriger zu entwickeln als das Backend.
    Daher erzeuge am besten zuersteinmal einfach Java- bzw. Assembler-Code ("Mnemonics") und laß anschließend noch den Java-Compiler bzw. den passenden Assembler darüberlaufen, der dann die finalen Java-Dateien (.class) bzw. den Binärcode erzeugt.

    Packe die Codegenerierung in eine eigene Klasse (bzw. Modul), so daß du diese dann später noch austauschen bzw. erweitern kannst.

    PS: Um was für eine Sprache handelt es sich denn?



  • Wie meinst du das, das Frontend ist schwieriger zu entwickeln als das Backend?

    Ich möchte eine Sprache ähnlich zu Java entwickeln!

    Aber ich verstehe dich nicht, meinst du ich soll nach Java kompilieren und dann den Java Compiler nutzen ?



  • Java Source Code/.java -(Compile)-> Java Bytecode/.class -(Compile/JIT/JVM)-> Machine Code

    -Frontend:
    Transformiert Quellcode in eine Baumstruktur

    -Backend:
    Generiert aus der Baumstruktur Zielcode (sei es native oder eine weitere Sprache)

    Aber stelle doch eine konkrete Frage...



  • Also meine Frage lautet einfach nur,
    wie kann man Assembler oder Bytecode aus Quellcode generieren.
    Wie muss ich da vor gehen. Der Artikel beschreibt es so,
    Grammatik erstellen dann Parsen und dann Code generieren.
    Mir ist der Weg aber nicht klar.

    Gerade wenn ich mir C++ anschaue kann ich mir nicht vorstellen, dass dies so kompliziert ist wie beschrieben.


  • Mod

    LeaD2017 schrieb:

    Gerade wenn ich mir C++ anschaue kann ich mir nicht vorstellen, dass dies so kompliziert ist wie beschrieben.

    😮 C++ ist eine der am kompliziertesten zu übersetzenden Sprachen überhaupt, weil die Grammatik und damit das Parsen sehr kompliziert ist.

    Aber ich verstehe deinen Einwand überhaupt nicht. Grammatik, Parsen, Generieren. Das sind doch ganz allgemeine Begriffe, die man beliebig kompliziert oder unkompliziert machen kann, je nachdem wie die Sprache aussehen soll. An welcher Stelle möchtest du denn noch weiter vereinfachen?


  • Mod

    Gute Hinweise auf die technische "dazwischen"-Seite kann man u.a. bei Wirth finden:
    http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
    (wenn der Link nicht geht - Niklaus Wirth, Wiki, Compilerbau usw.)

    Ein weiterer guter, bzw. lesenswerter Text in dieser Richtung ist das Tutorial "Write Yourself a Scheme in 48 Hours"

    Wenn man kein Informatik-Studium im Hintergrund hat, oder/und auch kein Lisp/Emacs-Profi ist, dann geht Herumprobieren mit möglichst einfachen Zahlen Codebeispielen in der einfachsten (Lieblings-,Standard-) Programmiersprache.

    Der Vorteil hier ist: es gibt normalerweise eine hilfreiche Library, die kann man nutzen, oder erweitern, sich einfach so genauer anschauen oder im Disassembler angucken uvm.

    Ein ziemlich einfacher Übersetzer ist z.B. ein Morse-Code-Generator.
    Etwas fortgeschrittener wäre z.B ein Html-Code-Generator.
    Noch etwas weiter, und du bist schon bei Javascript.
    Eh du dich versiehst, bist du im grünen Bereich, kannst Stack Overflow nutzen
    http://stackoverflow.com/questions/8819846/how-is-javascript-translated-to-bytecode
    oder auch deutsche Quellen
    https://www.golem.de/news/webassembly-browserhersteller-wollen-einheitlichen-bytecode-fuers-web-1506-114745.html



  • Gute Hinweise auf die technische "dazwischen"-Seite kann man u.a. bei Wirth finden:
    http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
    (wenn der Link nicht geht - Niklaus Wirth, Wiki, Compilerbau usw.)

    👍
    Liegt bei mir daheim als Buch herum. Absolut empehlenswert!

    Ansonsten gibt es hier im Forum ein gutes Tutorial, wie man ein Frontend für einen Compiler baut. Hier handelt es sich "nur" um einen Taschenrechner, aber wenn man erstmal kapiert hat, wie man mathematische Formeln parst, dann ist es nicht mehr weit zu einer einfachen Programmiersprache (mit Variablen, if/else/while u.ä.).
    Vor allem das Konzept des Syntaxbaums musst du versuchen zu verstehen.

    https://www.c-plusplus.net/forum/268247

    @mods: kann einer der Mods die Fehler in dem oben genannten Beitrag korrigieren? Irgendwas ist da mit den Forum-Tags falsch, z.B.: [b ]Alternative[/b ] |
    In den Codetags scheint das [b ] nicht zu funktionieren, es stört somit aber den Lesefluss. Wäre schade um den schönen Artikel.


  • Mod

    fsdfsdsfs schrieb:

    @mods: kann einer der Mods die Fehler in dem oben genannten Beitrag korrigieren? Irgendwas ist da mit den Forum-Tags falsch, z.B.: [b ]Alternative[/b ] |
    In den Codetags scheint das [b ] nicht zu funktionieren, es stört somit aber den Lesefluss. Wäre schade um den schönen Artikel.

    Ich habe es mal vorgemerkt. Ist aber viel Arbeit, daher kann ich es nicht sofort machen. Ich glaube, Fettdruck in Codetags geht schon lange nicht mehr.



  • SeppJ schrieb:

    fsdfsdsfs schrieb:

    @mods: kann einer der Mods die Fehler in dem oben genannten Beitrag korrigieren? Irgendwas ist da mit den Forum-Tags falsch, z.B.: [b ]Alternative[/b ] |
    In den Codetags scheint das [b ] nicht zu funktionieren, es stört somit aber den Lesefluss. Wäre schade um den schönen Artikel.

    Ich habe es mal vorgemerkt. Ist aber viel Arbeit, daher kann ich es nicht sofort machen. Ich glaube, Fettdruck in Codetags geht schon lange nicht mehr.

    danke 👍



  • ich denke Small-C ist das trivialste was du dir als compiler anschauen koenntest. Es befolgt nicht wirklich tolle konzepte usw. sondern ist wirklich das minimale was benoetigt wird um aus c source code assembler zu generieren.

    wenn du das erstmal kannst, kannst du darauf aufbauend etwas objektorientiertes versuchen.


Anmelden zum Antworten