2010-07-11 6 views
14

No tengo ninguna experiencia con llvm o clang, sin embargo. De lo que leí clang se dice que es fácilmente integrable Wikipedia-Clang, sin embargo, no encontré ningún tutorial sobre cómo lograr esto. Entonces, ¿es posible proporcionar al usuario de una aplicación C++ poderes de scripting compilando JIT y ejecutando código definido por el usuario en tiempo de ejecución? ¿Sería posible llamar a las aplicaciones propias clases y métodos y compartir objetos?¿Algún tutorial para incrustar Clang como intérprete de guiones en C++ Code?

editar: Yo preferiría una sintaxis similar a C para el script-Languge (o incluso C++ sí mismo)

Respuesta

10

No conozco ningún tutorial, pero no hay un intérprete ejemplo C en la fuente Clang eso podría ser útil. Puede encontrarlo aquí: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

Probablemente no tenga mucha opción de sintaxis para su lenguaje de scripting si sigue esta ruta. Clang solo analiza C, C++ y Objective C. Si desea alguna variación, puede que tenga su trabajo cortado para usted.

+0

Gracias. Me llevó bastante tiempo ponerlo en marcha, básicamente porque no encontré el ejecutable :) Ahora, después de analizarlo, diría que está a mitad de camino. Ahora necesito averiguar cómo llamar a funciones que están definidas en la parte no jitted. ... alguna idea sobre eso? – FFox

+0

No estoy seguro de lo que quieres decir. Debería poder obtener un puntero a cualquier función que haya compilado. Quizás este tutorial general de LLVM sería útil: http://llvm.org/docs/tutorial/ (capítulo 4, en particular). No espero que pueda usar este intérprete tal como está, pero debería darle una idea de cómo incorporar un intérprete C/C++ en su aplicación. (Ni siquiera lo he usado, solo recordé haberlo visto). –

+1

Ok, esto es lo que hice: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... y realmente funcionó con la ayuda de la buena gente de la lista de correo cfe-dev. ¿Por qué crees que este intérprete no se puede usar en una aplicación? – FFox

0

que no saben de Sonido metálico pero es posible que desee ver en Ch:

http://www.softintegration.com/

Esto se describe como un ojo de gato o independiente c/C++ intérprete. Hay un artículo del Dr. Dobbs con ejemplos de incrustarlo aquí:

http://www.drdobbs.com/architecture-and-design/212201774

no he hecho más que jugar con él, pero parece ser un producto estable y maduro. Es comercial, de código cerrado, pero la versión "estándar" se describe como gratuita tanto para uso personal como comercial. Sin embargo, al mirar la licencia, parece que "comercial" solo puede incluir el uso interno de la empresa, no incrustado en un producto que luego se vende o distribuye. (No soy abogado, así que claramente uno debe consultar con SoftIntegration para estar seguro de los términos de la licencia.)

5

Puede usar clang como una biblioteca para implementar la compilación JIT como se indica en otras respuestas. Luego, tiene que cargar el módulo compilado (por ejemplo, una biblioteca .so).

Para lograr esto, puede usar dlopen (Unix) o LoadLibrary (windows) estándar para cargarlo, luego use dlsym (unix) para referenciar dinámicamente funciones compiladas, digamos una función principal "script" (como) cuyo nombre es conocido. Tenga en cuenta que para C++ tendría que usar símbolos mutilados. Una alternativa portátil es, p. GNU libltdl.

Como alternativa, la "secuencia de comandos" puede ejecutarse automáticamente en el momento de la carga implementando funciones de módulo init o poniendo un código estático (el constructor de un objeto C++ definido globalmente se llamaría inmediatamente).

El módulo cargado puede llamar directamente a cualquier cosa en la aplicación principal. Por supuesto, los símbolos se conocen en tiempo de compilación utilizando los archivos de cabecera de la aplicación principal adecuada.

Si desea agregar fácilmente "complementos" C++ a su programa, y ​​conocer la interfaz del componente a priori (supongamos que su aplicación principal conoce el nombre y la interfaz de una clase cargada desde .h antes de cargar el módulo en la memoria), después de cargar dinámicamente la biblioteca, la clase está disponible para ser utilizada como si estuviera enlazada estáticamente. Solo asegúrese de no intentar crear una instancia de un objeto de clase antes de dlopen() su módulo.

El uso de código estático permite implementar buenos mecanismos de registro automático de complementos también.

0

No estoy seguro de que la incorporación de un compilador C o C++ como Clang es una buena idea en su caso. Porque la "secuencia de comandos", es decir, el código (C o C++) alimentado (¡en tiempo de ejecución!) Puede ser arbitrario, por lo que puede bloquear toda la aplicación. Por lo general, no desea que la entrada del usuario sea defectuosa para poder bloquear su aplicación.

Si desea incrustar un intérprete, elija algo diseñado para tal fin, como Guile o Lua, y tenga cuidado de que los errores en el script no bloqueen la aplicación completa. Vea this answer para una discusión más detallada de la incrustación del intérprete.

Cuestiones relacionadas