Newsgroup: it.comp.java
Titolo: Si puo' fare? (un po' lungo)

Salve.
Ho letto qualche thread qui e la prima di postare il messaggio, ma non ho
trovato la risposta, quindi faccio un tentativo :-)
Non ho mai usato java, ma siccome in ditta ci apprestiamo a scrivere una
nuova applicazione, volevo un consiglio da qualche esperto.
Il problema e' questo: essendo java un linguaggio interpretato, e' anche +
lento di un compilato.
Siccome l'applicativo che dobbiamo scrivere conterra' alcune routines di
calcolo spinto, l'idea sarebbe quella di costruire in Java l'interfaccia
utente e in C++ le routine di calcolo.
Tutto questo x una buona portabilita' perche':
 - se scriviamo tutto in c++ e usiamo qualcosa come il C++Builder o
VisualC++, la conversione dell'interfaccia verso altre piattaforme puo'
diventare parecchio complessa;
- se si scrive l'interfaccia in Java la portabilita' dipende solo dalla
disponibilita' della JVM sulla piattaforma (almeno credo!);
- se si scrive il codice di calcolo in c++ Ansi standard e' ricompilabile
in quasi tutte le piattaforme senza troppe modifiche;
Ora la mia domanda e' questa: e' possibile da Java interfacciarsi con
routines scritte in un altro linguaggio?
Grazie dell'attenzione che mi presterete :-)
Saluti,
Stefano

routines scritte in un altro linguaggio?
Si puo' fare in almeno due modi:
1) scrivendo dei metodi nativi
2) richiamando delle routine esterne (classi Runtime, Process....)
Potresste anche valutare con dei prototipi la possiilita' di scrivere
tutto in Java: le prestazioni potrebbero essere piu' che accettabili.
Efisio Bova

utente e in C++ le routine di calcolo.
...
--
In realtà sarebbe meglio fare esattamente l'opposto. Il C++
è sempre molto più veloce di Java sia nell'esecuzione di
routine grafiche che di routine di calcolo. Dove però Java
si difende meglio è proprio nei calcoli, soprattutto se si
tratta di ripetere ricorsivamente una stessa procedura. In
queste condizioni intervengono i meccanismi propri del JIT
che velocizzano di molto le prestazioni e le avvicinano a
quelle di un linguaggio compilato. Dal punto di vista
grafico, Java è invece sempre più lento rispetto a qualsiasi
altro linguaggio compilato: per mantenere l'indipendenza
dall'ambiente operativo Java non può appoggiarsi sulle API
grafiche di sistema (come fanno invece i compilatori C++) e
per questo anche in futuro sarà difficile trovare interfacce
scritte interamente in Java che possano competere con la
velocità di quelle scritte in C++.
Inserire nel codice Java delle procedure scritte in C++ è
possibile ma secondo me non consigliabile: rispetto ad altri
linguaggi Java offre la portabilità del codice ed una
gestione avanzata dei meccanismi di client-server computing
(RMI, CORBA ed altro). Quindi se devi creare un programma
gestionale multipiattaforma che operi su un database
distribuito ben venga Java; ma se devi scrivere un programma
per Windows che ti calcoli le combinazioni del superenalotto
lascia perdere Java perchè in queste condizioni potresti
solo valutarne i limiti.
Pareri personali, ovviamente.
Ciao da Dario.
< DF98      
dfor...@freemail.it
 >

routines scritte in un altro linguaggio?
Si`, e` perfettamente possibile, e l'"altro linguaggio" in questione
deve essere il linguaggio C.  Gli standard ("di fatto", ma, grazie ad
una decisione preliminare di un giudice americano, attualmente e
sino a nuovo ordine anche "de jure"!) di Java prevedono anche la
Java Native Interface, JNI; scrivendo il proprio codice, in C, secondo
queste specifiche, esso dovrebbe poter essere ricompilato, e connesso
al resto del proprio programma Java, su tutte le piattaforme.
Sino a poco tempo fa, l'implementazione Microsoft di Java non
permetteva l'uso di JNI; il giudice suddetto, tuttavia, ha deciso (in
via preliminare) che Microsoft e` invece tenuta a supportare JNI --
le nuove versioni delle macchine virtuali Microsoft, scaricabili
gratuitamente dal sito Microsoft, permettono gia` oggi l'uso di JNI
(non ho provato personalmente, ma questo e` quel che ho visto
annunciare).
Nel 99% dei casi, il vincolo che il codice JNI debba essere scritto in
C non dovrebbe essere particolarmente limitante: sara` necessario,
e sufficiente, dichiarare extern "C" le funzioni C++ che devono essere
chiamate da Java ("metodi nativi"), e viceversa quelle del runtime JVM
che devono essere chiamate da C++.  L'uso di C++ invece di C puo`
comunque offrire molti vantaggi (template, inline, dichiarazioni solo al
momento dell'uso, exception, ecc ecc) anche se la JNI impedisce (almeno
per il codice sull'interfaccia con Java) una strutturazione ad oggetti.
Per la portabilita` al 100% del proprio codice JNI, comunque, potrebbe
essere necessario vincolarsi ad usare il C; alcune piattaforme, infatti,
potrebbero supportare correttamente alcune funzionalita` del C++ (in
particolare: chiamata dei costruttori di oggetti statici, inizializzazione del
sistema di gestione delle eccezioni, inizializzazioni delle parti di libreria
standard relative ad I/O, gestione di memoria, localizzazione, ecc), solo
se il _programma principale_ e` in C++ (non conosco alcuna piattaforma
su cui questo vincolo si applichi _oggi_, ma in un recente passato esso
non era raro), e questo e` impossibile garantirlo pienamente quando, in
realta`, il "programma principale" e` la JVM...!
Sarebbe dunque saggio testare la situazione sulle piattaforme di proprio
principale interesse, prima di investire sostanzialmente su codice JNI
in C++.  Al limite, si puo` usare il C++ dove esso e` supportato in questa
configurazione, e, per un eventuale paio di piattaforme dove il supporto
invece mancasse, ricorrere a un compilatore, analogo al compilatore
Toba gia` nominato Java -> C, che traduca il C++ in C (la Comeau
Computing vende -- US$50 -- un'ottima implementazione basata su
questo schema, 
www.comeaucomputing.com
).
Alex