Una moderna recensione di Java [chiuso]


58

Ho programmato per alcuni anni e ho iniziato in Java, e ai miei tempi ho trovato molte fonti diverse che affermano che Java in un modo o nell'altro è un linguaggio inferiore. Sono ben consapevole che ogni lingua ha i suoi punti di forza e di debolezza, ma molte cose che ho letto su Java sembrano essere datate.

Il motivo più spesso citato per Java è inferiore è che è molto più lento di altri linguaggi compilati in modo nativo, come ad esempio C ++. Molte persone criticano il game designer Notch (che ha sviluppato Minecraft) per l'utilizzo di Java a causa della sua apparente mancanza nel reparto delle prestazioni. So che Java era molto più lento nel corso della giornata, ma da allora ci sono stati molti miglioramenti, in particolare la compilazione JIT.

Oggi vorrei avere alcune opinioni obiettive su Java come lingua. Quindi la mia domanda ha 4 parti.

  1. Prestazione.

    un. Come si confronta oggi la velocità di Java con il C ++?

    b. Sarebbe possibile creare un moderno titolo AAA usando Java?

    c. In quali aree, in particolare, Java è più lento di C ++, se non del tutto? (ad es. scricchiolio del numero, grafica o semplicemente tutto intorno)

  2. Java è ora considerato un linguaggio compilato o interpretato?

  3. Quali sono le principali carenze di Java che sono state affrontate sin dai primi giorni?

  4. Quali sono alcune importanti carenze di Java che devono ancora essere risolte?

Modificare:

Solo a scopo di chiarimento non sto realizzando questo Java vs C ++, ovviamente in media il c ++ sarà un po 'più veloce di Java. Ho semplicemente bisogno di qualcosa con cui confrontare Java in termini di maturità come lingua in questo momento. Dato che c ++ è in circolazione da sempre, ho pensato che sarei stato un buon punto di confronto.



4
Mi piace il fatto che qualcosa di 10 anni non sia più moderno.
cwallenpoole,

4
Java sembra molto diverso quando lo vedi come un framework / piattaforma anziché solo una lingua. Forse il problema è che il nome è essenzialmente "Java" per entrambi.
Joe Internet,

1
Proprio come un punto di contrasto - Minecraft ha recentemente raggiunto 3 milioni di vendite. Non credo che le presunte carenze di Java abbiano danneggiato il gioco abbastanza da influenzare molto le vendite.
Michael K,

3
Assolutamente qualsiasi lingua è inferiore "in un modo o nell'altro". Per definizione.
SK-logic,

Risposte:


62

un. Come si confronta oggi la velocità di Java con il C ++?

Difficile da misurare. Vale la pena notare che una parte importante della velocità di un'implementazione, l'allocatore di memoria, sono algoritmi molto diversi in Java e C ++. La natura non deterministica del collector rende estremamente difficile ottenere dati significativi sulle prestazioni rispetto alla gestione deterministica della memoria del C ++, perché non si può mai essere certi dello stato in cui si trova il collector. Ciò significa che è molto difficile scrivere un benchmark che potrebbe confrontarli significativamente. Alcuni schemi di allocazione della memoria funzionano molto più velocemente con un GC, altri molto più velocemente con un allocatore nativo.

Quello che vorrei dire, tuttavia, è che il GC Java deve funzionare velocemente in ogni situazione. Un allocatore nativo, tuttavia, può essere sostituito con uno più appropriato. Di recente ho posto una domanda su SO sul perché un C # Dictionarypotrebbe essere eseguito (0,45 ms sulla mia macchina) rispetto a un equivalentestd::unordered_mapquale eseguito su (10ms sulla mia macchina). Tuttavia, semplicemente sostituendo l'allocatore e l'haher con altri più appropriati, ho ridotto il tempo di esecuzione a 0,34 ms sulla mia macchina, un trentesimo del tempo di esecuzione originale. Non potresti mai e poi mai sperare di eseguire quel tipo di ottimizzazione personalizzata con Java. Un eccellente esempio di dove questo può fare davvero la differenza è il threading. Le librerie di thread nativi come TBB forniscono allocatori di memorizzazione nella cache dei thread che sono enormemente più veloci rispetto agli allocatori tradizionali quando gestiscono molte allocazioni su molti thread.

Ora, molte persone parleranno dei miglioramenti della JIT e di come la JIT abbia più informazioni. Certo, è vero. Ma non è nemmeno lontanamente vicino a ciò che un compilatore C ++ può estrarre, perché il compilatore ha, comparativamente, tempo e spazio infiniti in cui eseguire, dal punto di vista del tempo di esecuzione del programma finale. Ogni ciclo e ogni byte che la JIT spende pensando al modo migliore per ottimizzare il programma è un ciclo che il programma non sta spendendo in esecuzione e non può utilizzare per le proprie esigenze di memoria.

Inoltre, ci saranno sempre momenti in cui le ottimizzazioni di compilatore e JIT non possono dimostrare determinate ottimizzazioni, specialmente nel caso di analisi di escape. In C ++, quindi, poiché il valore è comunque nello stack , il compilatore non deve eseguirlo. Inoltre, ci sono cose semplici, come la memoria contigua. Se si alloca un array in C ++, si alloca un singolo array contiguo. Se si alloca un array in Java, allora non è affatto contiguo, poiché l'array è pieno solo di puntatori che potrebbero puntare ovunque. Questo non è solo un overhead di memoria e tempo per le doppie indirette, ma anche overhead della cache. Questo genere di cose è dove la semantica del linguaggio di Java impone semplicemente che deve essere più lenta del codice C ++ equivalente.

In definitiva, la mia esperienza personale è che Java potrebbe essere in media circa la metà della velocità di C ++. Tuttavia, non è realisticamente possibile eseguire il backup delle dichiarazioni di prestazione senza una suite di benchmark estremamente completa, a causa degli algoritmi fondamentalmente diversi coinvolti.

b. Sarebbe possibile creare un moderno titolo AAA usando Java?

Presumo che tu intenda "gioco", qui, e non una possibilità. In primo luogo, dovresti scrivere tutto da zero poiché quasi tutte le librerie e l'infrastruttura esistenti sono destinate al C ++. Pur non rendendolo impossibile di per sé, potrebbe certamente contribuire in modo solido a diventare irrealizzabile. In secondo luogo, anche i motori C ++ riescono a malapena a adattarsi ai piccoli vincoli di memoria delle console esistenti, se esistono anche JVM per quelle console, e i giocatori PC si aspettano un po 'di più dalla loro memoria. La creazione di giochi AAA performanti è abbastanza difficile in C ++, non vedo come si possa ottenere in Java. Nessuno ha mai scritto un gioco AAA con un tempo significativo trascorso in un linguaggio non compilato. Inoltre, sarebbe semplicemente soggetto a errori. La distruzione deterministica è essenziale quando si tratta, ad esempio, di risorse GPU e in Java,

c. In quali aree, in particolare, Java è più lento di C ++, se non del tutto? (ad es. scricchiolio del numero, grafica o semplicemente tutto intorno)

Ritornerei sicuramente per tutto. La natura di riferimento forzato di tutti gli oggetti Java significa che Java ha molti più riferimenti indiretti e riferimenti rispetto a C ++, un esempio che ho fornito in precedenza con gli array, ma si applica anche a tutti gli oggetti membri, ad esempio. Laddove un compilatore C ++ può cercare una variabile membro in tempo costante, un runtime Java deve seguire un altro puntatore. Più accessi fai, più lento sarà, e JIT non può farci nulla.

Laddove il C ++ può liberare e riutilizzare un pezzo di memoria quasi all'istante, in Java devi attendere la raccolta e spero che quel pezzo non sia andato via dalla cache e che intrinsecamente richiedere più memoria significa ridurre le prestazioni di paging e cache. Quindi guarda la semantica per cose come boxe e unboxing. In Java, se si desidera fare riferimento a un int, è necessario allocarlo in modo dinamico. Questo è uno spreco intrinseco rispetto alla semantica C ++.

Quindi hai il problema generici. In Java, è possibile operare su oggetti generici solo tramite l'ereditarietà di runtime. In C ++, i template hanno letteralmente zero overhead, qualcosa che Java non può eguagliare. Ciò significa che tutto il codice generico in Java è intrinsecamente più lento di un equivalente generico in C ++.

E poi vieni al comportamento indefinito. Tutti lo odiano quando il loro programma mostra UB e tutti desiderano che non esistesse. Tuttavia, UB abilita fondamentalmente ottimizzazioni che non possono mai esistere in Java. Dai un'occhiata a questo post che descrive le ottimizzazioni basate su UB. Non definire il comportamento significa che le implementazioni possono fare più ottimizzazioni e ridurre il codice richiesto per verificare le condizioni che sarebbero indefinite in C ++ ma definite in Java.

Fondamentalmente, la semantica di Java impone che sia un linguaggio più lento del C ++.

Java è ora considerato un linguaggio compilato o interpretato?

Non si adatta davvero a nessuno di questi gruppi. Direi che il gestito è davvero una categoria separata da solo, anche se direi che è decisamente più simile a un linguaggio interpretato che a un linguaggio compilato. Ancora più importante, ci sono praticamente solo due principali sistemi gestiti, JVM e CLR, e quando dici "gestito" è sufficientemente esplicito.

Quali sono le principali carenze di Java che sono state affrontate sin dai primi giorni?

La boxe automatica e il unboxing sono l'unica cosa che conosco. I generici risolvono alcuni problemi, ma tutt'altro che molti.

Quali sono alcune importanti carenze di Java che devono ancora essere risolte?

I loro generici sono molto, molto deboli. I generici di C # sono considerevolmente più potenti, anche se ovviamente non lo sono nemmeno i modelli. La distruzione deterministica è un'altra grave mancanza. Qualsiasi forma di lambda / chiusura è anche un grosso problema: puoi dimenticare un'API funzionale in Java. E, naturalmente, c'è sempre il problema delle prestazioni, per quelle aree che ne hanno bisogno.


10
Sembra che tu abbia dei malintesi su come funzionano le moderne squadre investigative comuni. Altrimenti buone informazioni.
Sean McMillan,

7
"Ancora più importante, ci sono praticamente solo due principali sistemi gestiti, JVM e CLR" - um, Python? Rubino? Smalltalk? LISP ? Tutti usano i garbage collector, mancano l'aritmetica dei puntatori e AFAIK ha almeno un'implementazione basata sul bytecode.
Michael Borgwardt,

3
@Michael: L'ultima volta che ho controllato, almeno Python e Ruby cadono abbastanza pesantemente nel campo "interpretato". Le loro implementazioni più comuni non sono precompilate in bytecode in una fase separata né includono JIT. Non ho usato Smalltalk o LISP ma non sono sicuro di metterli nel campo "maggiore" e non ho mai sentito parlare di Smalltalk o LISP JIT.
DeadMG

19
+1 bella risposta. finalmente qualcuno che capisce perché Java sarà sempre più lento del C ++.
jeffythedragonslayer,

2
Qualcuno di questi punti mostra problemi di performance nel mondo reale (accexdotal o benchmark)? È evidente dalla maggior parte degli utenti? Dire che la lingua X è più veloce dello 0,25% rispetto alla lingua Y non significa che la lingua Y sia lenta. Con i videogiochi, stai parlando di console o che include giochi per PC?
TheLQ

34

Inizierò con la condizione che sia quasi impossibile per chiunque esprimere un'opinione veramente neutrale sui linguaggi di programmazione. Se conosci abbastanza bene due lingue per commentarle in modo significativo, è quasi inevitabile che preferirai l'una all'altra. Come giusto avvertimento, preferisco C ++ su Java, che senza dubbio influenza i miei commenti almeno in una certa misura.

1 bis. Velocità: la velocità che si ottiene da C ++ o Java dipenderà generalmente meno dal linguaggio o dalla sua implementazione rispetto all'abilità dei programmatori che lo usano. In definitiva, C ++ probabilmente può vincere per la velocità il più delle volte, ma le differenze nel codice che scrivi sono ciò che conta davvero.
1b. Sì, probabilmente. Allo stesso tempo, C ++ è già ben consolidato e dubito che la maggior parte degli studi di gioco abbia abbastanza vantaggi da preoccuparsi di passare a Java.
1 quater. Una risposta completa a questo potrebbe probabilmente riempire un grande volume. Il C ++ farà generalmente meglio con risorse più limitate. Java beneficia maggiormente della (ad esempio) disponibilità di molta memoria "di riserva".
2. L'esecuzione lenta e la raccolta dei rifiuti lenta sarebbero probabilmente i due più ovvi. La biblioteca di finestre antiche (AWT) era piuttosto maldestra: Swing rappresentò un notevole miglioramento.
3. Verbosità. Mancanza di sovraccarico dell'operatore. Uso della raccolta dei rifiuti. Mancanza di eredità multipla. Java Generics è estremamente limitato rispetto ai modelli C ++.

Dovrei aggiungere che alcuni (tutti?) Di quegli svantaggi (in particolare l'uso della garbage collection, ma anche gli altri) sono visti da molti come vantaggi di Java. L'unica eccezione possibile sarebbe la sua verbosità. La situazione di verbosità sta lentamente migliorando un po ', ma certamente non si vede molto spesso concorsi di golf in codice vincenti Java, e nel codice ordinario tende a usare anche un sacco di codice. Ho il sospetto che ci siano almeno alcuni che lo vedono come più leggibile e comprensibile, quindi probabilmente può essere visto anche come un vantaggio.


12
I generici Java non sono nemmeno paragonabili ai modelli C ++. I modelli Java sono zucchero sintattico per facilitare il controllo del tipo in fase di compilazione. I modelli C ++ sono un sistema di generazione di codice completo di Turing.
Kevin Cline il

10
+1 per la verbosità. È lassù con COBOL per una sintassi senza senso lunga e senza fiato. Con tutto il "tentativo" "catch" e con tutto il codice ExtrementlyLongClassName estremamenteLongObjectName = nuovo codice di tipo ExteremlyLongClassName (), può essere una vera sfida capire cosa sta effettivamente cercando di fare un pezzo di codice.
James Anderson,

1
@Mark: personalmente, trovo questa risposta un pasticcio illeggibile e vorrei non vedere più questo genere di cose. Le risposte dovrebbero essere risposte, non discussioni.
Michael Borgwardt,

2
+1 Per il sovraccarico dell'operatore, qualcosa che molte persone vedono come un piccolo svantaggio, ma per me un grande problema. E ovviamente i template, ma quasi tutti li considerano importanti.
Chris dice di reintegrare Monica il

2
I modelli C ++ non erano pensati per essere completi di Turing - ciò è accaduto per caso, a seguito del suo design. Tuttavia, è occasionalmente utile: cercare la metaprogrammazione del modello C ++.
comingstorm

11
  1. Per quanto riguarda le prestazioni;
    1. Nella pura velocità di esecuzione del codice, Java è quasi uguale al C ++ semplice. Ma Java tende ad usare molta più memoria, in parte perché è basata su GC, in parte perché il suo design pone più attenzione alla semplicità e alla sicurezza che all'efficienza. A causa di problemi di cache, più memoria si traduce in una velocità inferiore. Un sacco inferiore rispetto al altamente sintonizzati C ++.
    2. Se si presume che un titolo AAA debba funzionare ai margini di ciò che è possibile utilizzare l'hardware corrente, no. Almeno non sul lato client. Sarei disposto a scommettere che alcuni titoli AAA già utilizzano Java per parti dell'infrastruttura di back-end.
    3. Tutto ciò in cui si lavora con set di dati di grandi dimensioni e C ++ può essere ottimizzato per accedervi in ​​modo intuitivo.
  2. È compilato in bytecode e JIT-compilato in fase di esecuzione. Compiled vs. Interpreted è una dicotomia falsa e obsoleta.
  3. & 4. Ci sono troppe cose per elencarle tutte e ci sarà disaccordo sulla maggior parte di esse.

3
Dire che Java usa molta memoria perché è basato su GC è quasi come dire che un 18 ruote usa molto gas perché ha 18 ruote. Non so quasi nulla di Java, ma sospetto che il problema sia il runtime gonfio e troppe cose che vengono memorizzate nella cache, meno probabile immondizia semantica e non è affatto un difetto nell'approccio di Garbage Collection stesso.
Joey Adams,

3
Al livello più ovvio, la garbage collection significa che c'è un ritardo tra un oggetto che va fuori uso e il garbage collector che sta effettivamente recuperando il suo spazio. In un ambiente gestito manualmente, lo spazio può essere rilasciato immediatamente quando l'oggetto non è più utilizzato. Il ritardo indica che l'ambiente garbage collection utilizza più memoria. E in genere offre prestazioni migliori quanto più memoria può utilizzare poiché riduce l'overhead GC.
Michael Borgwardt,

1
@MichaelBorgwardt Potresti menzionare che la velocità ha bisogno di tempo perché la maggior parte dei JVM deve ricominciare da capo ogni volta. Le informazioni di profilatura delle esecuzioni precedenti non vengono riutilizzate.

11

Innanzitutto un certo contesto, il mio C ++ è molto arrugginito, quindi la maggior parte delle mie esperienze con Java si riferiscono alla mia più recente esperienza con C #, che è comunque un confronto molto più da mele a mele.

1. Velocità

un. Come si confronta oggi la velocità di Java con il C ++?

Penso che questa sia la risposta migliore alla domanda SO Perché java aveva la reputazione di essere lento? ma penso anche che tutta questa domanda sia colorata dal post sul blog di Jeff Atwood, Gorilla vs. Shark . Grazie a Péter e Christopher.

b. Sarebbe possibile creare un moderno titolo AAA usando Java?

Ciò dipende dalle priorità degli sviluppatori e dalle competenze degli sviluppatori. Inoltre, non si tratta di una situazione o / o diversa, parti diverse del titolo potrebbero richiedere diverse cose della lingua in cui sono implementate, portando a un ambiente linguistico eterogeneo.

Di recente ho visto diversi giochi che menzionano che stanno caricando un ambiente Python mentre stanno caricando e sospetto che i cavalli per i corsi siano una forte motivazione se vuoi ottenere il tuo titolo in tempo per le festività natalizie (ad esempio) .

c. In quali aree, in particolare, Java è più lento di C ++, se non del tutto? (ad es. scricchiolio del numero, grafica o semplicemente tutto intorno)

Puoi scrivere codice con scarso rendimento in qualsiasi lingua, ma alcune lingue rendono più facile fare buone scelte, mentre altre hanno maggiori probabilità di lasciarti sollevare dal tuo petardo . Java rientra nella prima categoria, C ++ sicuramente rientra nella seconda.

Da un grande potere derivano grandi responsabilità come si suol dire (per non parlare della capacità di rovinare completamente il tuo mucchio * 8 ').

2. Java è ora considerato un linguaggio compilato o interpretato?

Non posso dire quale sia la maggior parte delle persone , ma molte persone conoscono la differenza tra le lingue compilate e interpretate e non hanno vissuto in una grotta negli ultimi 20 anni, saprebbero anche che la JIT ( Just-in -Time ) Il compilatore è una parte importante dell'ecosistema Java, quindi è probabilmente più probabile che venga considerato compilato in questi giorni.

3. Quali sono le principali carenze di Java che sono state risolte sin dai primi giorni?

Sono un convertito abbastanza recente in Java, quindi ho poco contesto su come si è evoluto. Ma è interessante notare che ci sono libri come Java: The Good Parts che cercano di guidare le persone nella direzione delle parti della lingua che dovrebbero essere preferite in questi giorni e allontanare le persone dalle aree che sono, o dovrebbero essere, deprecato.

4. Quali sono le principali carenze di Java che devono ancora essere risolte?

A mio avviso, un problema con Java è stata la lenta adozione di nuove funzionalità.

Essendo arrivato a Java da C # e guardando attraverso la pagina di confronto di Wikipedia , queste sono le cose che mi contraddistinguono:

Le cose che mi mancano in Java, rispetto a C #

  • Proprietà , in particolare proprietà automatiche. Fanno costruzione e il mantenimento di interfacce molto più facile.
  • Chiusure / lambda . Sono rimasto davvero deluso quando ho sentito che il supporto Java veniva respinto di nuovo . Finalmente abbiamo Closures / lambdas in Java 8, ma il tempo impiegato attesta la mia affermazione sulla lenta adozione.
  • Type inferference ( var) può sembrare zucchero sintattico, ma quando si hanno tipi generici complessi, può rendere il codice molto più chiaro rimuovendo molte duplicazioni inutili.
  • Le classi parziali aiutano davvero a mantenere il codice generato automaticamente (diciamo da un builder GUI) separato dal codice scritto del programmatore.
  • Tipi di valore , a volte c'è un argomento per usare un peso leggero structsu una classe completa.
  • I metodi di estensione possono rendere complessi i sistemi se utilizzati eccessivamente, ma sono ottimi per indicare il modo canonico di implementare qualcosa per una classe se è necessario.
  • Tipi senza segno , a volte quel bit in più può fare la differenza. * 8' )

Cose che non mi mancano in Java, rispetto a C #

  • Il sovraccarico dell'operatore è ottimo quando viene usato correttamente, ma se usato male può causare bug difficili da trovare e una disconnessione tra ciò che un operatore dovrebbe ovviamente fare e ciò che effettivamente fa.
  • I tipi di valore nullable sembravano sempre causare più problemi di quanto valessero.
  • Accesso al unsafecodice Devi stare così attento con questo che raramente ho trovato che valga la pena lo sforzo extra.

Come tale, anche quando si confrontano le mele con le mele, Java è considerato in ritardo.

Gli altri due grandi problemi che vedo con Java sono il notevole ritardo di avvio e il fatto che (per alcune JVM) devi microgestire il tuo heap e persino un heap di generazione permanente . Con le applicazioni C # sono sempre state avviate immediatamente e non ho mai pensato nemmeno all'heap, poiché è stato allocato dal pool di memoria del sistema, non da un pool pre-allocato assegnato alla macchina virtuale.


1
Quella domanda SO che hai collegato, la risposta accettata è incredibilmente, esilarantemente sbagliata.
DeadMG


@Mark: forse. Poi di nuovo, probabilmente è altrettanto giusto lasciarlo cadere completamente. Ho già avuto la mia opinione nella mia risposta alla stessa domanda, quindi è improbabile che l'aggiunta di più commenti possa aggiungere molta nuova conoscenza.
Jerry Coffin,

8

Posso indicarti una fonte che può aiutarti a rispondere alla prima parte della tua domanda. I linguaggi di programmazione sparano http://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.php è una fonte abbastanza buona per vedere come i linguaggi veloci si confrontano tra loro. Possono anche essere filtrati su diverse categorie per vedere in quali aree le lingue fanno meglio di altre. Java è molto più veloce di quanto non fosse parecchi anni fa.



Sì, probabilmente avrei dovuto collegarmi direttamente a quella pagina, scusa.
bschaffer13,

4

1) Parlando rigorosamente della UX che ottengo con Java, sembra lento. Non posso dirti perché davvero. Devo ancora imbattermi in un'applicazione desktop basata su Java, che non sembra lenta e ha un'alternativa non Java più veloce. Detto questo, Java può essere molto veloce nella pura velocità computazionale e Internet è piena di parametri di riferimento per dimostrarlo. Tuttavia, il tempo di avvio delle app Java e la capacità di risposta delle loro GUI devono ancora migliorare IMHO. Forse potresti farlo;)
Alla fine, la velocità non è un grosso problema. Non solo l'hardware sta diventando sempre più veloce, ma è anche che la maggior parte delle persone si preoccupa ancora sorprendentemente poco per tutto il tempo che fa il software, cosa dovrebbe fare e il rapporto tra il tempo trascorso ad interagire rispetto al tempo trascorso in attesa è ragionevole.

2) Questa distinzione è diventata così sfocata ultimamente, che ha davvero poco valore.

3 + 4) In realtà ci sono state alcune modifiche a Java. Alcune persone sostengono già che questi cambiamenti hanno contaminato la filosofia puramente semplicistica di Java fissando elementi alieni. È davvero difficile dire obiettivamente, che cosa è un difetto e che forza è. Per me, Java è inutilmente prolisso, restrittivo e povero di funzionalità, mentre altre persone considerano questi tratti come una piacevole ambiguità, sicurezza e chiarezza.
Quindi, mentre sono queste cose, che personalmente mi fanno non usare Java, non penso che aggiungere semplicemente le cose che mi mancano in Java sia una buona idea. Ci sono molte lingue che mi piacciono eseguire su JVM e piegare Java per essere più vicino a loro, vanificherebbe lo scopo di Java.

È una questione di preferenza

Il fatto con Java è che è progettato per impedirti di spararti al piede. Una nobile causa, ma con tutte le restrizioni che ti attanagliano, non è improbabile che tu passi su uno dei tuoi piedi sicuri, non riesca a prepararti con le mani legate dietro la schiena per la tua sicurezza e alla fine muori, perché ti rompi il cranio. : D
In un certo senso, Java è stata una risposta al C ++, che ti dà abbastanza corda per non solo impiccarti, ma anche il resto del mondo. È tutta quella corda, che la rende così attraente per i cowboy. Tutta quella libertà e tutto quel potere.

In poche parole, questa è davvero solo una questione di preferenza.

Ma, un punto è, con C ++ in alternativa a Java, sei libero di scegliere le tue restrizioni. O davvero impazzire con tutto il controllo che hai, rischiando di confondere completamente i tuoi colleghi:

Ho visto "cout" essere spostato "Hello world" volte a sinistra e mi sono fermato proprio lì.
- Steve Gonedes

Java ha scelto di non offrire un sovraccarico da parte dell'operatore, proprio per questo motivo. Naturalmente ciò impedisce alle persone di offuscare il loro codice moltiplicando i puntatori a funzione con gli elenchi. Ma allo stesso tempo impedisce ad altre persone di eseguire calcoli geometrici / algebrici con i soliti operatori. (v1 * v2 / scale) + (v3 * m)è davvero molto più chiaro di v1.multiply(v2).divide(scale).add(v3.multiply(m)). Vedo perché questo può scoraggiare le persone che si occupano di grafica 3d e calcolo.

Java ha scelto di imporre la garbage collection, mentre in C ++ è possibile scegliere. Puoi davvero scavare fino in fondo e avvicinarti all'hardware. È possibile raggruppare i dati densamente in strutture. Puoi eseguire la magia oscura, come la radice quadrata inversa veloce . Puoi eseguire alcune delle metaprogrammazioni più contorte e criptiche sulla terra usando i template. Ma significa anche che puoi perderti e passare ore a eseguire il debug di tutto il casino che hai creato o a guardare errori di compilatore assolutamente inutili.
Ma se hai la disciplina di usare solo le parti del linguaggio che conosci davvero, puoi scrivere codice C ++ con la stessa sicurezza del codice Java, ma hai la possibilità di avanzare gradualmente.

Quindi, mentre nulla ti impedisce tecnicamente di scrivere software all'avanguardia con Java, scoprirai che molti sviluppatori sono davvero appassionati di scrivere software eccezionale e divertirsi e evolversi mentre si spinge oltre ciò che Java ha da offrire come lingua.

Ma il mondo non è composto solo da persone disposte a creare la prossima grande cosa o solo da persone che limiteranno l'uso del potere conferito loro solo nella misura in cui lo controllano. IMHO Java è la combinazione perfetta per le persone che vogliono produrre risultati stabili in modo confortevole.


+1 Per il fatto che in C ++ nulla ti impedisce di scrivere codice simile a Java, e allo stesso modo nulla ti impedisce di fare di più. È il programmatore che rende una lingua non sicura o difficile.
Chris dice di reintegrare Monica il

0

La raccolta dei rifiuti è la cosa più importante. Ogni tanto, GC bloccherà tutto il resto per diverse centinaia di millisecondi (a seconda delle dimensioni dell'heap) e farà una grande raccolta. Questo va bene se non hai vincoli di temporizzazione, ma se essere in ritardo significa fallimento, questo è uno stopper show. Puoi spendere i soldi per Java in tempo reale e un sistema operativo in tempo reale, ma puoi semplicemente usare GCC e Linux standard e non avrai questi problemi.

Senza le imprevedibili pause casuali, Java è probabilmente abbastanza veloce per la maggior parte delle cose in questi giorni. E se passi mesi a modificare le impostazioni del tuo GC e così, forse, forse, puoi farlo funzionare abbastanza a lungo da consentire al cliente di tagliarti un assegno.


La maggior parte dei moderni bidoni della spazzatura non ferma il mondo.

-1

3) Mancanze risolte.

Qualche anno fa c'era molta rabbia nei confronti di Java. La maggior parte dei programmatori Java sono programmatori web / server e stavano impazzendo con la verbosità di Java. Quindi alcune lingue come Ruby sono diventate popolari e Java ha iniziato a calare. Tuttavia, con le nuove annotazioni e framework come Hibernate e Spring, le persone hanno smesso di lamentarsi e sono tornate a Java.

4) carenze attuali

L'hardware sta diventando multicore. Sebbene Java possa fare il multithread, si basa su C, che è un linguaggio sequenziale e la funzionalità per renderlo multithread non è elegante, per non dire altro. A proposito, non è solo una critica di Java, ma praticamente di tutte le lingue. È necessario un modo completamente diverso di pensare al codice. Forse la programmazione funzionale è la via del futuro.


1
Impazzendo? Difficilmente la penso così. E a quanto pare non hai dato un'occhiata alle cose simultanee in Java 6.

-1

Ho reagito in qualche modo a questa domanda perché darà risposte fuorvianti e in gran parte irrilevanti:

b. Sarebbe possibile creare un moderno titolo AAA usando Java?

Tutti possono concordare sul fatto che i titoli AAA sarebbero difficili da produrre utilizzando Java e che non ci sono esempi reali di cui io sia a conoscenza. Tuttavia, data la natura di AAA che assumerebbe molte cose (dal momento che è davvero un termine confuso proveniente dal marketing), è meglio chiedere invece quanto segue:

È possibile creare un titolo moderno con ragionevole successo usando Java?

La risposta è " Sì, puoi ". Tuttavia, la parte di successo effettiva dell'equazione è più basata sulla persistenza e fortuna (o sull'adesione allo zeitgeist) ma questo non rientra nell'ambito di questo sito.


-6

Un'area di velocità certiana si riduce al compilatore rispetto al compilatore. Non lingua contro lingua. Ci possono essere vantaggi nella compilazione JIT poiché può ottimizzare per le specifiche della macchina su cui è in esecuzione. Confronta JIT compilato C ++ vs Java per un confronto del compilatore più "mele alle mele".

Ma ci sono alcune cose in cui il linguaggio Java stesso limita le proprie prestazioni.

  1. allocazione in pila. Java non può farlo. Per le classi di piccole dimensioni fisse in una soluzione non ricorsiva, questo è spesso l'ideale. Puoi anche evitare la frammentazione dell'heap.

  2. funzioni non virtuali. Java non può farlo. Tutte le chiamate al metodo ricevono un hit permanente anche quando non si prevede che vengano ignorate.

Probabilmente altre cose, ma è tutto ciò che posso pensare dalla cima della mia testa.


2
I compilatori JIT moderni possono ottimizzare entrambi questi casi. Java (a partire da 6) ha allocazione di stack: en.wikipedia.org/wiki/Escape_analysis . Per quanto riguarda le funzioni non virtuali, il compilatore JIT risolverà le chiamate al metodo virtuale che vanno solo a una destinazione (e talvolta possono anche incorporarle) in chiamate non virtuali.
Steven Schlansker,

1
# 2 è falso: qualsiasi segno JIT decente funziona come virtuale o non virtuale in base al fatto che siano attualmente sovrascritti.
Amara,

-16

1) irrilevante e argomentativo per l'avvio.
Non solo è possibile creare importanti software in Java, ma tali sistemi vengono consegnati ogni giorno e gestiscono ormai la maggior parte delle principali aziende del mondo.
2) idem.
Leggi le specifiche JVM e lo sai. Java non è mai stato un linguaggio interpretato.
3) idem.
Leggi i 15 anni di note di rilascio. Impossibile per noi capire quali sono i "maggiori difetti" da affrontare.
4) idem.
Il principale difetto che deve essere affrontato è il JCP che è incline a immischiarsi nel linguaggio centrale e nelle biblioteche per nessun altro motivo apparente se non quello di ottenere il nome del somoene su un JSR in modo che possano scrivere un libro con un blurb autorevole che "erano i leader di JSR-666 ". Si spera che la ristrutturazione di Oracle del JCP se ne occuperà.
Sembra che tu voglia solo scatenare una guerra linguistica qui, e ottenere il tuo pregiudizio contro Java confermato da altri perché non riesci a trovare alcuna vera giustificazione per esso da solo.


ah, vedo che le persone stanno già iniziando le guerre ridimensionando chiunque non stia tagliando Java. Ben fatto, gente!
jwenting

10
Penso che il motivo dei downvotes sia più il fatto che la tua risposta non è proprio una.
blubb

6
Questa risposta è solo una traina. L'OP aveva una buona domanda ben ponderata e non volgare. Poi entri con "fai confermare il tuo pregiudizio contro Java perché non riesci a trovare una vera giustificazione da solo". Sì, -1. Oh e no, non odio Java, è la mia lingua preferita attuale per molte cose
TheLQ

4
L'OP ha scritto una domanda abbastanza ben messa insieme e ha ricevuto risposte ben definite. Non c'è davvero bisogno di accusarlo di aver suscitato qualcosa.
Adam Lear

ah, vedo già persone che iniziano le guerre prendendo seri interrogativi (e risposte) per gli sfoghi e sentendosi attaccati personalmente. Peccato che non posso ancora sottovalutare.
Chris dice di reintegrare Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.