Я хочу порекомендовать Angelscript:
http://www.angelcode.com/angelscript/
Это чертовски легко интегрировать с C ++ и имеет многопоточность и все.
Пример интеграции:
r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert( r >= 0 );
Ты не можешь сделать это проще. Классы имеют такой же синтаксис, но как METHOD вместо asFUNCTION. Он также поддерживает экспорт классов, наличие фабрик и поставляется с некоторыми premades, такими как string и math.
Сам язык представляет собой смесь C ++, Java и Python, но действительно хорош.
Попробуй, я влюбился в него, как только понял, как им пользоваться.
Ни один язык сценариев, который я пробовал, не был так легко интегрировать, как Angelscript. И я очень много пробовал, например, Python, LUA, Javascript и т. Д.
edit: Некоторый код из моей программы показывает интеграцию класса для вас:
// Registering the interface to angelscript
void NLBoundingBox::registerWithAngelScript( asIScriptEngine* e )
{
AS_ERR_CHECK(e->RegisterObjectType("NLBoundingBox", 0, asOBJ_REF));
AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "bool intersects(const NLBoundingBox@)", asMETHOD(NLBoundingBox, intersects), asCALL_THISCALL));
AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "bool isPointInside(f32 x, f32 y)", asMETHODPR(NLBoundingBox, isPointInside, (f32,f32), bool), asCALL_THISCALL));
AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "void translate(f32 x, f32 y)", asMETHODPR(NLBoundingBox, translate, (f32,f32), void), asCALL_THISCALL));
AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "void translateTo(f32 x, f32 y)", asMETHODPR(NLBoundingBox, translateTo, (f32,f32), void), asCALL_THISCALL));
AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "void rotateAroundCenter(f32 angle)", asMETHOD(NLBoundingBox, rotateAroundCenter), asCALL_THISCALL));
// Behaviour: Factory and Refs
AS_ERR_CHECK(e->RegisterObjectBehaviour("NLBoundingBox", asBEHAVE_FACTORY, "NLBoundingBox@ NLBoundingBox()", asFUNCTIONPR(factory, (void), NLBoundingBox*), asCALL_STDCALL));
AS_ERR_CHECK(e->RegisterObjectBehaviour("NLBoundingBox", asBEHAVE_RELEASE, "void NLBoundingBox()", asMETHOD(NLBoundingBox, release), asCALL_THISCALL));
AS_ERR_CHECK(e->RegisterObjectBehaviour("NLBoundingBox", asBEHAVE_ADDREF, "void NLBoundingBox()", asMETHOD(NLBoundingBox, addRef), asCALL_THISCALL));
}