[Linux-Biella] Java e flame [Era: certificazione ISO 9001 Agenzia delle Entrate]

Emanuele Aina em a nerd.ocracy.org
Sab 22 Set 2007 17:45:54 CEST


Marco Ermini lamentò:

>> In questo hai ragione, HotSpot è molto veloce e, a parte le carenze
>> della sintassi, le pecche del linguaggio, la vecchiaia delle istruzioni
>> della VM,
> 
> Puoi magari fare qualche esempio? io di questi luoghi comuni ne ho
> sentiti a bizzeffe... poi quando si vanno a vedere i dettagli si
> sciolgono come neve al sole...

Non c'è bisogno di essere scontrosi!

Ne avevo già parlato un mesetto fa coi Daniele (Mastro e Brevi) parlando 
di C#, citando anche questi due articoli: 
http://www.25hoursaday.com/CsharpVsJava.html e 
http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java


Riassumendo, i maggiori difetti per quel che mi concerne sono questi:

Sintassi. Iteratori non integrati nella sintassi. Non ho mai usato i 
nuovi generics, ma ne ho solo sentito parlare male (brutti, poco 
flessibili). Assenza di enumerazioni.

Linguaggio. Boxing/unboxing automatico di tipi nativi (per esempio int) 
assente. Necessario fare troppi cast espliciti. Impossibile fare 
overload degli operatori in maniera decente.

VM. .NET è decisamente più moderna con supporto diretto per linguaggi 
dinamici e generics a livello di VM. Orribile l'interoperabilità con
librerie native (JNI) e altri linguaggi.

Librerie. Gran parte delle librerie Java, sia ufficiali che di terze 
parti, soffrono solitamente della sindrome del framework totalmente 
interdipendente, con migliaia di interfacce e "componenti" impossibili 
da sostituire a causa di interdipendenze. Dalla libreria di I/O (tre 
classi per aprire un file?) a CORBA (che è orribile già di per sè).


Per quanto non abbia in particolare simpatia ne' Java ne' .NET e Mono, 
ritengo questi ultimi tecnicamente migliori.

Personalmente preferisco Python, ma essendo molto diverso dall'ambiente 
Java non è adatto agli sviluppatori Java, mentre .NET/C# è decisamente e 
volutamente simile.

>> la scarsità della libreria standard
> 
> Tralasciamo il fatto che dovresti darmi una definizione di "librerie
> standard"... ti stai riferendo a Java Standard Edition? perché anche
> la Micro e la Enterprise edition sono assolutamente "standard". E non
> mi venire a dire che sono "scarse", in quale altro linguaggio hai le
> feature, per esempio, degli Enterprise Java Beans imposti come
> standard?

Scusa, Java2SE.

> Vediamo piuttosto quelle di C++... certo sono fantastiche in
> confronto! Guarda che parli con qualcuno che ha sviluppato in C++ per
> anni, ed ha visto quale merda (scusate) si trova in certe
> implementazioni delle STL. Non parliamo del fatto che
> l'implementazione di STL di GNU fa piangere (ammesso che funzioni?...
> che mi ricordi io era una pena usare la multiple inheritance in C++
> visto che la gran parte del codice che usava template semplicemente
> non compilava... spero sia migliorato nel frattempo...). Oppure
> parliamo del fatto che nel mondo Microsoft semplicemente non si usano,
> ma abbiamo ALTRE librerie (ATL)

Perfettamente d'accordo. Se Java è brutto, C++ è un abominio.

Ciò non toglie che esistano cosa migliori.

> Comunque sono ben accetti esempi concreti di:
> 
> - linguaggi con "librerie standard" più ricche di Java

Python è imbattibile in questo. La qualità varia però molto da modulo a 
modulo (e spesso è molto ma molto bassa :( ).

Se si considera CPAN, allora Perl è dominatore assoluto.

Per chi invece vuole essere un filosofo della programmazione, Common 
Lisp dovrebbe essere molto ricco in merito a dotazione standard.

> - esempi di "pecche" del linguaggio Java

Ohibò, ovviamente come tutti i linguaggi anche Java non è perfetto.

Possiamo ribaltare il gioco: tu mi parli male di Java e io parlo male di 
Python/C/C# a tua scelta. O di tutti e tre. :)

> - esempi di "carenze di sintassi" del linguaggio Java (è diverso dal
> punto precedente, o è solo per allungare l'elenco?...)

No, volevo separare la sintassi dal linguaggio, ovvero dal bisogno di 
fare cast, dall'uso dell'overload degli operatori, eccetera.

Comunque possono benissimo finire insieme, non miravo alla lunghezza 
dell'elenco.

> - esempi di "vecchiaia di istruzioni della VM" (?!?)

Vedi sopra.

Credo che Java sia rimasto fermo per troppo tempo prestando il fianco a 
.NET, il quale ha colto l'occasione dignitosamente.

Spero in un po' di sana competizione, specie ora che Java sta diventando 
aperto.

Rimango in attesa che IcedTea entri in Debian.

> C'è sempre da imparare e sono sicuro che mi sono perso un sacco di
> cose... illuminami ti prego

Spero di averti esposto un punto di vista diverso dal tuo portando 
esempi concreti. Perché ho sempre la sensazione che tu mi ritenga un 
imbecille?

>> e le assurde interfacce
>> grafiche,
> 
> Tipo? immagino non ti riferisca agli IDE come Eclipse, che è stato
> "portato" per C++ tanto era migliore delle schifezze che in genere si
> usano per quest'ultimo (a parte in ambiente Windows dove esistono
> ottime IDE per C++).

No, a occhio Eclipse mi piace molto, anche se non l'ho mai usato e non 
uso IDE (vim+make+gnome-terminal).

> Se ti riferisci a Swing o AWT, ti invito, anche qua, a fare degli
> esempi di interfacce migliori che siano anche multipiattaforma e parti
> della "libreria standard" come piace definirla a te, per qualsiasi
> linguaggio (non soltanto C++, ma anche Python o quello che
> preferisci).

AWT è un wrapper verso le librerie native, prendendo il minimo comune 
tra tutte. Gli stessi autori di Java ne parlano male proponendo Swing 
come alternativa.

Swing è poco bella esteticamente (ovviamente per me) e risulta essere 
sempre male integrata nell'ambiente in quanto non usa le librerie 
native. L'API è orrida in quanto ogni widget richiede un thread, 
oggettivamente un pessima idea. Oltretutto è solitamente molto lenta, da 
cui la diffusa percezione della lentezza di Java, nonostante la velocità 
di HotSpot.

Proprio per questi motivi Eclipse usa una sua libreria, SWT, in grado di 
usare le interfacce native, direi con buoni risultati.

>> Considerando anche che gcj può compilare Java in codice nativo, si
>> eliminano del tutto le critiche relative alla VM.
> 
> Considerando che gcj ha delle grosse limitazioni e in effetti PERDI i
> vantaggi insiti nell'usare una VM (la scalabilità, la possibilità di
> profiling, il dynamic binding, e senza considerare che una parte molto
> ampia e molto interessante delle librerie Java - come le Enterprise -
> semplicemente non compila) vedo assai poco interessante gcj.

Certo, non ho detto che la compilazione nativa è obbligatoria, solo che 
sia possibile.

Oltretutto l'ho citato come vantaggio, in quanto un programma compilato 
nativo è più veloce che interpretato, se non altro per il peso 
dell'interpretazione stessa.

>>  > Non parliamo poi di tutti quei programmi in C o C++ che hanno memory
>>  > leak - se ne trovano ancora persino in software sotto osservazione
>>  > continua a livello mondiale come le glibc o Apache... figurati negli
>>  > altri. Problemi simili in Java non ne hai
>>
>> Nei sistemi con garbage collector ci possono comunque essere memleak,
>> basta dimenticare dei riferimenti in un hash (ed è una cosa abbastanza
>> comune).
> 
> Non capisco a cosa ti riferisca: fammi un esempio.
> 
> In Java non ho certo di questi problemi. Mi posso "dimenticare" quello
> che voglio, il garbage collector è quello più sofisticato presente per
> qualsiasi linguaggio di programmazione, e deallocherà il mio hash non
> appena esco dallo scope in cui l'ho utilizzato.

A me è capitato questo:
  - ho un hashtable con dentro tanti oggettini
  - l'hashtable vive per tutta l'esecuzione del programma
  - aggiungo progressivamente voci all'hashtable
  - dimentico di togliere le voci non più usate, che però avranno sempre
    il riferimento dell'hashtable a tenerle in memoria

Un memory leak con GC.

>> Il maggior beneficio dal punto di vista della sicurezza è invece la
>> protezione dai buffer overflow, ma ci sono apposite librerie anche per
>> C/C++.
> 
> Da un punto di vista della sicurezza questo è senz'altro un beneficio,
> anche se in C++ ti tocca affidarti a librerie di terze parti o a
> profiler. Ma è sicuramente un beneficio minore rispetto al fatto che
> comunque, qualsiasi cosa tu crei (da una utility command line, a un
> server TCP/IP, a una applicazione web...) creandolo in Java, hai delle
> funzionalità che sono uno standard che è parte delle specifiche Sun ed
> è utilizzato e riutilizzato, quindi stra-testato. Se un motore JSP o
> J2EE ha un problema, lo si "patcha" per tutte le applicazioni del
> mondo che lo usano. Se ti sei scritto il tuo application server in
> C++, sei lasciato a soffrire da solo.

Certo, ma l'errore qui non è usare C++, ma l'avere scritto un 
application server da zero. Il C++ è solo un'aggravante. :)


Facciamo così: tu mi parli male di Java e io parlo male di Python/C/C#.

Almeno 5 difetti per ciascun linguaggio.

-- 
Buongiorno.
Complimenti per l'ottima scelta.



Maggiori informazioni sulla lista Linux