Vergleich von C oder C++ -embedded Scriptsprachen
-
Hallo,
ich suche Leute die sich gut mit den Scriptsprachen Javascript, Lua oder Python auskennen.
Für mein Projekt PodBall (http://lars.ruoff.free.fr/podball/) untersuche ich z.Zt. die Möglichkeit Scriptsprachen zum Steuern der KI einzubinden.
(Hauptprogramm in C++).
Dazu muss ich vor allem folgenden Fragen klären:
* Kann man die Sprache ohne grosse Mühe in C++ einbinden? (Die Frage ist praktisch geklärt, da ich mich auf Scriptsprachen beschränke bei denen man das eben kann.)
* Ich muss Skripts für verschiedene Module getrennt voneinander laufen lassen. Also muss es möglich sein verschiedene Interpreter/VMs/Stacks der Scriptumgebung etc. parallel zu betreiben.
* Ich würde die Befugnisse der Scripts gerne auf das nötigste beschränken. z.B. sollen die Scripts aus Sicherheitsgründen nicht auf das Filesystem zugreifen können, kein Netzwerk etc. Eben in einer beschränkten "Sandbox" laufen.
* Da das ganze ein Programmierwettbewerb ist, müssen die Scripts in einer From vorliegen können bei der man nicht den Quelltext sieht. Es muss als entweder Bytecode oder eine Möglichkeit zum "Obfuskieren" geben.da ich die einzelnen Sprachen und Umgebungen nur oberflächlich kenne, wäre ich dankbar wenn mir jemand (zu der Sprache die er kennt) möglichst viele Infos beisteuern könnte.
Meine bisherigen Erkenntnisse sind hier schematisch zusammengetragen:
http://trac6.assembla.com/podball/wiki/PodballScriptingUnd wer noch weitere C-embeddable Sprachen kennt kann das auch hier sagen.
(Die Sprache sollte einen hinreichenden Bekanntheitsgrad haben)Scrontch.
-
Ich finde ja Lua eine sehr hübsche Sprache (von Idee und Syntax her). Wie ich sehe, erfüllt sie auch alle deine Anforderungen. Die Sandbox ist kein Problem, da in der Lua-Standardbibliothek gar keine entsprechenden Funktionen verfügbar sind. Diese muss im Zweifelsfall das Programm verfügbar machen. Schön sieht man das z.B. bei Addons für World of Warcraft. Dort gibt es aus Sicherheitsgründen nichtmal einen banalen Sleep-Befehl, von Filesystem-Zugriff oder ähnlichem ganz zu schweigen.
Edit, ich korrigiere: in der Standardbibliothek gibt es Funktionen z.B. für File-Zugriff, aber wie man an World of Warcraft sieht, ist es für die Hostanwendung offenbar möglich, diese nicht verfügbar zu machen.
-
Für Javascript ist Flusspferd ziemlich praktisch: http://flusspferd.org/0.9/docs/cpp-tutorial.html
-
ipsec schrieb:
Ich finde ja Lua eine sehr hübsche Sprache (von Idee und Syntax her). Wie ich sehe, erfüllt sie auch alle deine Anforderungen. Die Sandbox ist kein Problem, da in der Lua-Standardbibliothek gar keine entsprechenden Funktionen verfügbar sind. Diese muss im Zweifelsfall das Programm verfügbar machen. Schön sieht man das z.B. bei Addons für World of Warcraft. Dort gibt es aus Sicherheitsgründen nichtmal einen banalen Sleep-Befehl, von Filesystem-Zugriff oder ähnlichem ganz zu schweigen.
Edit, ich korrigiere: in der Standardbibliothek gibt es Funktionen z.B. für File-Zugriff, aber wie man an World of Warcraft sieht, ist es für die Hostanwendung offenbar möglich, diese nicht verfügbar zu machen.
Naja, wie genau das geht würde ich gerne herausfinden.
War vielleicht nur mit früheren Versionen möglich, denn dort gab es scheinbar verschiedene Funktionen um verschiedene Stnadardbibiliotheken zu laden:
luaopen_io(L);
luaopen_base(L);
luaopen_table(L);
luaopen_string(L);
luaopen_math(L);
luaopen_loadlib(L);Entsprechend konnte man einfach welche weglassen.
Jetzt gibt es scheinbar nur noch:
void luaL_openlibs (lua_State *L);
- Opens all standard Lua libraries into the given state.Zumindest scheinen das die Beispiele die ich gefunden habe anzudeuten.
Weiss da jemand näheres drüber?
-
rüdiger schrieb:
Für Javascript ist Flusspferd ziemlich praktisch: http://flusspferd.org/0.9/docs/cpp-tutorial.html
Danke, aber V8 sieht eigentlich auch sehr gut aus.
http://code.google.com/p/v8/
Und ein Hilfsmittel dazu:
http://code.google.com/p/cproxyv8/
-
scrontch schrieb:
Naja, wie genau das geht würde ich gerne herausfinden.
War vielleicht nur mit früheren Versionen möglich, denn dort gab es scheinbar verschiedene Funktionen um verschiedene Stnadardbibiliotheken zu laden:
luaopen_io(L);
luaopen_base(L);
luaopen_table(L);
luaopen_string(L);
luaopen_math(L);
luaopen_loadlib(L);Entsprechend konnte man einfach welche weglassen.
Jetzt gibt es scheinbar nur noch:
void luaL_openlibs (lua_State *L);
- Opens all standard Lua libraries into the given state.Ich hab ma fix in den Lua-Sourcecode geguckt
static const luaL_Reg lualibs[] = { {"", luaopen_base}, {LUA_LOADLIBNAME, luaopen_package}, {LUA_TABLIBNAME, luaopen_table}, {LUA_IOLIBNAME, luaopen_io}, {LUA_OSLIBNAME, luaopen_os}, {LUA_STRLIBNAME, luaopen_string}, {LUA_MATHLIBNAME, luaopen_math}, {LUA_DBLIBNAME, luaopen_debug}, {NULL, NULL} }; LUALIB_API void luaL_openlibs (lua_State *L) { const luaL_Reg *lib = lualibs; for (; lib->func; lib++) { lua_pushcfunction(L, lib->func); lua_pushstring(L, lib->name); lua_call(L, 1, 0); } }
Statt
luaL_openlibs
kannste dir nach dem gleichen Schema ganz einfach eine angepasste Version schreiben.
-
void luaL_register (lua_State *L, const char *libname, const luaL_Reg *l);
http://www.lua.org/manual/5.1/manual.html#7.3
Vielleicht kann man auch was mit package.loadlib oder so machen.
-
Danke!
Damit erreicht Lua als erstes die "vier Sterne".
Wie seiht's mit den anderen aus?