meine einbettbare Skriptsprache - Fragen zwecks Open Source



  • Hallo!

    Ich habe vor längerem mal eine kleine Skriptsprache programmiert, die man leicht in C++ Projekte integrieren kann. Habe sie für verschiedene Projekte verwendet und fand sie ganz nützlich und möchte sie jetzt Open Source machen.

    Die Sprache an sich ist recht simpel gehalten, sie soll vor allem dazu dienen diverse Programmeinstellungen dynamisch berechenbar zu machen.

    Jetzt die Frage: was ist euch bei der Integrierbarkeit einer Skriptsprache in eure C++ Applikation wichtig?
    Mir ist vor allem wichtig, leicht eigene C++ Funktionen im Skript aufrufen zu können, sowie ein leichter Zugriff auf die bei der Ausführung gesetzten Variablenwerte.

    1. Neue Skriptfunktionen: dies löse ich über ein Interface von welchem abgeleitet wird. Danach muss die neu erstellte Skriptfunktion noch bei der FunctionFactory registriert werden.

    // interface for callable script functions
    struct IRegisteredFunc
    {
        std::string name; // name of script function
        ValueType ret; // return type
        std::vector<ValueType> args; // argument types
        virtual ValueTypeInfo Execute(const std::vector<ValueTypeInfo>& args, RuntimeInfo& runtimeInfo)=0; // function to be called from the script
    };
    

    2. Variablenwerte: beim Ausführen des Skripts übergibt man eine RuntimeInfo, welche ein Feld vars besitzt. Dieses wird mit Variablenwerten befüllt, diese sind danach leicht abgreifbar mit vars["variablenName"].
    Für zusätzliche Daten die man an den Interpreter weitergeben will gibt es das Feld pData.

    // information needed while executing the script
    struct RuntimeInfo
    {
        RuntimeInfo():pData(0){}
    
        // variable values
        std::map<std::string,ValueTypeInfo> vars;
    
        // additional user defined data
        void* pData;
    };
    

    3. Verwendung des Interpreters:

    // pass script to interpreter
        Interpreter interpreter(programText);
        // is everything ok?
        if(interpreter.IsError()==false)
        {
            // run script
            RuntimeInfo runtimeInfo;
            interpreter.Execute(runtimeInfo);
    
            // get var value
            ValueTypeInfo val=runtimeInfo.vars["myVar"];
            if(val.type==VTInt)
            {
                int myVar=val.iVal;
                std::cout<<"myVar has int value: "<<myVar;
            }
        }
    

    Fragen:
    ist das einfach genug?
    Sind weitere Features nötig bei der Integration?
    Welche Plattform empfehlt ihr - github oder sourceforge?

    Vielen Dank!



  • xxxxskriptxxxxx schrieb:

    Mir ist vor allem wichtig, leicht eigene C++ Funktionen im Skript aufrufen zu können, sowie ein leichter Zugriff auf die bei der Ausführung gesetzten Variablenwerte.

    Sowas ist eigentlich selbstverständlich, sonst wär das ganze ja völlig nutzlos. Das ist aber denk ich auch ausreichend. Wenn die Sprache objektorientiert wäre, könnte ich mir noch die Möglichkeit vorstellen, eigene C++ Klassen an die Scriptsprache zu übergeben (so COM ähnlich vielleicht). Sonst fällt mir aber auch nicht viel mehr ein.
    Klar ist das einfach genug, sind doch nur paar Zeilen. Ansonsten muss man sich natürlich fragen, was das ganze für einen Sinn hat, weil es gibt z.B. LUA, Python usw. Ist aber kein Grund, keine eigene Sprache zu schreiben, würd ich bestimmt auch machen 😉
    Sourceforge ist schon ziemlich veraltet, github ist grad in. Poste mal den Link, wenn du deine Sprache veröffentlich hast.

    p.s. Der Stil gefällt mir aber noch nicht ganz. Warum schreibst du Methodennamen groß? Das macht natürlich jeder wie er will, aber wirklich üblich ist es in C++ nicht. Und eine Funktion "isError" finde ich auch etwas komisch.



  • vielen Dank fürs Feedback!
    Link kommt sobald es online ist, muss noch ein paar Zeilen Doku dazu schreiben.

    p.s.: große Funktionsnamen sind wegen Firmenrichtlinie, das färbt eben auch privat ab.



  • xxxxskriptxxxxx schrieb:

    p.s.: große Funktionsnamen sind wegen Firmenrichtlinie, das färbt eben auch privat ab.

    Ach du sch****, das ist ja richtig übel und so etwas hinterm Dorf.
    Der weltweite Standard ist, dass Funktionsnamen klein geschrieben werden.
    Nur Klassennamen und Makros werden groß geschrieben.

    Also wenn deine Scriptsprache eine große Verbreitung erreichen soll, dann solltest du die Richtlinie der Dorffirma im Dorf lassen und dich an den weltweiten Standard halten Funktionsnamen klein zu schreiben.

    Ich möchte auch gar nicht wissen, was für eine kleine Klitsche das ist. Euer Chef sollte defintiv nochmal in die Schulung geschickt werden.

    Ansonsten wäre mir bei einer Scriptsprache Sicherheit & Sichtbarkeit wichtig.



  • Security schrieb:

    Der weltweite Standard ist, dass Funktionsnamen klein geschrieben werden.
    Nur Klassennamen und Makros werden groß geschrieben.

    Blödsinn. Du lebst wohl richtig hinterm Mond.



  • Security schrieb:

    xxxxskriptxxxxx schrieb:

    p.s.: große Funktionsnamen sind wegen Firmenrichtlinie, das färbt eben auch privat ab.

    Ach du sch****, das ist ja richtig übel und so etwas hinterm Dorf.
    Der weltweite Standard ist, dass Funktionsnamen klein geschrieben werden.
    Nur Klassennamen und Makros werden groß geschrieben.

    Also wenn deine Scriptsprache eine große Verbreitung erreichen soll, dann solltest du die Richtlinie der Dorffirma im Dorf lassen und dich an den weltweiten Standard halten Funktionsnamen klein zu schreiben.

    Wo kann ich denn den weltweiten Standard nachlesen?



  • Starglider schrieb:

    Security schrieb:

    xxxxskriptxxxxx schrieb:

    p.s.: große Funktionsnamen sind wegen Firmenrichtlinie, das färbt eben auch privat ab.

    Ach du sch****, das ist ja richtig übel und so etwas hinterm Dorf.
    Der weltweite Standard ist, dass Funktionsnamen klein geschrieben werden.
    Nur Klassennamen und Makros werden groß geschrieben.

    Also wenn deine Scriptsprache eine große Verbreitung erreichen soll, dann solltest du die Richtlinie der Dorffirma im Dorf lassen und dich an den weltweiten Standard halten Funktionsnamen klein zu schreiben.

    Wo kann ich denn den weltweiten Standard nachlesen?

    Z.B. hier:
    http://de.wikibooks.org/wiki/Java_Standard:_Variablen_und_Bezeichner#Java_Code_Konventionen

    @hustbear
    Hör auf zu trollen.



  • Security schrieb:

    Starglider schrieb:

    Security schrieb:

    xxxxskriptxxxxx schrieb:

    p.s.: große Funktionsnamen sind wegen Firmenrichtlinie, das färbt eben auch privat ab.

    Ach du sch****, das ist ja richtig übel und so etwas hinterm Dorf.
    Der weltweite Standard ist, dass Funktionsnamen klein geschrieben werden.
    Nur Klassennamen und Makros werden groß geschrieben.

    Also wenn deine Scriptsprache eine große Verbreitung erreichen soll, dann solltest du die Richtlinie der Dorffirma im Dorf lassen und dich an den weltweiten Standard halten Funktionsnamen klein zu schreiben.

    Wo kann ich denn den weltweiten Standard nachlesen?

    Z.B. hier:
    http://de.wikibooks.org/wiki/Java_Standard:_Variablen_und_Bezeichner#Java_Code_Konventionen

    Das ist aber Java, warum nicht die hier? http://google-styleguide.googlecode.com/svn/trunk/cppguide.html
    Da wird z.B. kein CamelCase für Methodennamen vorgeschlagen, sondern die Trennung der Worte mit Unterstrich als Infix z.b. object.do_something_special();
    Was ich dort auch toll finde, ist die Markierung von Membervariabeln mit einem Unterstrich als Postfix und nicht mit einem Prefix oder gar m_ als Prefix.

    Ich glaube nicht, dass es in C++ einen weltweiten Standard gibt. Wenn dann eher so eine Mischmasch aus verschiedenen Konventionen. Bei einigen Sachen wie dem Anfang von Klassen- und Methodennamen ist man sich da sicher, wie auch bei Konstanten, aber sonst ist das ein wilder Mix in meinen Augen.

    Ich lasse mich aber auch gerne eines besseren belehren.



  • Was ich wichtig finde ist dass die Sprache die verschiedensten C++ Referenztypen vernünftig binden kann.

    int& foo(int& a)
    {
        return a;
    }
    
    int* foo2() 
    {
        static int staticInt;
        return &staticInt;
    }
    
    int* foo3()
    {
        return new int();
    }
    
    std::shared_ptr<int> foo4()
    {
        return std::make_shared<int>();
    }
    

    würde ich gerne alle elegant binden können.
    Da versagen die meisten Sprachen da sie den Wirrwarr in C++ nicht kennen.

    Ein Interface möchte ich als User beim binden einer Funktion nicht implementieren müssen.
    Das möchte ich bitte so haben:

    bind("foo", &foo);
    


  • @Ethon: danke fürs Feedback.
    Zu dem Vorschlag mit bind() - die Idee gefällt mir gut.

    Deinen ersten Punkt versteh ich nicht ganz - kannst du das noch etwas näher ausführen?
    Im Skript habe ich als Datentypen string, int und float zur Verfügung. Was bringt mir ein int* oder ein int& oder gar ein shared_ptr?

    Beispielsweise der Aufruf der Funktion ReadString um einen Wert von der Konsole zu bekommen im Skript:

    $s:=ReadString();
    

    und in C++ die Implementiertung der ReadString Funktion:

    // ReadString
    ValueTypeInfo RegisteredFuncReadString::Execute(RuntimeInfo& runtimeInfo, const std::vector<ValueTypeInfo>& args)
    {
        ValueTypeInfo res;
        std::cin>>res.sVal; // Wert setzen
        res.type=VTString; // Typ setzen
    
        return res;
    }
    

    Die Funktion muss also eine Liste von Parametern übernehmen (in dem Beispiel 0), und gibt einen Wert (in dem Fall den eingelesenen string) zurück. Sowohl Parameter als auch Rückgabewert sind vom Typ "ValueTypeInfo", der die Information beinhaltet, ob es ein int, float oder string ist, sowie den Wert dazu.
    In welcher Weise soll ich nun ein "int* foo3()" integrieren, und welchen Sinn hat das?



  • Upps, habe nicht mitbekommen dass deine Skriptsprache so primitiv ist.
    Spätestens aber wenn die Sprache komplexer wird (man Objekte über die Sprachgrenzen transportieren kann) ist es wichtig die ganzen Lebenszeitarten von C++ zu respektieren. Macht keine mir bekannte Skriptsprache vernünftig.



  • Ethon schrieb:

    Upps, habe nicht mitbekommen dass deine Skriptsprache so primitiv ist.
    Spätestens aber wenn die Sprache komplexer wird (man Objekte über die Sprachgrenzen transportieren kann) ist es wichtig die ganzen Lebenszeitarten von C++ zu respektieren. Macht keine mir bekannte Skriptsprache vernünftig.

    ok, aber nein, sowas kompliziertes war nicht ganz mein Anwendungsfall 😉
    Scheinst aber Ahnung zu haben - hast schon mal selbst eine Skriptsprache geschrieben?



  • Security schrieb:

    @hustbear
    Hör auf zu trollen.

    Wo trolle ich denn bitte?



  • xxxxskriptxxxxx schrieb:

    Ethon schrieb:

    Upps, habe nicht mitbekommen dass deine Skriptsprache so primitiv ist.
    Spätestens aber wenn die Sprache komplexer wird (man Objekte über die Sprachgrenzen transportieren kann) ist es wichtig die ganzen Lebenszeitarten von C++ zu respektieren. Macht keine mir bekannte Skriptsprache vernünftig.

    ok, aber nein, sowas kompliziertes war nicht ganz mein Anwendungsfall 😉
    Scheinst aber Ahnung zu haben - hast schon mal selbst eine Skriptsprache geschrieben?

    Was ist dein Anwendungsfall?
    Ja, ein paar.



  • Starglider schrieb:

    Security schrieb:

    Starglider schrieb:

    Wo kann ich denn den weltweiten Standard nachlesen?

    Z.B. hier:
    http://de.wikibooks.org/wiki/Java_Standard:_Variablen_und_Bezeichner#Java_Code_Konventionen

    Das ist aber Java, warum nicht die hier? http://google-styleguide.googlecode.com/svn/trunk/cppguide.html

    Das spielt keine Rolle, Java ist eine Weltsprache mit einem hier definierten Standard bezüglich der Konvention. Sie ist gut und man sollte sich an diese halten, da sie auf alle weiteren Sprachen problemlos übertragen werden kann.

    hustbaer schrieb:

    Security schrieb:

    @hustbear
    Hör auf zu trollen.

    Wo trolle ich denn bitte?

    Du trollst hier ständig, weswegen ich bei dir sowieso von einem Forentroll ausgehe. Also lass das.



  • Wenn du meinst...



  • Ethon schrieb:

    xxxxskriptxxxxx schrieb:

    Ethon schrieb:

    Upps, habe nicht mitbekommen dass deine Skriptsprache so primitiv ist.
    Spätestens aber wenn die Sprache komplexer wird (man Objekte über die Sprachgrenzen transportieren kann) ist es wichtig die ganzen Lebenszeitarten von C++ zu respektieren. Macht keine mir bekannte Skriptsprache vernünftig.

    ok, aber nein, sowas kompliziertes war nicht ganz mein Anwendungsfall 😉
    Scheinst aber Ahnung zu haben - hast schon mal selbst eine Skriptsprache geschrieben?

    Was ist dein Anwendungsfall?
    Ja, ein paar.

    war für ein embedded linux für ein display: bei jedem gui element konnte man etwas code hinterlegen, um das aussehen von gewissen programmzuständen abhängig zu machen. z.b. im fehlerfall ein feld rot blinkend im sekundentakt, grün wenn alles ok ist, oder ähnliches. sollte auch vom kunden skriptbar sein.


Log in to reply