Newsgroup: it.comp.java
Titolo: Robustezza

Scusate,
alcuni dicono che il C++ è il più potente, il più flessibile ed il più
efficiente e aggiungono che si scrive codice molto robusto se non ci fossero
i numerosi errori causati dalla difficoltà del linguaggio. Corrisponde a
verità?
Grazie dell'attenzione.


Per i confronti tra c++ e java bisogna tener conto di una cosa, il primo
non e` nato per essere machine indipendent, cosi un compilatore c++ puo`
sfruttare al meglio le caratteristiche dell'Hardware e del sistema
operativo per cui e` stato scritto.
Java invece e` nato con l'obietivo di essere indipendente dalla
piattaforma quindi non puo` sfruttare cose 'troppo a basso livello',
(sicuramente in c++ puoi scrivere direttamente sulla memoria video in
java no).
Dal punto di vista della robustezza del codice questa dipende da chi ha
scritto il codice stesso :-)
Comunque Java e` molto piu` tipizzato del c++, quindi gia` a livello di
compilazione il codice deve essere piu` 'pulito'.
-- 
       _--~~--_
     /~/_|  |_\~\
    |____________|                   
    |[][][][][][]|:=  .               
  __| __         |__ \  ' .          
 |  ||. |   ==   |  |  \    ' .     
(|  ||__|   ==   |  |)   \      'O
 |  |[] []  ==   |  |      \    /|\ 	Han Solo
 |  |____________|  |        \   |      ICQ 62548838
 /__\            /__\          \/ \
  ~~              ~~

verità?
Dipende dalla tua definizione di robustezza. 
Assumendo codice corretto, la differenza principale tra Java e C++ e' che, 
sulle classi, il primo favorisce i downcast a runtime, e l'exception handlig e' 
coercitivo, il secondo il typing statico e l'exception handling e' facoltativo. 
Questa caratteristica puo' - in astratto - produrre un numero maggiore di 
eccezioni runtime in java. D'altro canto, l'exception handling coercitivo fa 
si' che le "fair failures" in java siano la norma, mentre in C++ sono 
l'eccezione. Questo con due - pesantissime - note. 
Uno: molto, moltissimo, dipende dallo stile di design/programmazione. 
Recentemente su ACMC e' apparsa una survey che mostra come, in media, lo stile 
di programmazione abbia un impatto maggiore sulle performance che non la pura 
differenza strutturale di efficienza (che c'e') tra C++ e Java. Questo imho 
vale molto anche per la robustezza del codice.
Due: concretamente, per la robustezza media del codice prodotto con un 
linguaggio, a parita' di produttivita' e sforzo, "i numerosi errori causati 
dalla difficolta' del linguaggio" (o, piu' spesso, da ragioni storiche, di 
design o entrambe) sono un elemento determinante. C++ non e' "difficile": e' 
complicato - nel senso che ci sono molte piu trappole e meno cinture di 
sicurezza per il programmatore inesperto o superficiale (o semplicemente stanco  
;-). 
Faccio giusto un esempio: un'operazione di IO su un file in C++ si denota con
    	ifstream is("test");
	if (is.bad()) throw logic_error("A required file does not exist");
	int c;
	is >> c;
In java, e'
     FileReader f = new FileReader("test");
    	int c;
    	c = f.read();
Come e' evidente, il compilatore C++ non ha alcun controllo sulla presenza o 
meno del test dopo l'apertura. Se il programmatore se la dimentica, l'errore 
avviene a runtime. Il compilatore java costringe il programmatore a valutare la 
possibilita' di errore staticamente.
Discorso simile si puo' fare con molte altri situazioni "tipiche": allocazione 
di memoria non seguita da verifica della validita' di un puntatore; memory 
leaks; eccetera. 
C'e' da notare che - per quanto meno evidenti - di "trappole" ne esistono anche 
in Java: tipicamente, non comprendere appieno la nozione di "reference" puo' 
condurre ad errori clamorosi; certi requirements per eseguire subclassing sulla 
libreria standard non sono sufficientemente noti e "enforced" dal compilatore. 
Ma in media, le complicazioni pure e semplici sono meno - e questo conduce a 
codice piu' robusto. Il prezzo e' il solito: si paga in velocita'.
Personalmente, il modello di sviluppo che seguo al momento e' quello di avere, 
se appena possibile, codice "collante" e di servizio in Java; tasks o 
sottosistemi critici per le performance in C++; sottosistemi di natura diversa 
(tipo logici o decisionali) in altri linguaggi. Eccetera.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun/