Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make a nasty C++ program scriptable with Python and/or Lua? [closed]

I'm confronted with the task of making a C++ app scriptable by users. The app has been in development for several years with no one wasting a thought on this before. It contains all sorts of niceties like multithreading, template wizardry and multiple inheritance. As the scripting language, Python is preferred, but Lua might be accepted if it is significantly easier to implement.

Question 1

From what I have learned so far, there are broadly speaking two ways to integrate Python/Lua with C++ : "extending" and "embedding".

In this case, it looks like I need both. The scripting language need access to objects, methods and data from the app but needs to be called by the app once the user has written the script - without restarting anything.

How is this usually done in the real world?

Question 2

There seems to be a bewildering array of of manual solutions and binding generators out there, all of them less than perfect.

  • swig, pyste, Py++, ctypes, Boost.Python sip, PyCXX, pybindgen, robin, (Cython/Pyrex, Weave)
  • CppLua, Diluculum, Luabind, Luabridge, LuaCpp, Luna/LunaWrapper, MLuaBind, MultiScript, OOLua, SLB, Sweet Lua, lux (this list from the lua wiki)
  • CPB, tolua, tolua++, toLuaxx, luna and again swig

Most commments on these found on the web are a little out of date. For example, swig is said to be difficult in non-trivial cases and to generate incomprehensible code. OTOH, it has recently gone to v2.0.

Some of the above use pygccxml to let gcc analyze the C++ code and then genarate the binding. I find this idea appealing, as gcc probably understands the code better than i do :-). Does this work well?

Testing them all might easily cost me half of the time allocated for the whole project.

So, which ones do you recommend?

like image 783
Manuel Avatar asked Jul 21 '10 12:07

Manuel


People also ask

Which is faster Lua or Python?

06. Against Lua, Python is slow in speed. It is faster in speed in comparison to Python.

Can Python and C++ work together?

1.5.It is also possible to embed Python in a C++ program; precisely how this is done will depend on the details of the C++ system used; in general you will need to write the main program in C++, and use the C++ compiler to compile and link your program. There is no need to recompile Python itself using C++.

Is Lua better than C++?

The only "real" advantages of Lua over C++ is that you don't have to compile it, and there are a lot of premade Lua interpreters that you can integrate really easily. Sure, you could use C++, but then you've either gotta interpret it, or dynamically link files to your code to use it, and that's just a pain.


1 Answers

I wouldn't recommend swig as it's hard to get it to generate satisfactory binding in complex situations: been there, done that. I had to write a horrible script that "parsed" the original C++ code to generate some acceptable C++ code that swig could chew and generate acceptable bindings. So, in general: avoid ANY solution that relies on parsing the original C++ program.

Between Lua and Python: I have found Lua MUCH, MUCH better documented and more cleanly implemented. Python has a GIL (global lock), whereas with Lua, you can have an interpreter instance in each thread, for example. So, if you can choose, I'd recommend Lua. It is smaller language, easier to comprehend, easier to embed (much cleaner and smaller API, with excellent documentation). I have used luabind for a small project of mine and found it easy to use.

like image 92
zvrba Avatar answered Oct 05 '22 07:10

zvrba