Newsgroup: it.comp.lang.c++
Titolo: C++ vs Java

Sono un modesto programmatore, più che altro per hobby, con qualche
conoscenza di java e c.
Volevo sapere se si riuscivano a trovare (gratis) documenti che spieghino
come fare le più banali cose, sopprattutto la parte grafica, (che non è
banale, ma a me servono per lo più i rudimenti) come finestre, bottoni e
relativi ascoltatori, partendo da come si fa in java.
Thanx
--
Manny Calavera
Redattore della "Grim Fandango Story"
Antispam: CAVA²

 wrote in message
news:av7abq$2eh$1...@ctonet.it...

Penso che per quanto riguarda la grafica, il C++ standard non e' il posto
adatto in quanto la grafica, a differenza di quanto accade in Java che e'
multipiattaforma, e' legata al sistema operativo e non puo' far parte dello
standard.
Bisogna vedere se lavori in Linux o in Windows.
In questo ultimo caso dovresti rivolgerti al newsgroup
it.comp.programmare.win32
Poi potresti usare le Windows API nude e crude, prendendoti il libro di
Petzold o andare sulle MFC (insieme di classi implementate dalla microsoft),
nel qual caso ti consiglio il libro di Prosize.
Per dei tutorials sull'argomento ti consiglio il sito 
www.programmazione.it
dove in basso trovi i links ai tutorials sulla programmazione win32 API o
sulle MFC.
Maurus

 Antispam: CAVA
Forse il posto piu` adatto per postare sarebbe stato it.comp.programmare, 
qui` sei OT. Ad ogni modo, in rete si trovano molte cose (legali e non;-).
Faresti bene a dare un'occhiata alle FAQ di it.comp.lang.java e di 
it.comp.lang.c++, che trovi entrambe su 
www.programmazione.it
Io ti consiglierei, per quanto riguarda java, di scaricarti il tutorial 
della sun, dal loro sito 
http://java.sun.com
, e l'indispensabile 
documentazione; per il C/C++ invece ti consiglierei di leggere il tutorial 
di Alex Martelli su 
http://www.aleax.it/
Ciao,
Cecco

 Cecco

 Mi son scordato di specificare che quest'ultimo e` per Win32
Vi ringrazio per la cortesia e mi scuso per l'ot, ma mi sembrava indicato
visto che alla fine quello che voglio fare è scrive un prog in c++.
Avevo ipotizato che non potesse essere così facile come in java fare
grafica, in ogni caso utilizzo win98se, visto che in tutti i manuali che ho
sleggiucchiato per aggiornarmi da c a c++, sempre che sia una cosa
fattibile, non menzionavano mai neache l'apertura di una finestra.
Rinnovando i ringraziamenti vi saluto.
--
Manny Calavera
Redattore della "Grim Fandango Story"
Antispam: CAVA²

 fattibile, non menzionavano mai neache l'apertura di una finestra.
Il problema fondamentale è che il C++ genera codice nativo, per cui la parte portabile del
linguaggio (che è l'argomento di questo NG, e probabilmente dei manuali a cui ti riferisci) è
limitata alla produzione di programmi da linea di comando: l'apertura di una finestra sfrutta una
chiamata ad una particolare libreria di sistema, dipendente dall'OS. Esistono tuttavia librerie
portate su diversi sistemi (per es. le QT o le SDL, ce ne sono tante): utilizzando queste puoi
teoricamente portare il codice laddove siano state implementate, ma la ricompilazione è comunque un
passaggio obbligato.
Per java il discorso è diverso: genera un bytecode che viene interpretato dalla virtual machine, per
cui il problema della portabilità viene spostato all'implementazione di quest'ultima: il codice che
scrivi sotto Win32 lo puoi portare su altri sistemi, ma la vm che lo interpreta è differente.
Spero di essere stato chiaro, ciao,
Cecco

 ciao, Cecco
Ciao
--
Manny Calavera
Redattore della "Grim Fandango Story"
Antispam: CAVA²

 che viene interpretato dalla virtual machine, [...]
Il problema non è neanche questo. Ripeto ciò che ho gia spiegato in
comp.lang.c++ (perdonatemi l'atrocie abuso del'Italiano):
Prendiamo in considerazione la composizione con il C++ e il Java (in pseudo
sintassi):
class Data { ... };
class Hora { ... };
class DataHora {
    Data d;
    hora h;
}
class TempoScorso {
   DataHora inizio, fine;
};
Questo è semplicissimo in entrambi linguaggi. Vediammo ora cosa succede sotto
le coperte:
Con il C++, un unica reggione di memoria è allocata per un oggetto di tipo
TempoScorso e la memoria è liberata una sola volta quando l'oggetto è
distrutto. Con il Java, che non permette agli oggetti di esistere fisicamente
nello spazio di altri oggetti, si ottiene SETTE reggioni di memoria distinte
con SETTE allocazioni e liberazioni corrispondenti!
Eccone i detagli:
1) l'oggetto TempoScorso
2) la variabile 'inizio' ha la sua propria allocazione
3) la variabile 'd' di 'inizio' ha la sua propria allocazione
4) la variabile 'h' di 'inizio' ha la sua propria allocazione
5) la variabile 'fine' ha la sua propria allocazione
6) la variabile 'd' di 'fine' ha la sua propria allocazione
7) la variabile 'h' di 'fine' ha la sua propria allocazione
Che schiffo! Per quest'oggetto infantile, Java effettua sette volte più gerenza
di memoria che il C++, e non ci contiamo neanche il 'garbage collection'
(gerenza dell'immondizia?). E doppo tutto questo, bisogna accedere a tutto
questo sudicio indirettamente. Nel C++, l'accesso alla data di fine
(temposcorso.fine.d) può essere calcolato al momento di compilazione e ridotto
à un'indirezione, e in qualche casi, anche à un accesso diretto. Con Java, si
ottiene invariabilmente tre livelli di indirezione per OGNUNO dei dati o delle
funzioni degli oggetti foglie!
Di più, ricordiamoci che quando si fa richiesta per N 'byte' di memoria, se ne
usano in realtà N+M, dove M è l' 'overhead' per la gerenza interna delle
allocazioni (spesso chiamata l'arena), posto perso per necessità di
alineamento, ecc. E poi, l'oggetto Java adopera 6 puntatori di pìù che
l'oggetto C++. Sarebbe miracoloso se l'arena non perdesse più di 4 byte (il
contatore di riferenze da lui solo ne farebbe uso) e diciamo che una riferenza
oggetto in Java occupa 4 byte. Questo corrisponde à 6x8 = 48 byte DI PIÙ che
per l'oggetto C++. Imaginiamo che la data e l'hora siano rapresentati ognuno da
un numero di 32 bit. Un oggetto C++ di tipo TempoScorso occuperebbe 16 byte più
4 byte per l'arena, sia 20 byte totali (solo 16 se si mette sulla pila). Lo
stesso oggetto, in Java, occuperebbe gli stessi 20 byte, più i 48 byte che
abbiamo gia calcolati per darci un mostro di 68 byte! È piu di tre volte il
costo del C++. Peggio ancora, se ho 1000 oggetti, in C++ sarebbe 16*1000 + 4
(una volta sola) = 16004 byte mentre in Java, ci troviamo 68*1000 + 4*1000 (per
i puntatori nel contenitore) più il costo del contenitore stesso, dunque, oltre
a 72000 byte o 4,5 volte il costo del C++!
È possibile convertire il codice Java in linguaggio machina (gia si fa), pero
non si può ottimizare il modello di memoria perchè fa parte integrante della
semantica del linguaggio.
Infatti, un pezzo di codice come:
for (i=0; i<n; ++i) {
    t += i*i;
}
può essere equivalente in C++ è in Java se i due sono compilati. Pero, dal
momento che si usano degli ogetti, il Java, compilato o no, è andicappato sia
in velocità che in efficienza spazio.
Claudio Puviani

 comp.lang.c++ (perdonatemi l'atrocie abuso del'Italiano):[...]
Aggiungerei: sti cazzi! ;-PPP
Quello che ho spiegato nel mio post era semplicemente una delucidazione su 
una delle cose che differenziano Java e C++, non un confronto tra le 
performance dei due linguaggi; e del resto, mi sembra di aver risposto 
esaurientemente a quello che Manny aveva obiettato, mentre quello che hai 
scritto tu, scusami, ma non c'entrava molto.
Ciao,
Cecco
PS: spero che non te la prenderai per lo "sti cazzi" ;-)

 PS: spero che non te la prenderai per lo "sti cazzi" ;-)
Se solo sapessi cos'è un cazzo. :-)
Claudio Puviani