¿Es viable hacer un puerto desde una aplicación C ++ a Java a través de LLVM?

8

¿cuán viable es portar una aplicación C ++ a un bytecode Java usando LLVM (supongo que LLJVM)?

El problema es que actualmente tenemos un proceso escrito en C ++ pero un nuevo cliente ha hecho obligatorio poder ejecutar el programa de forma multiplataforma, utilizando la Máquina Virtual de Java, obviamente, sin nativo código (no JNI). La idea es poder llevar el jar generado y copiarlo a diferentes sistemas (Linux, Win, 32 bits - 64 bits) y debería funcionar.

Mirando alrededor parece que es posible compilar código IR de C ++ a LLVM y luego ese código de bytecode de Java. No es necesario que el código generado sea legible.

He probado un poco con cosas similares usando emscripten, esto toma el código C ++ y lo compila a JavaScript. El resultado es JS válido pero totalmente ilegible (parece un asalariado).

  • ¿Alguien hizo un puerto de una aplicación de C ++ a código de bytes de Java usando esta técnica?
  • ¿Qué problemas podríamos enfrentar?
  • ¿Es un enfoque válido para el código de producción?

Para aclarar más mi punto después de algunos comentarios, tal vez el puerto no se usa bien, no espero un código fuente legible como resultado, solo el código de bytes de Java, por lo que ya no es un 'puerto' que se desarrollará más, solo que la plataforma de destino debe ser la JVM de Java, no el juego nativo.

Nota: Soy consciente de que actualmente tenemos algunas bibliotecas de código cerrado y C ++ no estándar, estamos buscando eliminar este código no estándar y todas las bibliotecas de código cercano y usar el software libre de código abierto, así que supongamos que todo el código es estándar Código C ++ con todo el código disponible en tiempo de compilación.

Nota2: no es una opción escribir código C ++ portátil y luego compilarlo en la plataforma de destino deseada, el programa compilado debe ser multiplataforma, por lo tanto, el uso de JVM.

Nota 3: En este momento no estamos buscando soluciones similares aplicadas a Python u otro lenguaje base, pero también me gustaría escucharlas. Con esto quiero decir que nuestro ejecutable de destino debe ser el código de bytes de Java, pero si hay opciones para compilar C ++ a un código compilado de Python válido, también me gustaría conocerlo.

    
pregunta Javier Mr 30.10.2013 - 09:52

1 respuesta

10

Realmente dudo que esto funcione. Es posible que pueda traducir su código en el código de byte de Java, pero no traducirá mágicamente las llamadas de biblioteca a llamadas equivalentes al tiempo de ejecución de Java y las bibliotecas. ¡Puede que ni siquiera haya llamadas de tiempo de ejecución de Java equivalentes! Incluso si elimina todas las bibliotecas propietarias, aún queda con la biblioteca estándar de C ++.

Para concretar esto: su programa C ++ puede contener una llamada a fprintf (). Esa función se implementa en la biblioteca estándar de C y es perfectamente legítimo que un programa de C ++ la llame. El traductor de LLVM a LLJVM probablemente no va a averiguar mágicamente la secuencia de las llamadas de tiempo de ejecución de Java que producirán el resultado equivalente a fprintf () y las sustituirá. Para proporcionar esa instalación se necesitaría esencialmente la reimplementación de los tiempos de ejecución de C y C ++ en Java código de byte.

Hay algunas herramientas que realizan la conversión de C ++ a Java, pero solo convierten un puñado de la biblioteca de ejecución más simple llamadas El resto te queda por descubrir.

    
respondido por el Charles E. Grant 31.10.2013 - 22:37

Lea otras preguntas en las etiquetas