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.
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
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). –
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