Qual è l'obiettivo principale di Java? Perché ci vuole così tanto tempo per ottenere nuove funzionalità?


11

Ho esplorato le nuove funzionalità di JDK8, come le espressioni lambda, i metodi di estensione e la nuova API stream.

Evidentemente nessuna di queste funzionalità è nuova nel mondo della programmazione e questo ha fatto meravigliarsi del motivo per cui stanno ottenendo tutte queste cose in Java fino ad ora.

Avevamo espressioni lambda in Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) e 55 anni dopo Lisp e praticamente tutti gli altri, in Java (2013).

E avevo letto degli stream in SIC (1996).

Mi chiedevo perché adesso? Le prove suggeriscono che competere con altre lingue non è la motivazione.

Sembrerebbe che tutte le nuove fantastiche funzionalità di questa versione di Java siano solo un sottoprodotto dell'implementazione del parallelismo. Abbiamo lambda perché semplificano la scrittura di algoritmi paralleli e abbiamo metodi di estensione perché ne avevamo bisogno per supportare le modifiche richieste dalle espressioni lambda, ecc. Ecc.

Quindi, la mia domanda è: possiamo affermare con sicurezza che l'argomento principale in questa prossima versione di Java è in realtà il parallelismo? O possiamo giustificare altri motivi per la comparsa dei trucchi più antichi nel libro fino ad ora in Java?


4
Tutto ciò che può trasformarsi in è un fuoco di fiamma sul retroterra di Java.
Michael K,

5
The evidence suggests- per favore condividi la tua ricerca.

2
Nessuna delle funzionalità in Java o in JVM o in JRE era mai stata nuova. E anche la combinazione di funzionalità non è nuova, Eiffel ha avuto tutti quelli nel 1985 (GC, OO, sicurezza dei tipi, persino Generics che Java non ha avuto fino al 2003). In effetti, i progettisti di Java hanno sempre avuto l'obiettivo esplicito di non introdurre nulla di nuovo.
Jörg W Mittag

2
@MichaelK - Sono d'accordo che questo potrebbe trasformarsi in una guerra di fiamma. Potrebbe anche trasformarsi in una risposta valida per quanto riguarda la storia avvincente di Sun; Acquisizione di Oracle di Sun e Java; e come gli attuali manutentori di Java stanno cercando di guidare la lingua. La mia speranza è che le risposte si concentrino sugli aspetti costruttivi di questa domanda.

@MichaelT: spero che non si trasformi in una guerra di fiamma e che possano emergere alcune idee interessanti. Ad esempio, spesso assumiamo che una lingua che non si evolve costantemente sia in ritardo rispetto ai tempi. Questo non è vero perché presuppone che l'evoluzione del linguaggio sia lineare (che tutte le nuove funzionalità che diventano popolari sono buone e dovrebbero essere adottate da tutti i linguaggi moderni). Ma i manutentori di una lingua potrebbero decidere che una nuova funzionalità non si adatta al resto della lingua. Inoltre, considera che ci sono linguaggi standardizzati e stabili che sicuramente non sono in ritardo (ad es. Common Lisp).
Giorgio

Risposte:


12

Quando Java è stato progettato per la prima volta, si è ritenuto opportuno escludere funzioni anonime. Posso pensare a due motivi (ma potrebbero essere diversi da quelli ufficiali):

  1. Java è stato progettato come un linguaggio orientato agli oggetti senza funzioni, quindi non era molto naturale avere funzioni anonime in un linguaggio senza funzioni. O almeno, ciò avrebbe influenzato molto il design della lingua.
  2. Le funzioni anonime non erano popolari nelle comunità di programmatori che Java doveva attrarre (C, C ++, Pascal?). Anche ora, molti programmatori Java sembrano considerare queste funzionalità piuttosto esotiche (ma questo probabilmente cambierà molto rapidamente con Java 8).

Negli anni seguenti, come ha spiegato Robert Harvey, la politica di Sun è sempre stata quella di mantenere Java compatibile con le versioni precedenti e molto stabile.

D'altra parte, sono emersi altri linguaggi concorrenti (il più importante è C #, che è nato come un clone di Java e poi ha preso la sua direzione di sviluppo).

I linguaggi in competizione hanno messo Java sotto pressione per due motivi:

Potenza espressiva

Le nuove funzionalità possono rendere più semplice la scrittura di alcuni idiomi di programmazione, rendendo il linguaggio più attraente per i programmatori. Normalmente l'insieme di funzionalità fornite da una lingua è un compromesso tra potenza espressiva, complessità del linguaggio, coerenza progettuale: l'aggiunta di più funzionalità rende un linguaggio più espressivo ma anche più complesso e difficile da padroneggiare.

Comunque, negli ultimi anni i concorrenti di Java hanno aggiunto molte nuove funzionalità che Java non aveva, e questo può essere considerato un vantaggio.

montatura

Sì, sfortunatamente questo è un fattore nella scelta della tecnologia, almeno da quello che posso vedere nella mia esperienza quotidiana come programmatore: uno strumento deve avere una certa funzionalità, anche se la maggior parte dei membri del team non sa come usarlo e quelli che sarebbero in grado di usarlo non ne hanno bisogno la maggior parte delle volte.

L'hype può essere ancora più importante per le persone non tecniche come i manager, che possono essere quelli che decidono la piattaforma per un determinato progetto. I manager a volte ricordano solo alcune parole chiave come lambda, parallelismo, multicore, programmazione funzionale, cloud computing, ... Se la nostra tecnologia preferita ha un segno verde su ogni elemento dell'elenco, allora siamo aggiornati.

Quindi IMO da tempo Java è stato intercettato tra

  • la politica originale di stabilità del linguaggio e semplicità di progettazione, una base di codice enorme e una comunità di sviluppatori da un lato, e
  • la pressione di linguaggi concorrenti che potrebbero attrarre programmatori Java, inizialmente C #, e poi Scala, Clojure, F # (chiamo quelli di cui sono a conoscenza, potrebbero essercene altri).

Alla fine Oracle ha deciso di aggiornare Java per renderlo più competitivo. A mio avviso, le nuove funzionalità riguardano soprattutto i programmatori Java che potrebbero essere tentati di passare a C # e che vedono altre lingue come Scala e Clojure come troppo diverse da Java. D'altra parte, gli sviluppatori che hanno una certa esperienza con la programmazione funzionale e vogliono ancora usare la JVM probabilmente sono già passati a Scala, Clojure o un'altra lingua.

Quindi le nuove funzionalità di Java 8 renderanno Java più potente come linguaggio e l'obiettivo dichiarato è la programmazione simultanea e parallela, ma l'aggiornamento sembra indirizzare anche gli aspetti di marketing (Mark Reinhold, capo architetto di Java presso Oracle, ha dichiarato: "Alcuni avrebbero dire che aggiungere espressioni Lambda è solo per stare al passo con i ragazzi fantastici, e c'è del vero in questo, ma il vero motivo sono i processori multicore; il modo migliore per gestirli è con Lambda ", vedi questo articolo ).

Quindi, sì, molte (tutte) funzionalità Java 8 erano già ben note, ma perché e quando una funzionalità viene aggiunta a una lingua dipende da molti fattori: pubblico di destinazione, comunità esistente, base di codice esistente, concorrenti, marketing, ecc.

MODIFICARE

Una breve nota riguardante "... avevo letto degli stream in SIC (1996).": Vuoi dire che hai bisogno di Java 8 lambdas per implementare gli stream? In realtà puoi implementarli usando classi interne anonime.


+1 E vorrei poterti dare più punti perché questa è la risposta migliore finora alla domanda.
edalorzo

Sulla base della tua risposta ho indagato di più su ciò che Mark Reinhold aveva detto di aver trovato un articolo interessante. Lo posterò qui con la tua risposta per riferimento futuro: Closures for Java di Mark Reinhold .
edalorzo

E quell'articolo in realtà fa riferimento a questo un altro Closures for Java .
edalorzo

1
Dal link che hai inviato ho trovato questo ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 , dicendo che Java può usare classi interne anonime, ma queste sono troppo dettagliate. Tuttavia, la chiusura di Java 8 non è solo zucchero sintattico per le classi interne anonime. Quindi ora Java avrà DUE (semanticamente) diversi tipi di chiusure: classi interne anonime ed espressioni lambda.
Giorgio

11

Java ha cambiato attenzione nel tempo. Inizialmente è stato progettato come un linguaggio semplice e potente, come una reazione al C ++ "potente complesso". Alcune caratteristiche che erano in C ++ furono intenzionalmente escluse, come sovraccarico dell'operatore, modelli, enum, che erano considerati troppo complicati o reliquie dell'era C e che OOP era al culmine della sua popolarità, tutto fu trasformato in un oggetto in un singolo- paradigma visione del mondo. Le lambda in quel momento erano considerate semplicemente "non necessarie" dall'introduzione di classi anonime / interne in Java 1.1. Il fatto che la sintassi fosse molto più dettagliata era quasi considerata una caratteristica .

Dopo aver trovato il suo pubblico Java, non vi furono incentivi a cambiare fino all'introduzione da parte di Microsoft di C #, che apprendeva dalle lezioni sugli errori di progettazione di Java, e lanciò una serie di nuove funzionalità linguistiche. Non erano vincolati dalla retrocompatibilità. Penso che i conceptors Java abbiano realizzato il pericolo della competizione C # e abbiano rilasciato Java 5 con generici, enum, ecc.

L'inclusione di lambda in Java è discussa da quel momento ed è stata solo aggravata dall'attuale tendenza della programmazione funzionale. Ma cose come questa sono lente da correggere, e deve essere giusto la prima volta. A mio avviso, i generici pasticciati di Java con la cancellazione del tipo sono stati considerati perché la retrocompatibilità era considerata una ragione per implementarlo come niente più che zucchero sintattico. Sembra che le chiusure siano state studiate in modo più approfondito e non saranno solo zucchero sintattico.

In conclusione, qual è l'argomento principale di Java 8? Non credo che una versione in lingua abbia un argomento. Come C ++ 11, la ragion d'essere di Java 8 è tenere il passo con la concorrenza introducendo nel linguaggio le cose che sempre più programmatori danno per scontato ora. Lisp potrebbe avere lambda dal 1958, la sua popolarità è cresciuta da decenni ormai e solo recentemente la programmazione funzionale è stata considerata seriamente per la programmazione "mainstream" (per mancanza di una parola migliore).


"Lisp potrebbe avere lambda dal 1958, la sua popolarità è cresciuta da decenni ormai e solo recentemente la programmazione funzionale è stata considerata seriamente per la programmazione" mainstream ": la popolarità di un linguaggio non sembra essere un buon indicatore della sua efficacia. La programmazione funzionale è stata sostenuta per molti anni, ma la maggior parte delle persone del settore lo considerava il tipo di cose con cui i ricercatori amano giocare per scrivere la loro tesi di dottorato. Ora all'improvviso l'industria si sta svegliando e gli sta dando una possibilità, forse perché ora che OOP è mainstream stanno cercando la prossima grande novità.
Giorgio

1
Il motivo per cui le chiusure non erano originariamente incluse in Java secondo: Comprensione del dibattito sulle chiusure . Lì James Gossling disse: "Inizialmente le chiusure furono lasciate fuori da Java più a causa delle pressioni del tempo che di ogni altra cosa. All'inizio di Java la mancanza di chiusure era piuttosto dolorosa, e così nacquero classi interiori: un compromesso scomodo che tentò di evitare una serie di problemi difficili. Ma come è normale in molti problemi di progettazione, le semplificazioni non hanno risolto realmente alcun problema, ma le hanno semplicemente spostate ".
edalorzo,

"L'inclusione di lambda in Java è discussa da quel momento ed è stata solo aggravata dall'attuale tendenza della programmazione funzionale.": Trovo interessante che in alcune comunità (C ++, Java, ...) "usare lambda" spesso significhi " facendo programmazione funzionale ".
Giorgio,

8

Evidentemente nessuna di queste funzionalità è nuova nel mondo della programmazione e questo ha fatto meravigliarsi del motivo per cui stanno ottenendo tutte queste cose in Java fino ad ora.

Poiché Java deve passare attraverso un processo di approvazione che coinvolge diverse parti interessate ad alta visibilità in un processo simile alla "progettazione per comitato", e tale processo richiede tempo, tutto qui.

Contrastalo con altre lingue e troverai un dittatore benevolo o un piccolo comitato di progettisti linguistici che lavorano a stretto contatto e non sono legati agli interessi aziendali.

Combinalo con una base di codice consolidata di milioni di righe di codice Java che deve rimanere compatibile con le versioni precedenti e avrai tutti gli ingredienti per il cambiamento a un ritmo glaciale.


1
OTOH, hai anche gli ingredienti per standard davvero forti e ampiamente accettati. Contrariamente, ad esempio, l'APP con la situazione per PHP, in cui il framework web di ognuno ha il suo ORM a metà.
Michael Borgwardt,

Potrei sbagliarmi, ma la mia comprensione è che Haskell è anche un linguaggio "design by Committee", ed è un linguaggio all'avanguardia. Quindi forse non è questo ciò che ostacola Java?
Andres F.

@AndresF. Sì, ma immagino che non ci siano grandi compagnie monolitiche nel comitato di Haskell. Vedi anche la conversazione nei commenti qui .
Robert Harvey,

1

Direi che deve essere utilizzato lo scopo più importante di un linguaggio di programmazione; attualmente C e Java non hanno espressioni lambda e sono i linguaggi più utilizzati (secondo TIOBE per esempio).

E per rispondere alla domanda credo che Java sia indirizzato all'impresa; in questo campo le cose devono essere molto stabili e affidabili; per esempio Java 7 è apparso per quasi 2 anni, ma non conosco direttamente alcun progetto in Java 7. Inoltre un'altra cosa importante è la compatibilità con le versioni precedenti, che è molto importante per l'impresa.


Sono d'accordo con te (+1): apprezzo molto Java (come lingua e per il suo enorme ecosistema) ma avrei trovato più appropriato congelare la lingua su Java 6. Non ho intenzione di impegnarmi nell'apprendimento Java 7 o 8 a meno che non sia costretto a farlo (qualche progetto molto interessante in cui Java 7 o 8 è un must), preferisco passare il tempo a studiare Scala e Clojure.
Giorgio,
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.