2011-01-21 2 views
2

Bonjour, nous avons un projet/produit qui est écrit en C++. Maintenant, nous prévoyons de le convertir en Java pour bénéficier de Java.Existe-t-il un outil/logiciel disponible pour le portage de C++ vers Java?

Existe-t-il un outil disponible pour effectuer ce portage? Quelle est la meilleure façon de commencer?

+6

Trouvez quelqu'un qui connaît les deux langues et lui donnez de l'argent :). Sérieusement, il existe probablement des outils qui prétendent le faire, mais je doute qu'ils fassent un bon travail avec un code qui va même au-delà d'un fichier "Hello World". Et même s'ils le retiraient, vous auriez un fichier source converti qui (probablement) est un cauchemar à lire et à maintenir. –

+0

S'il s'agit d'un projet ou même d'un produit, il peut être moins onéreux de revoir les exigences et de re-développer l'application à partir de rien - surtout si vous vous souciez des «avantages Java». –

+3

Je risquerais qu'il faille plus d'efforts pour réparer le code résultant que de vraiment proprement passer du zéro. Rappelez-vous que la programmation en Java dans le style C++ ne va que conduire à beaucoup de chagrin! – Nim

Répondre

2

J'ai vu quelques tentatives de conversion automatique de code, et bien que techniquement possible " travail ", le code résultant est souvent complètement impossible à maintenir. Les problèmes majeurs sont:

  • Certains concepts ne se traduisent pas proprement, et nécessitent des interprétations ou des wrappers extrêmement désordonnés (et souvent lents!) Pour obtenir les mêmes résultats.
  • Un bon code Java est structuré et stylé très différemment du bon code C/C++. Si vous traduisez automatiquement le code, vous finirez par une structure et un style très peu unidiomatiques dans la langue cible, et par conséquent très difficiles à comprendre/à maintenir.
  • Un certain code ne peut pas être traduit du tout (par exemple, certains des codes de gestion de mémoire les plus mystérieux en C/C++ ne peuvent tout simplement pas être réalisés dans le modèle de mémoire Java). Cela annulera toute traduction automatique et devra être complètement réécrit.

Je suggère donc une conversion par morceaux, plutôt que d'essayer de convertir le produit entier en utilisant un outil. Par exemple, vous pouvez adopter l'approche suivante

  • Commencez par créer une application Java (ou une application Web) en tant que «wrapper» pour le code C/C++. Peut être juste une interface simple à ce stade.
  • figure un comment faire Java < -> appels (indice: JNI)
  • Utilisez JNI pour appeler le code C/C++ comme une boîte noire "moteur". Ecrivez beaucoup de tests JUnit qui vérifient que vous obtenez les résultats que vous attendez. Ce n'est pas seulement une bonne pratique en général, mais elle vous aidera massivement à éviter les bogues lorsque vous effectuerez de futures étapes de conversion.
  • Avec le temps, convertissez les composants de C/C++ en Java. Remplacez chaque appel JNI à ces composants par un appel à du code Java, ce qui peut rendre des appels JNI de niveau inférieur à la base de code C/C++ restante selon les besoins.
  • Utilisez chaque étape de traduction comme une opportunité pour refactoriser votre code. Définir des interfaces claires basées sur le service, réduire la duplication, rendre les choses immuables, etc.
+1

+1 pour l'approche incrémentale et les tests unitaires. – Raedwald

0

Swig ne pas porter de C++ à Java en soi, mais il génère automatiquement des wrappers pour les hiérarchies de type existantes afin que vous puissiez appeler (et étendre) le code C++ en Java. En fonction de ce que vous cherchez à obtenir, cela pourrait être utile et beaucoup plus simple, par exemple, cela vous permettrait d'accéder au code existant à partir d'une nouvelle base de code Java.

0

Vous voulez convertir en Java, vous lâche et la portabilité des performances, mais c'est votre décision;)

Cependant, je ne pense pas qu'il soit possible, en raison des différences fondamentales entre les deux langues. Par exemple, en C++, il est possible d'allouer des objets sur le tas ou la pile, où en Java vous ne pouvez placer que des "types primitifs" tels que int et float sur la pile; Pour les objets, le tas est utilisé et géré par le garbage collector. Aussi Java est livré avec une bibliothèque standard beaucoup plus grande, donc le code STL (si STL est utilisé) devrait être porté à cela aussi.

+5

-1 en ce qui concerne la perte de la portabilité et de la performance, une déclaration si large avec peu ou pas de preuves à sauvegarder. – hhafez