Tony the Pony
Tony the Pony

Reputation: 41357

Embedding a scripting engine in C++

I'm researching how to best extend a C++ application with scripting capability, and I am looking at either Python or JavaScript. User-defined scripts will need the ability to access the application's data model.

Have any of you had experiences with embedding these scripting engines? What are some potential pitfalls?

Upvotes: 4

Views: 3607

Answers (5)

xijing dai
xijing dai

Reputation: 317

Have a look at angelscript simple and easy to embed, c/c++ like syntax. free and corss-platform. u can get start in a few hrs.

Upvotes: 2

Jerry Coffin
Jerry Coffin

Reputation: 490138

Unless you're really set on Python or Javascript, I'd give some consideration to using Lua. Since it's designed entirely as an embedded scripting engine, it eliminates quite a bit of overlap with what C and C++ already do well. It's also pretty easy to embed as long as you only interface between your code and the Lua engine in terms of C callable functions.

If you want to use a C++ level interface, you might want to take a look at LuaBind, which allows things like a Lua class deriving from (the proxy it generates for) a C++ class you wrote.

Upvotes: 4

Yann Ramin
Yann Ramin

Reputation: 33177

Lua is also a great candidate for embedding in programs. Its very self contained, and even the native cross-language call system isn't bad.

For JavaScript, your best bet right now is to look at V8 (from Google), which is easy enough to work with.

Upvotes: 7

Dirk is no longer here
Dirk is no longer here

Reputation: 368241

Boost::Python, as in wheaties answer, is a very mature solution.

Lua has a reputation for being easy to embed but I have not tried this myself.

As a user of R, I am more interested in embedding R which is possible using the RInside package. A simple example is

#include <RInside.h>                // for the embedded R via RInside

int main(int argc, char *argv[]) {

    RInside R(argc, argv);          // create an embedded R instance 

    R["txt"] = "Hello, world!\n";   // assign a char* (string) to 'txt'

    R.parseEvalQ("cat(txt)");       // eval the init string, ignoring any returns

    exit(0);
}

and there are a couple more examples in the package. RInside essentially provides you a nice wrapper around the R engine using some of the Rcpp interface package.

Upvotes: 1

wheaties
wheaties

Reputation: 35980

It's sure easy to embed Python by using the Boost::Python library (ok, ok, sarcasm.) Nothing is "easy" when it comes to cross-language functionality. Boost has done a great deal to aid such development. One of the developers I've worked with swears on the Boost->Python interface. His code can be programmed by a user in Python, with a REPL built right into the UI. Amazing.

However, my experience has been better observed using SWIG and other languages such as Java. I'm currently working with SWIG to wrap C++ with Python. There's all sorts of gotchas with exceptions, threading, cross-language polymorphism and the like.

I'd look at these two places first. As I said, nothing will be "easy" but both these make life more livable.

Upvotes: 6

Related Questions