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

9

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

Evidentemente nessuna di queste funzionalità è nuova nel mondo della programmazione e questo ha fatto meravigliarsi perché fino ad ora tutte queste cose sono in Java.

Abbiamo avuto 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 sono chiesto perché ora? 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'attuazione del parallelismo. Abbiamo lambda perché rendono più semplice la scrittura di algoritmi paralleli e abbiamo metodi di estensione perché avevamo bisogno di loro per supportare le modifiche richieste dalle espressioni lambda, ecc. Ecc.

Quindi, la mia domanda è: possiamo affermare con sicurezza che l'argomento principale di questa imminente release di Java è in realtà il parallelismo? Oppure possiamo giustificare altre ragioni per l'aspetto dei trucchi più antichi del libro fino ad ora in Java?

    
posta edalorzo 08.03.2013 - 19:47
fonte

4 risposte

12

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

  1. Java è stato progettato come linguaggio orientato agli oggetti senza funzioni, quindi non era molto naturale avere funzioni anonime in una lingua senza funzioni. O almeno, questo avrebbe influenzato molto il design della lingua.
  2. Le funzioni anonime non erano popolari nelle comunità di programmatori che Java avrebbe dovuto 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 era sempre quella di mantenere Java compatibile 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).

Le lingue concorrenti hanno messo Java sotto pressione per due motivi:

Potere espressivo

Le nuove funzionalità possono semplificare la scrittura di alcuni idiomi di programmazione, rendendo la lingua più attraente per i programmatori. Normalmente l'insieme delle funzionalità fornite da un linguaggio è un compromesso tra potenza espressiva, complessità del linguaggio, coerenza del design: l'aggiunta di più caratteristiche 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.

Hype

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 caratteristica, anche se la maggior parte dei membri del team non sa come usalo e chi potrebbe usarlo non ne ha più bisogno.

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 di scelta ha un marchio verde su ogni elemento della lista, quindi siamo aggiornati.

Quindi IMO per qualche tempo Java è stato catturato tra

  • la politica originale della stabilità del linguaggio e della semplicità del design, un'enorme base di codice e una comunità di sviluppatori da un lato e
  • la pressione dei linguaggi concorrenti che potrebbe attirare i programmatori Java, C # in primo luogo e poi Scala, Clojure, F # (nome di cui sono a conoscenza, potrebbero essercene altri).

Alla fine Oracle ha deciso di aggiornare Java per renderlo più competitivo. A mio parere, le nuove funzionalità riguardano in particolare i programmatori Java che potrebbero essere tentati di passare a C # e che vedono altri linguaggi come Scala e Clojure come troppo diversi da Java. D'altra parte, gli sviluppatori che hanno una certa esperienza con la programmazione funzionale e desiderano ancora utilizzare 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 simultanea e la programmazione parallela, ma l'aggiornamento sembra riguardare anche gli aspetti del marketing (Mark Reinhold, chief architect per Java presso Oracle, ha dichiarato: "Alcuni direbbero che l'aggiunta di espressioni Lambda è solo per stare al passo con i ragazzi fantastici, e c'è del vero, ma la vera ragione sono i processori multicore, il modo migliore per gestirli è con Lambda", vedi questo articolo ).

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

Modifica

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

    
risposta data 08.03.2013 - 22:55
fonte
11

Java ha cambiato l'attenzione con il tempo. Inizialmente è stato progettato come un linguaggio semplice e potente, come reazione al C ++ "potente complesso". Alcune funzioni che erano in C ++ sono state intenzionalmente tralasciate, come l'overloading dell'operatore, i template, le enumerazioni, che sono state considerate troppo complicate o reliquie dell'era C, e OOP essendo al culmine della sua popolarità, tutto è stato reso un Oggetto in un singolo visione del mondo paradigma. Lambda in quel momento era considerato semplicemente "non necessario" dall'introduzione di classi anonime / interne in Java 1.1. Il fatto che la sintassi fosse molto più prolissa era quasi considerata una funzione .

Java ha trovato il suo pubblico, non ci sono stati incentivi per cambiare fino all'introduzione di Microsoft C #, che ha imparato dalle lezioni degli errori di progettazione Java e ha lanciato una serie di nuove funzionalità linguistiche. Non erano vincolati dalla retrocompatibilità. Penso che gli ideatori di Java abbiano compreso il pericolo della concorrenza in C # e abbiano rilasciato Java 5 con generici, enumerazioni, ecc.

L'inclusione di lambda in Java è discussa da quel momento ed è stata solo esacerbata dall'attuale tendenza per la programmazione funzionale. Ma cose come questa sono lente da fare bene, e deve essere giusta la prima volta. A mio avviso, i generici generati da Java hanno cancellato i caratteri perché la retrocompatibilità era considerata una ragione per implementarla come nient'altro che zucchero sintattico. Le chiusure sono state pensate in modo più approfondito, sembra, e sarà più che solo zucchero sintattico.

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

    
risposta data 08.03.2013 - 22:29
fonte
8

Evidently none of these features are new in the programming world and that made wonder why are getting all these things in Java until now.

Perché Java deve passare attraverso un processo di approvazione che coinvolge diversi stakeholder ad alta visibilità in un processo simile a "design by committee", e questo processo richiede tempo, tutto qui.

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

Combina questo con una base di codice stabilita di milioni di righe di codice Java che deve rimanere retrocompatibile e hai tutti gli ingredienti per il cambiamento a un ritmo glaciale.

    
risposta data 08.03.2013 - 21:23
fonte
1

Direi che lo scopo più importante di un linguaggio di programmazione deve essere usato; attualmente C e Java non hanno espressioni lambda e sono le lingue più utilizzate (secondo TIOBE per esempio).

E per rispondere alla domanda, credo che Java sia indirizzato all'azienda; in questo campo le cose devono essere molto stabili e affidabili; ad esempio Java 7 è apparso per quasi 2 anni eppure non conosco direttamente alcun progetto in Java 7. Un'altra cosa importante è la retrocompatibilità, che è molto importante per l'azienda.

    
risposta data 22.03.2013 - 12:07
fonte

Leggi altre domande sui tag