Skript Runner/Compiler

    • Tool

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Skript Runner/Compiler

      Hallo!

      Ich arbeite nun schon länger an diesem Projekt hier und finde das ich das langsam mal veröffentlich könnte. Ob die Welt das überhaupt brauch weiß ich nicht, aber das Projekt ist so oder so nur aus Lernzwecken und viel Langeweile entstanden, trotzdem vielleicht findet jemand doch Verwendung dafür. Das hier ist schon die zweite Version davon, jedoch war die erste Version weniger ausgereift. Eigentlich wollte ich nur sehen wie "schnell" ich gegenüber von GML werden kann, inbesondere wenn der Code "optimiert" wird.
      Es ist eine selbst erfundene Skriptsprache die stark an den Game Maker angepasst ist, jedoch im Gegensatz zu GML einige Dinge anders macht:

      Es wird fest zwischen real und string unterschieden.

      Ein Skript ist in mehere Funktionen unterteilt, alle können Argumente annehmen oder ein Wert zurück geben:

      GML-Quellcode

      1. real func(real foo, string bar) {
      2. if (bar == "rofl") {
      3. return 0;
      4. }
      5. else {
      6. return foo;
      7. }
      8. }


      Funktionen können überladen werden, d.h. unterschiedliche Argumente annehmen:


      GML-Quellcode

      1. string func(string foo) {
      2. return func(foo, "bar");
      3. }
      4. string func(string foo, string bar) {
      5. return foo + " " + bar;
      6. }


      if, while, for, switch sind als Konstrukte vorhanden:

      GML-Quellcode

      1. void func() {
      2. real x = 0;
      3. while(x < 10) {
      4. switch(x) {
      5. case 0:
      6. print("0");
      7. break;
      8. case 1:
      9. print("1");
      10. break;
      11. default:
      12. print("default");
      13. break;
      14. }
      15. x += 1;
      16. }
      17. }
      Alles anzeigen


      Arrays haben eine feste Größen, können aber als Parametern übergeben werden:

      GML-Quellcode

      1. void func() {
      2. real[] a = real[4];
      3. for (real i = 0; i < 4; i+=1) {
      4. a[i] = i;
      5. }
      6. }
      7. void func(real[] array) {
      8. print(array[2]);
      9. }



      Der Compiler (wenn man das eigentlich so nennen kann?) ist in C# programmiert (Code ist mittlerweile relativ groß geworden, würde wohl einige Dinge anders machen). Der Runner kann in jeder Programmiersprache eigentlich umgesetzt werden (also auch als DLL), habe aber zum Testen einen in GML umgesetzt. Ein Skript muss am Anfang erst geladen werden und dann kann man jede Funktion im Skript aufrufen.

      Vorteile:

      • da der Code vorher in eine Zwischensprache umgewandelt wird ist es unmöglich an den Orginalcode zu kommen
      • Optimierer kann Code auswerten und evtl. "schneller" machen (statische Ausdrücke werden z.B. sofort ausgerechnet)
      • der Runner kann den Code einschränken und nur Funktionen erlauben die wirklich gebraucht werden (z.B. wenn der Spieler selbst Skripte schreiben kann)
      • der Zwischencode ist theoretisch nicht auf eine Plattform beschränkt und kann auch mit einer DLL ausgeführt werden




      Nachteile:

      • noch nicht alle GM Funktionen sind umgesetzt
      • hat evtl noch ein paar Bugs
      • Fehlermeldungen sind nicht so hilfreich
      • Code muss vorher durch den Compiler
      • Zwischencode nur schlecht zu debuggen


      Spoiler anzeigen

      Eingebaute Funktionen:

      real real(string x) konvertiert Strings zu Reals
      string string(real x) konvertiert Reals zu Strings
      real array_length(real[] array) Gibt die Länge von einem Array an
      real array_length(string[] array)


      Download mit Beispielen: henrik1235.bplaced.net/compiler/Release.zip

      Benutzung: Datei einfach auf die .EXE ziehen (oder über CMD Compiler.exe <Dateiname>)

      -henrik1235
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von henrik1235 ()