Pregunta

Estoy en el proceso de implementación de una aplicación multiplataforma (Mac OS X, Windows y Linux) que se va a hacer un montón de análisis intensivo de la CPU de los datos financieros. La mayor parte del motor de análisis será escrito en C ++ por razones de velocidad, con un motor de scripting accesible al usuario interactuar con el C ++ de pruebas de motor. Quiero escribir varios front-end de secuencias de comandos con el tiempo para emular otro software popular entre los usuarios de grandes bases existentes. El primer frente será un lenguaje VisualBasic-como secuencias de comandos.

Estoy pensando que LLVM sería perfecto para mis necesidades. El rendimiento es muy importante debido a la gran cantidad de datos; Puede tomar horas o días para ejecutar una única ejecución de pruebas para obtener una respuesta. Creo que el uso de LLVM también me permite utilizar una solución de back-end sola mientras yo implementar diferentes front-end para diferentes sabores del lenguaje de programación en el tiempo.

El motor de prueba en sí será separado de la interfaz y la prueba será incluso tener lugar en un proceso separado con el progreso y los resultados que se informa a la interfaz de administración de pruebas. Las pruebas constarán de código de scripting integrado con el código de pruebas de motor.

En una aplicación previa de un sistema de ensayo comercial similar que escribí, construyó un intérprete rápido que fácilmente interfaz con la biblioteca de la prueba, ya que fue escrito en C ++ y se vincula directamente a la biblioteca de pruebas de motor. Devoluciones de llamada de código de secuencias de comandos para probar objetos de biblioteca de traducción involucrado entre los formatos con una sobrecarga significativa.

Me estoy imaginando que con LLVM, pude poner en práctica las devoluciones de llamada en C ++ directamente, por lo que podría hacer que el código de secuencias de comandos de trabajo casi como si hubiera sido escrito en C ++. Del mismo modo, si todo el código fue compilado en formato de código byte LLVM, parece que los optimizadores llvm podría optimizar través de los límites entre el lenguaje de script y el código de pruebas de motor que fue escrito en C ++.

Yo no quiero tener que compilar el motor de prueba cada vez. Idealmente, me gustaría compilación JIT sólo el código de secuencias de comandos. Para las pruebas pequeñas, me olvidaría de optimización algunos pases, mientras que para las pruebas grandes, me realizo optimizaciones completo durante el enlace.

Así es esto posible? ¿Puedo precompilar el motor de prueba en un archivo objeto .o o .a archivo de la biblioteca y luego enlazar en el código de secuencias de comandos utilizando el JIT?

Por último, a ser posible, me gustaría tener el código de secuencias de comandos implementar métodos específicos como subclases de una clase específica de C ++. Así que el C ++ pruebas de motor sólo se vería objetos C ++ mientras que el código compilado JIT código de secuencias de comandos de configuración que implementa algunos de los métodos de los objetos. Parece que si usara el nombre correcto algoritmo de destrucción sería relativamente fácil de configurar la generación LLVM para el lenguaje de script para parecerse a una llamada al método C ++ que a su vez podría estar vinculado en el motor de prueba.

De este modo la etapa de vinculación iría en dos direcciones, llamadas desde el lenguaje de script en el motor de pruebas objetos para recuperar la información de precios información y estado de prueba y las llamadas desde el motor de prueba de los métodos de algunos C en particular ++ objetos en los que el código no fue suministrada de C ++, pero desde el lenguaje de script.

En resumen:

1) enlace Can I en los archivos precompilados (ya sea .BC, .o, o .a) como parte de la compilación JIT, el proceso de generación de código?

2) ¿Puedo enlace de código mediante el proceso anteriormente en 1) de tal manera que soy capaz de crear código que actúa como si todo fue escrito en C ++?

¿Fue útil?

Solución

  1. Sí se puede! Dependiendo de la versión de LLVM utiliza hay diferentes llamadas a la API. necesitará llvm :: getBitcodeModuleProvider en 2.5.
  2. La forma más fácil de llamar funciones de C ++ es crear una función (función llvm :: :: Crear) utilizando la bandera llvm :: :: Función ExternalLinkage y luego addGlobalMapping a hacer que apunte a su función en C ++.

Otros consejos

  1. Creo que sí.
  2. Este es peludo. Es necesario para que coincida con el ABI de C ++ de las funciones que se están poniendo en, y necesita asegurarse de que el código generado utiliza la misma estructura de datos, clases, diseño, etc (a través de un equivalente de archivos de cabecera). El C ++ ABI tiene un buen número de matices y problemas de portabilidad. Tal vez un prototipo con la realización de la interoperabilidad con C en primer lugar. clang tiene un soporte limitado para C ++ en este momento.

1) Se puede cargar y enlazar archivos .BC, .o archivos si se han comnpiled a un archivo .so debe ser cargable y los símbolos en ellos debería ser capaz de ser utilizado.

2) Mientras usted no quiere hacer cosas horribles con las devoluciones de llamada probablemente puede pasar punteros a funciones C estándar y hacer devoluciones de llamada de punteros de función. Puede hacer ciertas otras cosas también, pero se trata de tratar de definir ++ objetos o las plantillas de C o funciones miembro llamada mientras no ser un compilador de C ++ es algo que quieres no lo hacen.

se debe conocer la ABI de C ++, usted debe saber sobre la plataforma usted apunta, es necesario conocer todo tipo de cosas, que efectivamente debe ser un compilador de C ++ para generar código que parece que es C ++. El nombre trituradora es una de las partes más molestos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top