Seite 1 von 1

Scripting mit Lua bzw. Python

Verfasst: Mi Nov 07, 2012 9:39 am
von Glocke
Hiho,

bisher sind mir zwei Skriptsprachen untergekommen, die in Verbindung mit C++ Programmen für Scripte genutzt werden: Lua und Python.

Ich selber bin großer Python-Fan (einfach tolle Syntax und insgesamt ne schöne rapid-dev-sprache). Daher weiß ich nicht, ob ich Python als Skriptsprache verwenden soll oder Lua. Welche würdet ihr mir empfehlen?

Kennt jemand gute Tutorials, um zwischen C++ und Lua bzw. Python Datenstrukturen auszutauschen? Gemeint ist: Habe ich in C++ z.B. eine Klasse Foo und will in Lua / Python mit einer bestimmten Instanz dieser Klasse arbeiten und dem C++ Programm diese Instanz anschließend zurückgeben (usw.)

LG Glocke

Re: Scripting mit Lua bzw. Python

Verfasst: Mi Nov 07, 2012 11:28 am
von fat-lobyte
Glocke hat geschrieben:Ich selber bin großer Python-Fan (einfach tolle Syntax und insgesamt ne schöne rapid-dev-sprache). Daher weiß ich nicht, ob ich Python als Skriptsprache verwenden soll oder Lua. Welche würdet ihr mir empfehlen
Hallo, von Lua hab ich leider keine Ahnung, aber ich glaube da wird dir Kerli weiterhelfen können.

Von Python weiß ich, dass es eine API für C gibt: http://docs.python.org/3/c-api/
Diese mit C++ zu benutzen ist natürlich ziemlich anstrengend.

Daher hat jemand vor einiger Zeit die C++-Python Bibliothek geschrieben, die anscheinend sogar gut genug für Boost war: http://www.boost.org/doc/libs/1_52_0/libs/python/doc/

Das klingt erstmal gut, allerdings hat die Sache einen Haken: Boost.Python hat seit 2003 keine Änderungen gesehen. Ich weiß nicht, ob und wie es mit Python 3 funktioniert, und ob es gröbere Probleme gibt.

Tutorials kann ich dir keine Empfehlen, da ich so etwas nie versucht habe.

Re: Scripting mit Lua bzw. Python

Verfasst: Mi Nov 07, 2012 12:37 pm
von Xin
MadShadow wollte etwas zu Lua schreiben, aber das ist noch nicht fertig. Bisher habe ich mit Lua leider auch noch nichts zu tun gehabt.

Für Python brauchst Du ein C-Interface für die C++-Klasse.

Re: Scripting mit Lua bzw. Python

Verfasst: Mi Nov 07, 2012 2:54 pm
von MadShadow
Xin hat geschrieben:MadShadow wollte etwas zu Lua schreiben,[...]
Will ich auch immer noch :)
Aber erstmal muss ich noch Erfahrungen sammeln. Ich will mein Tutorial nochmal neu strukturieren und dem ganzen ein Ziel geben. Die Sache mit "warum Lua lernen" ist immer noch nicht so klar.
Wie man Lua in C++ implementieren kann interessiert mich auch sehr. :)

Re: Scripting mit Lua bzw. Python

Verfasst: Mi Nov 07, 2012 3:35 pm
von Kerli
Lua wurde ja von Haus aus als Skriptsprache von Programmen konzipiert die in irgendeiner Weise auf C-Code zurückgreifen können und kann daher ohne zusätzliche Bibliotheken direkt aus C/C++ heraus angesprochen werden. Ohne entsprechende Hilfsfunktionen oder Klassen kann das Registrieren von Funktionen und Klassen schnell sehr umständlich werden. Ich habe dafür vor einiger Zeit einmal Luabind verwendet (Eine Bibliothek zur Anbindung von C++ und Lua) wo der nötige Code zum Registrieren einer Klasse in einem Namespace mit ein paar Membern in etwa wie folgt ausschauen kann:

Code: Alles auswählen

module(_lua_state, "my_namespace")
[
  class_<LuaScene>( "Scene" )
    .def(constructor<>())
    .def("test", &LuaScene::test)
    .def_readonly("test_field", &LuaScene::_test)
    .scope
    [
      def("change", &LuaScene::change)
    ]
];
In Lua kann man dann die Klasse wie folgt verwenden (Nicht getestet!):

Code: Alles auswählen

test_scene = my_namespace:Scene()
test_scene:change("2nd-level")
Die Syntax von Lua ist allerdings recht gewöhnungsbedürftig, daher würde ich eher auf Python, Javascript oä. setzten, wobei ich mich damit selbst eigentlich auch noch nicht wirklich beschäftigt habe. In FlightGear wird zb. Nasal eingesetzt, eine ua. stark an Javascript angelehnte Sprache. Auch Python ist von der Syntax und auch den dahinter liegenden Prinzipien deutlich näher an C++ als Lua.

Re: Scripting mit Lua bzw. Python

Verfasst: Do Nov 08, 2012 8:50 am
von Glocke
fat-lobyte hat geschrieben:Von Python weiß ich, dass es eine API für C gibt: http://docs.python.org/3/c-api/
Diese mit C++ zu benutzen ist natürlich ziemlich anstrengend.
Xin hat geschrieben:Für Python brauchst Du ein C-Interface für die C++-Klasse.
fat-lobyte hat geschrieben:Daher hat jemand vor einiger Zeit die C++-Python Bibliothek geschrieben, die anscheinend sogar gut genug für Boost war: http://www.boost.org/doc/libs/1_52_0/libs/python/doc/

Das klingt erstmal gut, allerdings hat die Sache einen Haken: Boost.Python hat seit 2003 keine Änderungen gesehen. Ich weiß nicht, ob und wie es mit Python 3 funktioniert, und ob es gröbere Probleme gibt.
Kerli hat geschrieben:Die Syntax von Lua ist allerdings recht gewöhnungsbedürftig, daher würde ich eher auf Python, Javascript oä. setzten, wobei ich mich damit selbst eigentlich auch noch nicht wirklich beschäftigt habe.
Das klingt jetzt alles nicht so toll. Ehrlich gesagt weiß ich nicht was ich jetzt mache :lol: Ich frage mich ob sich der ganze Aufwand mit der Einbindung einer Skriptsprache lohnt, und ob ich nicht einfach das ganze Teil von vorne bis hinten in C++ schreibe. :geek:

LG Glocke

Re: Scripting mit Lua bzw. Python

Verfasst: Do Nov 08, 2012 10:27 am
von Xin
Glocke hat geschrieben:
Xin hat geschrieben:Für Python brauchst Du ein C-Interface für die C++-Klasse.
In der Firma wurde wohl Boost-Python-Modul verwendet, dass Dich hier bei Klassen unterstützen kann. Jedenfalls war man damit zufrieden damit. Python 3 verwenden wir allerdings (noch) nicht:
fat-lobyte hat geschrieben:Daher hat jemand vor einiger Zeit die C++-Python Bibliothek geschrieben, die anscheinend sogar gut genug für Boost war: http://www.boost.org/doc/libs/1_52_0/libs/python/doc/

Das klingt erstmal gut, allerdings hat die Sache einen Haken: Boost.Python hat seit 2003 keine Änderungen gesehen. Ich weiß nicht, ob und wie es mit Python 3 funktioniert, und ob es gröbere Probleme gibt.
Glocke hat geschrieben:Das klingt jetzt alles nicht so toll. Ehrlich gesagt weiß ich nicht was ich jetzt mache :lol: Ich frage mich ob sich der ganze Aufwand mit der Einbindung einer Skriptsprache lohnt, und ob ich nicht einfach das ganze Teil von vorne bis hinten in C++ schreibe. :geek:
Die Überwindung von Sprachkonzeptgrenzen würde ich sowieso grundsätzlich eher vermeiden. Das lässt sich aber nicht immer vermeiden.
Ausschlaggebend für die Entscheidung ist immer: Was möchte man eigentlich erreichen?

Re: Scripting mit Lua bzw. Python

Verfasst: Do Nov 08, 2012 11:02 am
von Glocke
Imho werden Scriptsprachen ja verwendet, um Teile der Programmlogik "schneller" realisieren zu können. Soweit ich das überblicke, geht dieses "schneller" auf Kosten von Performance (die Skripte werden ja vermutlich interpretiert) und Typsicherheit (gerade wenn ich da an Python denke). Ich frage mich derzeit, ob das wirklich so "gut" ist - mal abgesehen vom Aufwand, das sinnvoll einzubauen.

LG Glocke

Re: Scripting mit Lua bzw. Python

Verfasst: Do Nov 08, 2012 1:41 pm
von Xin
Glocke hat geschrieben:Imho werden Scriptsprachen ja verwendet, um Teile der Programmlogik "schneller" realisieren zu können. Soweit ich das überblicke, geht dieses "schneller" auf Kosten von Performance (die Skripte werden ja vermutlich interpretiert) und Typsicherheit (gerade wenn ich da an Python denke). Ich frage mich derzeit, ob das wirklich so "gut" ist - mal abgesehen vom Aufwand, das sinnvoll einzubauen.
Rapid-Prototyping-Sprachen - also besonders gerne auch dynamisch typisierte Sprachen - helfen dabei "Programmlogik" schneller zu implementieren, weil sie teilweise "Boilerplate" (Quelltext, der nicht zur Programmlogik gehört) ersparen, man also mehr rapid ist.

Wichtig ist dabei aber eben auch das "Prototype": Es ist nicht zum sinnvollen Einsatz gedacht. Das bedeutet nicht, dass ein sinnvoller Einsatz nicht möglich wäre, aber es geht eben um schnell eine Logik zu implementieren und zu testen - nicht um sicher oder schnell ausführbar.

Das ist dann zum Beispiel gut, wenn Dinge "rapid" austauschbar sein sollen. Ein Plugin in C/C++ entspräche einer .dll, die erst aufwendig kompiliert werden muss, während man in ein Python-Skript "rapid" mal kopieren und dann einfach drin rumexperimentieren kann.

Diese Sprachen haben also vollkommen unterschiedliche Ansätze. Und am Ende wieder die Frage: Was brauchst Du für Dein konkretes Problem? ^^
(wobei "Ich will's halt mal ausprobieren" kein schlechter Grund ist)

Re: Scripting mit Lua bzw. Python

Verfasst: Do Nov 08, 2012 1:45 pm
von Glocke
Xin hat geschrieben:Und am Ende wieder die Frage: Was brauchst Du für Dein konkretes Problem? ^^
(wobei "Ich will's halt mal ausprobieren" kein schlechter Grund ist)
Zunächst erstmal zum ausprobieren :) - aber direkt mit Klassen. Dabei würde ich gerne vom C++ Code in's Skript callen (mit z.B. einer Instanz im Gepäck), die modifizieren und dann die Instanz vom Skript zurück in seine C++-"Heimat" schicken.

Und dann, wenn ich weiß wie es sich damit genau verhält, überlege ich mir den nächsten Schritt. Für mich ist dabei vor allem wichtig,

Mal ein "Beispiel" (oder eines, das mal ein Beispiel werden will :D )

C++ Code

Code: Alles auswählen

class Foo {
    protected:
        int x;
    public:
        Foo(int x) { this->x = x; }
        void increase() { this->x += 1; }
};

int main() {
    Foo* myobject = new Foo(5)
    Interpreter* i;
    load_script(i, "test.py");
    exec_func(i, "handle_foo", myobject);
    // do other stuff
    free_script(i);
}
Und dazu das Python-Beispiel:

Code: Alles auswählen

def handle_foo(obj):
    obj.increase()
    # do other stuff etc.
Wahrscheinlich wäre das die utopische eierlegende Wollmilch-Sau ^^