programa - para que sirve c++
Lenguaje de scripting para C++ (10)
Me estoy poniendo un poco oxidado en los lenguajes de scripting, siempre que estén apareciendo como hongos últimamente :)
Hoy pensé que sería bueno tener un lenguaje de scripting que hablara sin problemas con C ++, es decir, que pudiese usar clases de C ++, y, lo más importante para mí, podría compilarse en C ++ o en algunos DLL / .SO (más su. h) para poder vincularlo a mi programa C ++ y hacer uso de las clases que el guión define o implementa.
Sé que podría insertar cualquier lenguaje de scripting popular como lua, ruby, python ... pero la interfaz generalmente incluye algún tipo de función "eval" que evalúa el código de scripting proporcionado. Dependiendo de la herramienta utilizada para acoplar C ++ y el lenguaje de scripting, la integración de callbacks del script en C ++ podría ser más o menos fácil de escribir, pero no he visto ningún lenguaje de scripting que realmente me permita escribir módulos independientes que son expuesto como .h y .so / dll a mi programa (tal vez en la línea de un lenguaje de scripting que genera código C ++).
¿Conoces alguna herramienta / lenguaje de scripting?
Gracias por adelantado.
PD. He estado pensando en las líneas de Vala o Haskell''s GHC. Generan C, pero no C ++ ...
Buena pregunta, a menudo he pensado en esto yo mismo, pero lamentablemente no hay una solución fácil para este tipo de cosas. Si estás en Windows (supongo que no), entonces podrías lograr algo así creando componentes COM en C ++ y VB (considerando eso como un lenguaje de scripting). La conversación ocurre a través de las interfaces COM, que es una buena manera de interoperar entre idiomas dispares. Lo mismo ocurre con los lenguajes basados ββen .NET que pueden interactuar entre ellos.
También estoy ansioso por saber si algo así existe para C ++, preferiblemente de código abierto.
El motor V8 de Google está escrito en C ++, espero que puedas integrarlo en un proyecto. Hablan de hacer eso en este artículo .
Esto está un poco fuera de mi área de especialización, pero estoy dispuesto a arriesgar los votos a la baja. :-)
Boost::Python parece ser lo que estás buscando. Utiliza un poco de macro magia para hacer sus cosas, pero expone las clases de Python a C ++ bastante limpiamente.
La pregunta generalmente formulada en este contexto es: ¿cómo expongo mis clases de C ++ para que puedan ser creadas desde el script? Y la respuesta es a menudo algo así como http://www.swig.org/
Estás haciendo la pregunta opuesta y parece que estás complicando un poco las cosas. Un motor de secuencias de comandos que produce archivos .h y .so no sería realmente un motor de secuencias de comandos, ¡sería un compilador! En ese caso, podrías usar C ++.
Los motores de scripting no funcionan así. Les pasa un script y algunas devoluciones de llamada que proporcionan un conjunto de funciones que se pueden invocar desde el script, y el motor interpreta el script.
Los siguientes son más orientados a la integración de C ++ que los enlaces de lenguaje:
- ChaiScript : tratando por el momento en un pequeño proyecto, interesante, ¡este está MADE con C ++ en mente y funciona simplemente con incluir un encabezado! No estoy seguro si todavía es bueno para un gran proyecto, pero lo veré, ¡pruébelo para probarlo!
- Falcon : probando un gran proyecto, excelente; no es un "one include embed" como ChaiScript, pero es porque es realmente flexible, y se cree que se usa en C ++ (solo el código C ++ en libs). He decidido mantenerlo para mi proyecto más grande que requiere una gran cantidad de flexibilidad de scripting (comparable a ruby ββ/ python)
- AngelScript : aún no lo intenté
- GameMonkey : aún no lo intenté
- Io - no lo intentó todavía
Para usted, si realmente desea escribir su módulo de scripting en C ++ y exponerlo fácilmente al lenguaje de scripting, recomiendo ir con Falcon . Está totalmente HECHO en C ++, todos los módulos / bibliotecas están escritos de esa manera.
Pruebe el lenguaje de programación Ring http://ring-lang.net
(1) Extensión que utiliza los lenguajes de C / C ++ https://en.wikibooks.org/wiki/Ring/Lessons/Extension_using_the_C/C%2B%2B_languages
(2) Intérprete de anillo incrustante en programas C / C ++ https://en.wikibooks.org/wiki/Ring/Lessons/Embedding_Ring_Interpreter_in_C/C%2B%2B_Programs
(3) Generador de código para envolver Bibliotecas C / C ++ https://en.wikibooks.org/wiki/Ring/Lessons/Code_Generator_for_wrapping_C/C%2B%2B_Libraries
Pruebe lua: http://www.lua.org/
Para usar las clases de C ++ en lua, puede usar:
Para generar el uso vinculante tolua ++: http://www.codenix.com/~tolua/
Toma un encabezado limpio como entrada y genera un archivo ac que hace el trabajo duro. Fácil, agradable y un placer trabajar con él.
Para usar objetos Lua en C ++, tomaría el enfoque de escribir un objeto Proxy genérico con métodos como (field, setField, callMethod, methods, fields).
Si quiere un dll, podría tener .lua como recurso (en Windows, no sé cuál podría ser un equivalente adecuado para Linux) y en su DllMain inicializar su objeto proxy con el código lua.
El código c ++ puede usar el objeto proxy para llamar al código lua, con tal vez algunos métodos de introspección en el proxy para facilitar esta tarea.
Podrías reutilizar el objeto proxy para cada biblioteca lua que quieras escribir, simplemente cambiando el código lua que se le proporcionó.
Puedes hacer esto con Lua, pero si tienes muchas clases, querrás una herramienta como SWIG o toLua ++ para generar algo del código de pegamento para ti.
Ninguna de estas herramientas manejará la parte inusual de su problema, que es tener un archivo .h detrás del cual se oculta un lenguaje de scripting, y hacer que su código C ++ invoque scripts sin saber que eso son scripts. Para lograr esto, deberá hacer lo siguiente:
Escriba el código de pega usted mismo. (Para Lua, esto es relativamente fácil, hasta que ingresas a las clases, con lo cual no es tan fácil, por lo que existen herramientas como SWIG y toLua ++).
Ocultar detrás de la interfaz algún tipo de estado global del intérprete de scripting.
Supongamos que tiene múltiples archivos .h que cada uno se implementa mediante scripts, debe decidir cuáles comparten estado en el lenguaje de scripting y cuáles usan estados de scripting separados. (Lo que básicamente tiene es una máquina virtual para el lenguaje de scripting, y los extremos son (a) todos los archivos .h usan la misma máquina virtual en común y (b) cada archivo .h tiene su propia máquina virtual separada y aislada. Otras opciones son más Complicado.)
Si decides hacerlo tú mismo, escribir el código de pegamento para convertir las tablas de Lua en clases de C ++ (para que el código de Lua se parezca a C ++ para el resto del programa) es bastante sencillo. Yendo en la otra dirección, donde envuelve su C ++ en Lua (para que los objetos de C ++ miren los guiones como los valores de Lua) es un gran dolor en el culo.
No importa lo que hagas, tienes algo de trabajo por delante.
Soy el autor de LikeMagic, una biblioteca de enlace C ++ para el lenguaje Io. (No soy el autor de Io.)
http://github.com/dennisferron/LikeMagic
Uno de mis objetivos explícitos con LikeMagic es la interoperabilidad C ++ completa y total, en ambas direcciones. LikeMagic clasificará los tipos de Io nativos como tipos de C ++ (incluida la conversión entre contenedores STL y el tipo de lista nativa de Io) y representará clases, métodos, campos y matrices de C ++ dentro de Io. ¡Incluso puede pasar un bloque de código Io fuera del entorno Io y usarlo en C ++ como un functor!
Envolver tipos de C ++ para consumo en el script Io es simple, rápido y fácil. El acceso a los objetos de script desde C ++ requiere una función de "evaluación" como la descrita, pero la conversión de tipos basada en plantilla y la clasificación facilita el acceso al resultado de ejecutar una secuencia de scripts. Y existe la capacidad antes mencionada de convertir objetos Io block () en funtores C ++.
En este momento, el proyecto aún se encuentra en las primeras etapas, aunque está en pleno funcionamiento. Todavía tengo que hacer cosas como documentar sus pasos de compilación y dependencias, y solo se puede compilar con gcc 4.4.1+ (no con Microsoft Visual C ++) porque usa las características de C ++ 0x aún no admitidas en MSVC. Sin embargo, es totalmente compatible con Linux y Windows, y se planea un puerto Mac.
Ahora las malas noticias: hacer que los scripts produzcan archivos .h y archivos .so o .dll invocables desde C ++ no solo requeriría un compilador (de un tipo) sino que también tendría que ser un compilador JIT . Eso es porque (en muchos lenguajes de scripting, pero más especialmente en Io) los métodos y campos de un objeto no se conocen hasta el tiempo de ejecución, y en Io, incluso se pueden agregar y eliminar métodos de objetos en vivo. Al principio iba a decir que el solo hecho de que me preguntes esto me hace preguntarme si tal vez no entiendes realmente qué es un lenguaje dinámico. Pero sí creo en una forma de diseño en la que primero intentas imaginar la forma ideal o más sencilla de hacer algo, y luego trabajas hacia atrás desde allí hacia lo que es realmente posible. Admitiré, desde el punto de vista de la facilidad de uso, que lo que describes es más fácil de usar.
Pero si bien es ideal, y apenas posible (usando un lenguaje de script con compilación JIT), no es muy práctico, así que aún no estoy seguro si lo que estás pidiendo es lo que realmente quieres. Si los archivos .h y .so / .dll están JITted de la secuencia de comandos, y la secuencia de comandos cambia, necesitaría recompilar su programa C ++ para aprovechar el cambio. ¿No viola eso el beneficio principal de usar script en primer lugar?
La única forma en que es práctico sería si las interfaces definidas no cambian los scripts, y solo se están creando envoltorios de C ++ para funciones de script. Tendría muchas funciones de C ++ como:
int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }
Debo admitir que es un código de aspecto más limpio desde el punto de vista de los llamadores de la función de envoltura. Pero si eso es lo que quieres, ¿por qué no simplemente utilizas la reflexión en el lenguaje de scripting y generas un archivo .h fuera de las listas de métodos almacenadas en los objetos del script? Este tipo de reflexión se puede hacer fácilmente en Io . En algún momento planeo integrar el traductor de origen a fuente OpenC ++ como una biblioteca invocable de LikeMagic, lo que significa que incluso podría usar un generador de código C ++ robusto en lugar de escribir cadenas.