Eigene Programmiersprache, wie soll ich anfangen?



  • CeveFlight schrieb:

    Moin Leute!

    Ich hab so die Idee einer eigenen Programmiersprache, die dann ungefähr so aus sehen soll

    Beispiel eines Programms das Hello World ausgibt:

    import library       > system.celc
    declare reference    > sys
    reference tolibrary  > system => sys
    import eventspace    > sys.system
    import functionspace > sys.system
    declare listener     > main #on_events << system/programm_started ; system/programm_restarted
    
    listener start              > main
    listener body push function > system->print #set_parameters << "Hello World" => text_to_print
    listener body push event    > system->programm_stopped
    listener end                > main
    

    Das ganze Farblich und Kommentiert in HTML: https://www.dropbox.com/sh/gkvfpeeh0qzarn6/BtI69cUtKd/Deutsch/Beispiel_Programme/Konsolen_Hello_World/example.html

    Wie sollte ich anfangen, erstmals ein Programm schreiben das alles in C++ übersetzt und dann weiter, gibt es da schon vorgefertigtes?

    P.s: Wenn jemand mitmachen will kann er sich gerne hier im Forum melden

    Und der ganze riesige Codehaufen bedeutet nicht mehr als

    print "Hello World"
    


  • volkard schrieb:

    CeveFlight schrieb:

    Moin Leute!

    Ich hab so die Idee einer eigenen Programmiersprache, die dann ungefähr so aus sehen soll

    Beispiel eines Programms das Hello World ausgibt:

    import library       > system.celc
    declare reference    > sys
    reference tolibrary  > system => sys
    import eventspace    > sys.system
    import functionspace > sys.system
    declare listener     > main #on_events << system/programm_started ; system/programm_restarted
    
    listener start              > main
    listener body push function > system->print #set_parameters << "Hello World" => text_to_print
    listener body push event    > system->programm_stopped
    listener end                > main
    

    Das ganze Farblich und Kommentiert in HTML: https://www.dropbox.com/sh/gkvfpeeh0qzarn6/BtI69cUtKd/Deutsch/Beispiel_Programme/Konsolen_Hello_World/example.html

    Wie sollte ich anfangen, erstmals ein Programm schreiben das alles in C++ übersetzt und dann weiter, gibt es da schon vorgefertigtes?

    P.s: Wenn jemand mitmachen will kann er sich gerne hier im Forum melden

    Und der ganze riesige Codehaufen bedeutet nicht mehr als

    print "Hello World"
    

    @volkard schon ein bisschen mehr, sonst wäre es ja traurig.
    Meine Ideen sind eher an C++ angelehnt, das du mehr machen kannst aber musst.

    import library       > system.celc // Hier wird die Bibliothekdatei system.celc in das Suchsystem importiert
    declare reference    > sys // Hier wird eine Referenz namens sys deklariert
    reference tolibrary  > system => sys // Hier wird festgelegt das die Bibliothek system mit der Referenz sys aufgerufen wird.
    import eventspace    > sys.system // Hier werden alle Events von system importiert
    import functionspace > sys.system //Hier werden alle Funktionen von system importiert
    declare listener     > main #on_events << system/programm_started ; system/programm_restarted //Hier wird ein Listener mit dem Namen main deklariert, der bei den Events programm_started und programm_restarted aufgerufen wird.
    
    listener start              > main // Hier wird die definition des vorher deklarierten Listeners main eingeleitet
    listener body push function > system->print #set_parameters << "Hello World" => text_to_print //Hier wird die Funktion print mit "Hello World" für text_to_print aufgerufen
    listener body push event    > system->programm_stopped //Hier wird Das Event programm_stopped ausgestoßen
    listener end                > main // Hier wird der Definitionsblock für den Listener main beendet.
    

    Aber wie @schlimmplement schon schrieb:

    schlimmplement schrieb:

    Wenn ich du wäre und wollen würde, dass sich meine Sprache durchsetzt, dann würde ich machen, dass jedes gültige C++-Programm auch gültiger Code in dieser Sprache ist (und damit auch alle C++-Spielebibliotheken funktionieren)
    [...]
    Es gibt Leute, die sagen, dass der Erfolg von C++ einzig daher kommt, dass es eine Erweiterung von C ist (war).

    Das heist, so wie es jetzt aussieht wird es nicht aussehen, da ich ja nicht das Hirn von den wenigen C/C++/Java Programmieren verdreschen will, die dann in dieser Sprache schreiben, also doch ein wenig ähnlicher.
    Du klingst als bist du interessiert.
    Wie wärs, wir beide machen die Sprache so das sie a) nicht zu lang ist b) gut zu lesen ist und c) unendlich Möglichkeiten hat.



  • Da ich gerade selbst fuer meine eigene Sprache einen Compiler schreibe, geb ich auch mal meinen Senf zu dem Thema ab.

    • Verwende verschiedene Symbole fuer verschiedene Dinge. Designe deine Sprache kontextfrei.
      In deinem Beispiel verwendest du '>', du wirst aber auch moeglicherweise einen groesser-Operator brauchen.
    • Verwende nicht zu viele Keywords, und vor allem keine langen Keywords. Programmierer sind faul. ("listener body push function" sieht fuer mich einfach viel zu lang aus, wuerde ich nicht ausschreiben wollen)
    • Fange mit einem sehr kleinen Subset deiner Sprache an und fuege nach und nach Features hinzu. Du brauchst fuer den Anfang keine Klassen, Templates, Operator-Ueberladung oder Exceptions. Diese Features ueberfordern nur, vor allem, wenn du noch kaum Erfahrung mit Compilerbau hast.
    • Stelle deinen Compiler als Library zur Verfuegung und baue ihn entsprechend modular auf. Wenn du moechtest, dass jemand deine Sprache verwendet, dann brauchst du dafuer Tools, und diese Tools muessen auch irgendwo herkommen. Das faengt an mit einer IDE mit Syntax-Highlighting und geht dann weiter ueber Refactoring bis zu Analysetools.

    Compilerbau ist keine schwarze Magie, man darf nur nicht den Fehler begehen und ein zweites C++ designen.

    Ich empfehle dir ausserdem, mit einer kleinen Voruebung anzufangen, um ein Gefuehl fuer die Materie zu bekommen: Schreib einen Taschenrechner.
    (Ja, das ist mein voller Ernst.)

    • Stell eine EBNF-Grammatik auf fuer die Ausdruecke, die unterstuetzt werden sollen
    • Scanner/Lexer, um Ausdruck in Token zu zerlegen, Leerzeichen/Kommentare zu ueberspringen
    • Parser, um einen AST zu erzeugen
    • Semantische Analyse, je nachdem was du implementierst
    • JIT-Kompilierung mit LLVM

    Nachdem die Grundrechenarten funktionieren, kannst du Funktionsaufrufe einbauen, ein Typsystem, Funktionsueberladung, Casts, usw.

    Ich habe sowas einmal als IRC-Bot realisiert: https://github.com/Paprikachu/CrapScriptBot/
    (Den Tokenizer habe ich nie fertigestellt, stattdessen verarbeitet der Parser direkt Zeichen und anstatt JIT-Kompilierung wird der AST direkt ausgefuehrt.)

    Wenn dir danach Compilerbau immer noch Spass macht, viel Glueck 😉



  • Kellerautomat schrieb:

    Da ich gerade selbst fuer meine eigene Sprache einen Compiler schreibe, geb ich auch mal meinen Senf zu dem Thema ab.

    • Verwende verschiedene Symbole fuer verschiedene Dinge. Designe deine Sprache kontextfrei.
      In deinem Beispiel verwendest du '>', du wirst aber auch moeglicherweise einen groesser-Operator brauchen.
    • Verwende nicht zu viele Keywords, und vor allem keine langen Keywords. Programmierer sind faul. ("listener body push function" sieht fuer mich einfach viel zu lang aus, wuerde ich nicht ausschreiben wollen)
    • Fange mit einem sehr kleinen Subset deiner Sprache an und fuege nach und nach Features hinzu. Du brauchst fuer den Anfang keine Klassen, Templates, Operator-Ueberladung oder Exceptions. Diese Features ueberfordern nur, vor allem, wenn du noch kaum Erfahrung mit Compilerbau hast.
    • Stelle deinen Compiler als Library zur Verfuegung und baue ihn entsprechend modular auf. Wenn du moechtest, dass jemand deine Sprache verwendet, dann brauchst du dafuer Tools, und diese Tools muessen auch irgendwo herkommen. Das faengt an mit einer IDE mit Syntax-Highlighting und geht dann weiter ueber Refactoring bis zu Analysetools.

    Compilerbau ist keine schwarze Magie, man darf nur nicht den Fehler begehen und ein zweites C++ designen.

    Ich empfehle dir ausserdem, mit einer kleinen Voruebung anzufangen, um ein Gefuehl fuer die Materie zu bekommen: Schreib einen Taschenrechner.
    (Ja, das ist mein voller Ernst.)

    • Stell eine EBNF-Grammatik auf fuer die Ausdruecke, die unterstuetzt werden sollen
    • Scanner/Lexer, um Ausdruck in Token zu zerlegen, Leerzeichen/Kommentare zu ueberspringen
    • Parser, um einen AST zu erzeugen
    • Semantische Analyse, je nachdem was du implementierst
    • JIT-Kompilierung mit LLVM

    Nachdem die Grundrechenarten funktionieren, kannst du Funktionsaufrufe einbauen, ein Typsystem, Funktionsueberladung, Casts, usw.

    Ich habe sowas einmal als IRC-Bot realisiert: https://github.com/Paprikachu/CrapScriptBot/
    (Den Tokenizer habe ich nie fertigestellt, stattdessen verarbeitet der Parser direkt Zeichen und anstatt JIT-Kompilierung wird der AST direkt ausgefuehrt.)

    Wenn dir danach Compilerbau immer noch Spass macht, viel Glueck 😉

    Danke für deine hilfreichen Tipps, ich hatte wirklich vor die komplette Sprache mit Interpreter in C++ zu entwerfen.
    Du hast Recht, ich sollte erst-mal einen Intepreter zum laufen bringen der die Grundrechenarten in der neuen Sprache beherrscht und dann in kleinen Schritten den Interpreter um verschiedene Features erweitern.
    Was meintest du mit "nicht den Fehler begehen und ein zweites C++ designen.", an sich will ich meine Sprache ja so Funktional wie möglich gestalten.



  • CeveFlight schrieb:

    Was meintest du mit "nicht den Fehler begehen und ein zweites C++ designen.", an sich will ich meine Sprache ja so Funktional wie möglich gestalten.

    Ich nehme an, er meint:
    - C++ ist hammerkompliziert, aber 99.99% der Anwendungen brauchen gar nicht das alles. Zum großen Teil Altlasten aus C.
    - C++ ist so verflixt harmonisch und ausgewogen (für mich zum Beispiel), kannst da nicht drüber kommen. Hast die Manpower niemals, so schlaue Sachen Dir auch so tiefgrünfig und mit so viel Praxiserfahrung zu überlegen wie das C++-Standardisierungskommitee.
    - Kein Ar... wird Deine Sprache nehmen, wenn sie nur ein C++-Abklatsch ist, ist dann einfacher beim Oringinal zu bleiben.



  • volkard schrieb:

    - Kein Ar... wird Deine Sprache nehmen, wenn sie nur ein C++-Abklatsch ist, ist dann einfacher beim Oringinal zu bleiben.

    Man sieht es an Java: billiger Abklatsch mit weglassen vieler Features und hinzufügen einiger Features + Hype = Erfolg.



  • Volkard meint sicher sowas wie D. Java ist von wenigen Oberflächlichkeiten abgesehen nicht großartig an C++ orientiert.



  • Was soll denn die ganze Negativität (bis hin zu Beleidigungen) hier?

    Wenn er eine Sprache entwickeln und implementieren will, lasst ihn doch. Mit Sicherheit wird er dabei einiges lernen und Spaß haben. Ist das nicht Grund genug?

    CeveFlight, Compilerbau ist ein sehr gut erforschter Teil der Informatik. Davon solltest du unbedingt Gebrauch machen, sonst kommt am Ende sowas wie PHP bei raus.

    Mach dir Gedanken wie deine Sprache aussehen soll. Achte darauf, dass die Sprachfeatures gut miteinander harmonieren. Irgendwann beginnst du dann mal das ganze zu implementieren.

    Benutze Yacc oder einen anderen Parsergenerator! Yacc mag heutzutage vielleicht nicht mehr "in" oder sonstwas sein, aber es basiert auf guter Theorie und du kommst schnell voran. Yacc kannst du aber nicht direkt mit deinem Quellcode füttern. Zuvor kommt noch die lexikalische Analyse, die deinen Quellcode in "Tokens" zerlegt, die vom Parser verstanden werden.

    Auch für das gibt es Hilfsmittel, allerdings kann man Lexing auch prima selbst machen. Wenn du da angekommen bist und an etwas anderes als einen Zustandsautomaten denkst, solltest du doch lieber Lex o.ä. verwenden.

    Lese die einschlägige Literatur! Es gibt auch viele Onlinekurse zur theoretischen Informatik allgemein und zum Compilerbau speziell. Hiermit meine ich Kurse von anständigen Hochschulen, keine Youtube-Tutorials!



  • Danke miesertroll für deinen netten Kommentar 😉
    Bezüglich

    Es gibt auch viele Onlinekurse zur theoretischen Informatik allgemein und zum Compilerbau speziell. Hiermit meine ich Kurse von anständigen Hochschulen, keine Youtube-Tutorials!

    könntest du mir einen Link schicken?



  • Hallo,

    gerade vorgestern hatte ich in Expression Operatoren einen Link im Internet gefunden:
    Lecture 4: Implementing Lexers and Parsers

    Auch generell sind die weiteren Kapitel unter Lectures interessant.

    Und bei der Uni Potsdam gibt es ausführliche Foliensätze als PDF: Einführung in den Compilerbau


Anmelden zum Antworten