2010-09-23 10 views
8

Soy realmente nuevo en C++ y me he topado con un problema que no he podido resolver al leer documentaciones.Integración de un lenguaje de script en una aplicación de C++

Quiero incrustar un lenguaje de script en mi aplicación C++. Ese lenguaje podría ser javascript, lua o preferiblemente python.

No estoy buscando algo como Boost.Python/swig, algo que sea capaz de ajustar mis funciones/clases de C++ a una interfaz de python, sino a una función python_evaluate_and_return_result_as_variable("my_code");.

que tienen un montón de estructuras que contienen unos números enteros:

struct my_integers { 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
}; 

ahora quiero hacer algunos cálculos con estos números enteros, por ejemplo:

i.a = i.c * i.e; 

La matemática que quiero hacer va a cambiar mucho en el futuro y necesito personas que me permitan cambiar las matemáticas sin tener acceso al código C++.

Estoy pensando en una estructura de código como este:

  1. inicializo mi estructura y llenarlo con los valores iniciales
  2. me carga una función de Python externo, digamos que "my_python_function", que lleva la estructura como argumento y lo hace matemáticamente antes de devolverla.
  3. consigo mi estructura como i = my_python_function_cppwrapper(i)

¿Es posible algo así? Busqué mucho en Google para esto, pero lo único que encuentro son envoltorios que proporcionan funcionalidades C++ -> python (o al revés) sin realmente interactuar con las variables.

Estaría muy agradecido por cualquier ayuda,
Robin.

+0

¿Por qué no Boost.Python? Funciona y le permitirá hacer exactamente lo que quiere. – wilx

Respuesta

8

¿Por qué no utilizar Boost.Python? Puede exponer sus clases de datos a Python y ejecutar un script/función como se describe en here.

+0

Muchas gracias, eso es lo que he estado buscando. Debo haberme perdido la sección cuando miré por encima de Boost.Python. – Robin

2

¿Qué le parece incrustar un motor de JavaScript, como V8?

+0

Creo que me estoy quedando con Python, pero puedo usar V8 en mi próximo proyecto. Gracias por la pista, el único motor de javascript en el que podía pensar era spidermonkey. – Robin

6

Si simplemente desea ejecutar scripts de Python desde C/C++, utilice the Python C API. En su código C/C++:

PyRun_SimpleString("import math; x = math.sqrt(2 * 2)"); 

Para las cosas más complicadas, que tendrá que mirar los documentos de la API, pero es bastante sencillo.

+0

Eso no funciona para mí, ya que necesito pasar y extraer variables, pero gracias por tu comentario :) – Robin

8

La documentación de Python tiene una página en embedding Python en una aplicación C o C++.

1

no olvides el abuelo del lenguaje de scripts incrustado - tcl.

TCL tiene buen envoltorio v C++ (modelado en Boost.Python) que hace que sea trivial para invocar y para cablear las devoluciones de llamada a su código

1

Lua funciona bastante bien también, sobre todo porque su pequeño, es compatible con ANSI C , tiene una huella de memoria baja junto con una gran lista de mensajes y wiki.Si necesita aún más velocidad, existe una versión x86 de 32 y 64 bit jit (luajit). La vinculación se puede hacer con una variedad de herramientas/bibliotecas, como swig o lunar (la wiki las enumera todas). El único problema que puedo ver es vincular los miembros de la estructura para que puedan ser referenciados directamente (es decir: struct.member = 4), aunque es posible configurar esto con metatatos que tienen métodos get y set vinculados a nombres de variables

1

usted dice que usted no está buscando algo para envolver sus funciones C/clases ++ en una interfaz de Python, pero si quieres código Python pueda ser capaz de referirse a los miembros de su C++ my_integers estructura, que es envoltura clases de C++ en una interfaz de Python. Por supuesto, puede envolver tantas o tan pocas clases como desee; en este ejemplo, incluiría my_integers, luego embed a Python interpreter para hacer cosas con my_integers.

1

Para algo tan simple como usted describe, podría implementar un intérprete para su propio "pequeño lenguaje". Incluso podría llamarlo el lenguaje "Robin". ;-)

1

Yo consejo usando Lua como motor de scripting interno. La implementación es solo unas pocas líneas, y aunque ligero, el lenguaje tiene suficiente poder. Entonces no hay necesidad de TCL. Es mejor que mire python, la integración en C++ es bastante fácil, ya que existe una implementación Boost.Python que facilita la integración.

Pero dependiendo de la aplicación, todavía recomendaría Lua.

Cuestiones relacionadas