Languages Designed For Embedding

Lua and Javascript (specifically spidermonkey) are two languages which were specifically designed for embedding in a C or C++ application.

The general order of operations for using one of these languages is:

  1. Initialize Scripting Language Context
  2. Add Datatypes to Scripting Language Context
  3. Add Variables to Scripting Language Context
  4. Load Script into Context
  5. Execute Script
  6. Get Results from Context
  7. Close Scripting Language Context

Lua is supported by SWIG, which saves you a lot of work. SWIG generates a method called SWIG_init which accomplishes step #2. It also generates methods SWIG_NewPointerObj and SWIG_ConvertPtr which help you with items #3 & #6 respectively.

In pratice, a simple implementation of this from the Crate Game Engine looks like:

    lua_State *l = lua_open();
 
    luaL_reg lualibs[] = {
        {"base", luaopen_base},
        {"table", luaopen_table},
        /* {"io", luaopen_io}, */
        {"string", luaopen_string},
        {"math", luaopen_math},
        {"debug", luaopen_debug},
        /*{"loadlib", luaopen_loadlib}, */
        /* add your libraries here */
        {SWIG_name, SWIG_init},
        {NULL, NULL}
    };
 
    for(int i=0; lualibs[i].func != 0 ; i++) {
      lualibs[i].func(l);  /* open library */
      lua_settop(l, 0);  /* discard any results */
    }
 
    SWIG_NewPointerObj(l, mWorld, SWIGTYPE_p_CGE__World, false);
    lua_setglobal(l, "mWorld");
    SWIG_NewPointerObj(l, mSystem, SWIGTYPE_p_CGE__System, false);
    lua_setglobal(l, "mSystem");
    SWIG_NewPointerObj(l, useWithObject, SWIGTYPE_p_CGE__Object, false);
    lua_setglobal(l, "useWithObject");
    SWIG_NewPointerObj(l, parentObject, SWIGTYPE_p_CGE__Object, false);
    lua_setglobal(l, "parentObject");
 
    int result = luaL_loadbuffer(l, mScript.c_str(), mScript.length(), "script");
 
    if (result == 0) {
      if (lua_pcall(l, 0, 0, 0) != 0) {
        //Handle Error
      }
 
    } else if (result == LUA_ERRSYNTAX) {
      //Handle Error
    } else if (result == LUA_ERRMEM) {
      //Handle Error
    }
 
    lua_close(l);

Javascript is not supported by SWIG and would require much more code to accomplish the same work.