2009-05-28 8 views
6

Ho un'applicazione scritta in C++ (fa un uso massiccio di modelli) che devo portare sulla piattaforma Java ME.Spostamento di codice C++ pesantemente templatizzato su Java

Ho due domande:

  1. ci sono dei buoni strumenti per convertire il codice C++ a Java - fare alcune cose di base in modo da avere una piattaforma per iniziare. Ho trovato questo - http://tangiblesoftwaresolutions.com/Product_Details/CPlusPlus_to_Java_Converter_Details.html. Eliminerebbe almeno la necessità di cose semplici ma che richiedono molto tempo, come spostare le classi su file diversi, spazi dei nomi su pacchetti, ecc. Qualcuno l'ha provato? O sa di migliori?

  2. Il problema più grande è come trattare con i modelli: il codice ne fa un uso molto pesante. Qualche suggerimento su come andare su questo? Per esempio, ci sono strumenti per espandere i template, quindi ho una base rudimentale e quindi potrei lavorare sulla scrittura dei moduli in Java?

Qualsiasi aiuto sarebbe apprezzato.

risposta

7

Per tutto il marketing di Sun, Java non è semplicemente un C++ migliore, e in effetti non supporta molti dei paradigmi e dei paradigmi supportati dal linguaggio C++. Ciò rende difficile la traduzione automatica. Come si dovrebbe trasformare automaticamente una gerarchia di ereditarietà nella gerarchia di ereditarietà singola di Java? (Nota, non sto dicendo che una gerarchia di ereditarietà è una buona cosa, solo che è esplicitamente consentita in C++). Più fondamentalmente, come rappresenteresti una funzione pointer-to-member in Java? O gestire le differenze tra la risoluzione di sovraccarico Java e C++?

Java ha aggiunto generici alcuni anni fa, ma di proposito li ha resi meno potenti dei modelli C++. Indipendentemente dal fatto che sia stata una buona idea, limita ciò che la traduzione automatica può fare con il codice fortemente templato.

Oltre all'uso di un compilatore di ricerca che può trasformare il C++ in codice bytecode Java, temo che potresti rimanere bloccato a eseguire la traduzione a mano.

0

Generics è la funzionalità Java che corrisponde ai modelli C++ e non sono supportati in J2ME. Puoi usarli con l'aiuto di uno framework, che probabilmente usa la pre-elaborazione per fare il trucco. (In realtà Generics in Java è una funzione del compilatore - la JVM non ne sa nulla.)

In ogni caso, sarà difficile se non impossibile portare automaticamente anche una piccola porzione del codice da C++ a Java Standard Edition - le cose sono molto peggio con J2ME. Esistono molte e importanti differenze tra i modelli Java Generics e C++.

+6

generici Java sono difficilmente equivalenti a C++ modelli. – avakar

+0

Non volevo dire che ci sono sostituzioni one-to-one. Intendevo che Java Generics è usato per risolvere lo stesso insieme di problemi che in C++ sono risolti con i modelli. – kgiannakakis

+0

Ancora molto sbagliato. Generics non è la generazione del codice, i modelli lo sono. I generici possono essere applicati a un sottoinsieme dei problemi per cui vengono utilizzati i modelli C++. In C++, i modelli vengono spesso utilizzati insieme all'overloading dell'operatore. Dai un'occhiata a cose come tr1 :: auto_ptr o alla libreria eigen2, per cose che non puoi davvero fare con i generici di Java. – gnud

0

Penso che per il tuo caso sarebbe uno strumento molto semplice e forse utile. Potrebbe essere un divertente fine settimana, però! Un mio amico una volta ha fatto un porting da C++ a Java e ha appena fatto un elenco di sostituzioni di espressioni regolari. Come, aveva tutte le occorrenze di -> sostituite da un punto. E così via. Questo è stato qualche anno fa, comunque, quindi non ho proprio voglia di chiederglielo.

Quindi, si potrebbe fare lo stesso, raccogliere alcune sostituzioni facili e magari pubblicarle da qualche parte su GitHub?

+0

Um, stai seriamente sottovalutando il compito –

+0

Penso di essere solo realista. Non è possibile analizzare C++, creare un albero e stampare lo stesso albero di Java. Devi fare la maggior parte a mano. E puoi semplificarlo con uno strumento. Ma non puoi semplicemente convertire e premere il pulsante di compilazione. – nes1983

1

È possibile utilizzare JNI e chiamare il vecchio codice C++ dal nuovo codice Java?

+0

Sfortunatamente, JNI non è un'opzione - solo Java puro. –

0

Non penso che sarà possibile, esp. se il tuo codice originale è fortemente templato - J2ME non supporta i generici, AFAIK.

Purtroppo, sembra che questo richiederà un sacco di lavoro manuale per passare attraverso il codice originale e riscriverlo (sto assumendo la piattaforma di destinazione non supporta JNI)