2009-05-28 5 views
6

Tengo una aplicación escrita en C++ (hace un uso intensivo de las plantillas) que debo llevar a la plataforma Java ME.Mover el código de C++ fuertemente adaptado a Java

Tengo dos preguntas:

  1. ¿Hay buenas herramientas para convertir el código C++ para Java - hacer algunas cosas básicas, así que tengo una plataforma para empezar. Encontré esto - http://tangiblesoftwaresolutions.com/Product_Details/CPlusPlus_to_Java_Converter_Details.html. Al menos eliminaría la necesidad de cosas simples pero lentas como mover clases a diferentes archivos, espacios de nombres a paquetes, etc. ¿Alguien lo ha intentado? ¿O sabe de otros mejores?

  2. El problema más grande es cómo lidiar con las plantillas: el código hace un uso muy intenso de ellas. ¿Alguna sugerencia sobre cómo hacer esto? ¿Hay alguna herramienta para expandir plantillas, por ejemplo, así que tengo una base rudimentaria y luego podría trabajar escribiendo los módulos en Java?

Cualquier ayuda sería apreciada.

Respuesta

7

Para todo el marketing de Sun, Java no es simplemente una mejor C++, y de hecho no admite muchas de las expresiones idiomáticas y paradigmas que admite C++. Esto dificulta la traducción automática. ¿Cómo debería convertir automáticamente una jerarquía de múltiples herencias en una jerarquía de herencia única de Java? (Nota, no estoy diciendo que una jerarquía de herencia múltiple es algo bueno, solo que está explícitamente permitido en C++). Más fundamentalmente, ¿cómo representarías una función de puntero a miembro en Java? ¿O manejar las diferencias entre la resolución de sobrecarga de Java y C++?

Java agregó genéricos hace unos años, pero a propósito los hizo menos poderosos que las plantillas de C++. Independientemente de si fue una buena idea, limita lo que la traducción automatizada puede hacer con un código muy templado.

Además de usar algún compilador de investigación que pueda convertir C++ en bytecode de Java, me temo que es posible que te quedes atascado haciendo la traducción a mano.

0

Generics es la característica de Java que corresponde a las plantillas de C++ y no son compatibles con J2ME. Puede usarlos con la ayuda de un framework, que probablemente utiliza preprocesamiento para hacer el truco. (En realidad, Generics en Java es una característica del compilador, la JVM no sabe nada de ellos).

De todos modos, será difícil si no imposible, portar automáticamente incluso una pequeña porción de su código de C++ a Java Standard Edition - las cosas son mucho peor con J2ME. Existen muchas e importantes diferencias entre Java Generics y las plantillas de C++.

+6

genéricos de Java son casi equivalentes a C++ plantillas. – avakar

+0

No quise decir que hay reemplazos uno a uno. Quise decir que los genéricos de Java se utilizan para resolver el mismo conjunto de problemas que en C++ se resuelven con plantillas. – kgiannakakis

+0

Todavía está muy mal. Los genéricos no son generación de código, las plantillas sí lo son. Los genéricos se pueden aplicar a un subconjunto de los problemas para los que se utilizan las plantillas de C++. En C++, las plantillas a menudo se usan junto con la sobrecarga del operador. Eche un vistazo a cosas como tr1 :: auto_ptr, o la biblioteca eigen2, para cosas que realmente no puede hacer con los genéricos de Java. – gnud

0

Creo que para su caso una herramienta muy simple sería posible y tal vez valga la pena. Sin embargo, podría ser un divertido trabajo de fin de semana. Un amigo mío hizo una vez un puerto de C++ a Java y acaba de hacer una lista de sustituciones de expresiones regulares. Al igual, tuvo todas las ocurrencias de -> reemplazadas por un punto. Etcétera. Esto fue hace algunos años, sin embargo, así que realmente no tengo ganas de preguntarle.

Entonces, podrías hacer lo mismo, recoger algunas sustituciones fáciles y quizás publicarlas en algún lugar en github?

+0

Um, estás subestimando gravemente la tarea –

+0

Creo que solo estoy siendo realista. No puede analizar C++, crear un árbol e imprimir el mismo árbol que Java. Tienes que hacer la mayor parte a mano. Y puedes simplificarlo con una herramienta. Pero no puedes simplemente convertir y presionar el botón de compilación. – nes1983

1

¿Se puede usar JNI y llamar al antiguo código de C++ desde el nuevo código de Java?

+0

Desafortunadamente, JNI no es una opción, solo Java puro. –

0

No creo que sea posible, esp. si su código original está muy templado - J2ME no admite genéricos, AFAIK.

Por desgracia, parece que esto requerirá una gran cantidad de trabajo manual que pasar por el código original y volver a escribir (estoy asumiendo la plataforma de destino no admite JNI)

Cuestiones relacionadas