Brainstorming, wie würdet ihr das Lösen: Ein Code, 4 Sprachen



  • Hi,

    ich hab eine Server-Software, die grundsätzlich sehr gut ist und sich über 2 Wege anstuern lässt:
    1.) Man erstellt eine Art Batch-Datei in VB-Script und schickt diese an den Server. Dieser kann diese Batch dann per "cronjob" ausführen.
    2.) Man nutzt eine DLL, welche für C#.net ausgelegt ist und kann den Server somit fernsteuern. Sehr nützlich für Client-Anwendungen.

    Wenn man nun beides nutzt, dann schreibt man ein Script im schlimmsten Falle 2 Mal und hat somit alles was man braucht.

    Jetzt kommt der Gag an der Sache:
    Die neue Version hat die Scripte auf JavaScript umgestellt und die DLL ist nun für C++ ausgelegt. Und nebenbei ist die neue DLL auch ca. 5 Mal so schnell wie die alte.

    Da ich jetzt ein paar Freunde habe, die die alte Version nutzen (VR-Script und C#) und ein paar Freunde mit der neuen Version bestückt sind (JavaScript und C++) würde ich mir gerne ein bisschen Arbeit sparen und gerne nur noch 1 Skript schreiben und dieses dann überall verwenden.

    Mein erster Ansatz war jetzt, ich schreibe die Scripte in JavaScript und schreibe eine Art Compiler, welches das JavaScript nach VB-Script, C# und C++ übersetzt. Aber einen Parser für egal welche Sprache zu schreiben ist ja eine Hammer-Arbeit und ich bin sicherlich kein soooo guter Programmierer, dass ich das auch gut hinbekommen würde.

    Ich arbeite bei C# und C++ eigentlich nur mit Visual Stusio und hab auch ne kleine SDK für den Workaround mit dem Server. Also müsste ich ja nicht alle JavaScript-Befehle unterstützen, sondern mir würden wirklich ca. 20 Befehle reichen. Auch Array könnte ich mir sparen (weil die vom Server her nicht unterstützt werden), also nur string, int und bool.

    Aber ich würde den Thread ja nicht aufreisen, wenn ich schon eine Ahnung hätte, was sinnvoll ist und was nicht.

    Irgendjemand ne Idee, Meinung, Anregung oder ähnliches?

    Wenn ich einen guten Workaround gefunden habe, würde ich nämlich anhand dieser Basis noch weitere Projekte (z.B. Script-Programmierung des Lego-EV3) in Angriff nehmen, welcher sich auch per Bluethooth fernsteuern lässt (Hab da was mit Dot-Net gefunden), oder per Assembler direkt programmieren lassen kann. Das wäre im Prinzip ja der gleiche Ansatz, nur dass ich dann ein Programm schreiben müsste, welches den (JS??? -)Code interpretiert oder per Compiler nach Assembler übersetzt (zumindest habe ich Projekte gefunden, die Anhand von Basic EV3-Programme übersetzten).

    Also immer her mit den Diskussionen. Wie der Titel schon sagt, das ist ein Brainstorming für mich um meine Unwissenheit des aktuellen Standard der Parser und Compiler ggf. zu erweitern. Man findet irgendwie viel zu viele halbfertige Lösungen im Web und kann so schlecht abschätzen, was gut ist und was nichts taugt.



  • Wenn du dir "gerne ein bisschen Arbeit sparen" möchtest, sollte deine Überlegung kein "Compiler" (man nennt auf der Ebene üblicheweise Transpiler) sein. Denn das so in etwa tausendfach mehr Aufwand.

    Außerdem: Hat sich denn wirklich nur die Sprache geändert oder auch die API?

    Aus meiner Sicht lässt sich das Problem am leichtesten zwischenmenschlich lösen:
    - Deine Friendz sollen sich das Upgrade reinlolen
    - Deine Friendz passen sich den C++ Shice selbst auf C# an
    - Du pfeifst auf deine Friendz und die sollen sich das selbst zusammenrofeln.

    So einfach kann die Welt sein.

    Oder du erfindest eine Abstraktion die beide Codes generiert. Um die Jahrtausendwende war es zum Beispiel fancy, alles mit XML zu machen, weil man dann ja keine Programmierer mehr braucht und so.
    Da du in deine Abläufe aber vermutlich eine gewisse algorithmische Komplexität verpacken musst, bist du wieder bei dem Problem, dass du "etwas mehr Aufwand" sparst indem du die aufwandstechnische Büchse der Pandora öffnest.

    Gerallt?



  • Ja, gerallt 😉

    Meine Friendz können nicht einen Strich coden, das sind die "Ich bin doch NUR Anwender". Die wollen nur, dass es geht...also das übliche. Aber ich will auch, dass es geht, weil wenn es bei denen geht, habe ich auch einige Vorteile davon. Also ein Interesse beider Seiten.

    Ja, das Update werde ich denen noch verklickern. Was aber noch bleibt ist die Sache, das selbe Script für C++ und für JavaScript zu schreiben. Die API selbst hat sich nicht geändert. Zumindest sind die Befehle und Parameter zu 95% gleich. Ich vermute das spielt sich alles unter der Haube am Server ab. Was sich geändert hat in den DLLs ist, die Art, wie der Server angesprochen wird. Anderer Port, anderes Protokoll, etc.

    Gibt es denn nicht irgendwo einen (kostengünstigen) Parser für eine Sprache, den man nutzen kann um ein Script zu analysieren und anhand dessen reagieren kann? Nur, dass man - anstatt Befehle auszuführen - einen anderen Quellcode schreibt?



  • Aus einem C++ Programm ein JavaScript Programm zu erstellen geht, das (einzige) Tool das ich dazu kenne heisst Emscripten. Hab' das Ding aber noch nie selbst verwendet, keine Ahnung wie anfängerfreundlich das ist. Und keine Ahnung wie schwer/einfach es ist dem C++ Programm dann eine API bereitzustellen die in "native" JavaScript implementiert ist.

    Umgekehrt geht nicht. Zumindest kann es keine generische Lösung geben die nicht im Falle des Falles interpretiert. Mit Interpreter geht es natürlich, das wäre dann jeder beliebige JavaScript Interpreter der sich in C++ einbinden lässt. Spontan fällt mir da mal V8 ein. Allerdings auch noch nie damit gerabeitet, aber ich vermute dass der nicht ganz anfängerfreundlich ist.

    Aber worum geht es denn überhaupt konkret? Wie sehen solche "Scripts" aus? Was müssen die alles können? Vielleicht gibt's ja eine einfachere Variante. Gibt ja einige Makro-Prozessoren mit denen man Code erzeugen kann. Unter umständen reicht es ja schon dass du dir ein paar C Präprozessor Makros bastelst und die 1x so implementierst dass am Ende C++ rauskommt und 1x so dass am Ende JavaScript rauskommt.

    stefanjann schrieb:

    Gibt es denn nicht irgendwo einen (kostengünstigen) Parser für eine Sprache, den man nutzen kann um ein Script zu analysieren und anhand dessen reagieren kann? Nur, dass man - anstatt Befehle auszuführen - einen anderen Quellcode schreibt?

    Doch, sicher. Eine Möglichkeit hab' ich ja gerade erwähnt, den C Präprozessor. Das selbe lässt sich aber natürlich auch mit vielen anderen Tools realisieren. Vermutlich könnte man sogar ein sed Skript dafür basteln. Das wären die ganz einfachen Varianten. Mit denen bist du natürlich stark limitiert, aber vielleicht reicht das ja.

    Alles andere was mir einfällt wird dann leider recht schnell deutlich aufwendiger.



  • Guten Morgen,
    die Sache mit den Makros klingt gut. Da werde ich mal spielen.

    Ansonsten reichen wirklich Basis-Befehle. Beispiel in Java\1:

    portA().setMode(5);
    var lgh = portA().getValue();
    if (lgh>10) {
      portB().go(50,10);
    } else {
      portB().stop();
    }
    

    Also mit "int", "string", "if/then/else", "switch/case/default" und "for" sowie "Funktionen" wäre für mich alles getan. Ein überschaubarer Aufwand, aber wenn man noch ein bisschen Mathe mit reinbginen will (PLus, Minus, ...) wird die Sache schon wieder komplizierter um selbst einen Parser/Compiler/Transpiler zu schreiben.

    "Emscripten" und "V8" schau ich mir heute einfach mal an. Zu Anfängerfreundlich muss es ja nicht sein, ich hab ja Ehrgeiz UND ZEIT. 😉

    Momentan schaut der Plan so aus, dass ich mit dem Gedanken spiele, wirklich XML als Basis heranzuziehen und daraus Code generiere. XML-Parser gibt es viele, die Tag- und Attribut-Bezeichnungen kann ich selbst definieren. Und dann übersetze ich das nach C++, JavaScript oder C#. Und der eine oder andere meiner Friendz könnte dann selbst drinnen basteln.

    Das obige Beispiel könnte dann evtl. so aussehen:

    <?xml version="1.0" encoding="UTF-8"?>
    <alfXmlScript>
        <var define="lgh" type="int" />
        <portA run="setMode" p1="5" />
        <portA run="getValue" returnVar="lgh" />
        <if p1="lgh &gt; 10" id="firstIf">
            <portB run="go" p1="50" p2="10" />
        </if>
        <else for="firstIf">
            <portB run="stop" />
        </else>
    </alfXmlScript>
    

    Ist jetzt nicht so sonderlich schön, dass gebe ich zu, aber meine Friendz können dann in einem XML-Editor gleich einen Syntax-Check durchführen und mein Parser schreibt dann relativ einfach einen Code bauen.



  • OK, das sieht machbar aus - wenn die Skripte sich auf dem Niveau bewegen. Dennoch bin ich der Meinung, dass du noch sehr viele Skripte schreiben musst, damit sich der Aufwand rentiert.

    Überlegenswert ist es dann, wenn du für dich einen Mehrwert aus der Sache ziehst, was hier nur das Lernen an der Problemstellung XML-zu-Irgendwas sein kann.

    Schon LOL die Geschichte.



  • Hellas,

    nein, ich habe einen größeren Mehrwert wenn die Sache läuft, als nur "was gelernt". Sonst würde ich mir die Sache nicht antun. Und Scripte schreibe ich die Woche 2-3 dafür. Also lohnt sich das auch. Und auf dem Niveau wird es bleiben. Mal abgesehen davon, dass man es ja erweitern kann, sollte mal etwas komplexeres dazu kommen.

    Klein Anfangen, wachsen, dranstricken bis nichts mehr geht und dann neu machen....das ist hier wohl der Beste Weg! Ich wart mal ab, was die Version 3 des Servers bringt. Die soll ja in ca. 4 Monaten raus kommen.

    Aber für das EV3-Mindstorm ist das kein guter Weg. Da mach ich mir ein andern Mal Gedanken.



  • Musst du das nur für die C++/C# Geschichte machen oder auch für JS/VB Script?
    Ich habe noch nicht ganz kapiert, wie es zusammenhängt.

    Mit dem JS/VB-Script-Gedöhns werden Deployment-Schritte gemacht und mit C++/C# die Applikationslogik, oder wird je beides zur Laufzeit benötigt?
    Sind die JS/VB Geschichten statisch oder ändern die sich auch für einzelne Problemstellungen?

    Mach ein Github Projekt draus. Dann kriegst ggf. Mitstreiter. Die Aufgabenstellung an sich ist ja ganz luschdig.



  • Also, das JavaScript (VB lasse ich weg, die sollen Updaten) wird benötigt um einen Job per Zeitsteuerung auszuführen. Das C++ wird benötigt, um Fernzusteuern.

    Ich brauche aber (sehr sehr) oft, den gleichen Job z.B. jede Stunde von 6-12 Uhr und am Nachmittag noch 1-2 Mal per Knopfdruck. Es ist aber umständlich, den Job dann einmal kurz in die Zeitsteuerung reinzunehmen (mach es in 5 Minuten) und danach wieder raus. Folglich: Das JavaScript per "cronjob" und das C++ per Knopfdruck.

    Und das Script ändert sich manchmal 3x die Woche und manchmal nur 1x im Monat. Einfach am Server die Datei tauschen (per API) und das Knopfdrück-Programm (command line) nochmal durch den compiler.

    Ein Github dafür mach ich nicht. Dafür ist das zu viel Hobby und hat zu wenig "Sinn für die Welt". Es ist ja eher was, um mir Arbeit zu sparen und meine Friendz einfache Eingriffe am Script zu ermöglichen (Mal nen Zahl zu ändern, etc).


Anmelden zum Antworten