In che modo il nuovo sviluppo di Java influenzerà la sua interoperabilità con lingue come Scala e Clojure?


11

Per quanto ho capito, sia Scala che Clojure sono stati progettati come nuove lingue

  1. dipende dalla JVM e
  2. si integrano facilmente con il codice Java, nel senso che consentono di utilizzare le classi Java all'interno del codice Scala e Clojure.

A partire da Java 8 (e forse anche più fortemente con le versioni successive di Java), ci saranno cambiamenti nella semantica del linguaggio Java.

Volevo chiedere come questi cambiamenti avranno un impatto sull'interoperabilità tra Java e Scala / Clojure e quali saranno le conseguenze. Ad esempio, poiché i lambda in Java 8 non sono oggetti (vedere ad esempio qui ), Scala e Clojure potrebbero dover gestire valori Java che non sono oggetti. questo sarebbe un problema?

Posso pensare ai seguenti scenari:

  1. Il linguaggio Scala o Clojure verrà esteso per adattarsi alla nuova semantica Java (per gestire i nuovi valori non oggetto) e supportare l'interoperabilità con Java.
  2. Il linguaggio Scala o Clojure non verrà esteso. Ciò sarebbe possibile solo se le nuove funzionalità Java come i valori delle funzioni possono essere associate a concetti esistenti. Ad esempio, in Scala anche una funzione è un oggetto, quindi immagino che le funzioni Java vengano nuovamente racchiuse in una sorta di oggetti quando diventano visibili a Scala.
  3. Il linguaggio Scala o Clojure continuerà a supportare l'interoperabilità fino a Java 6 o 7, senza seguire l'ultimo sviluppo di Java. Ciò richiederebbe che le versioni precedenti di Java siano ancora supportate (almeno da OpenJDK o da un altro progetto), in modo che questi linguaggi possano essere basati su un ramo di Java più conservativo / stabile.

Riassumendo: possiamo aspettarci che il futuro sviluppo di Java avrà un impatto su linguaggi come Scala e Clojure per mantenere l'interoperabilità con Java? Sono già in corso (link a) discussioni su questo argomento?

Nota

Posso immaginare che Scala, Clojure e altri linguaggi basati su JVM non avranno grossi problemi nell'aggiornamento della loro implementazione a versioni più recenti di JVM (e che le nuove funzionalità di JVM renderanno questa implementazione ancora più semplice). La mia domanda si concentra sulle funzionalità di Java come linguaggio e se / come altri linguaggi JVM saranno in grado di "vedere" / utilizzare queste nuove funzionalità, non se i linguaggi basati su JVM verranno eseguiti sugli ultimi JVM.


6
Non è preciso affermare che Scala ecc. Dipenda da Java. Dipendono dal codice byte JVM. Tutte le funzionalità di interoperabilità riguardano il bytecode, non il codice sorgente in linguaggio Java, quindi qualsiasi modifica apportata a Java stesso non costituisce una minaccia. Solo le modifiche apportate alla JVM potrebbero influire su queste lingue e la JVM è estremamente conservativa, in pratica non rimuove mai il supporto per nulla. In effetti, la maggior parte dei cambiamenti nella JVM al giorno d'oggi sono destinati specificamente ai linguaggi dinamici più recenti.
Kilian Foth,

@Kilian Foth: Per quanto ne so, una Scala Stringè una Java String. Quindi Scala utilizza alcune classi di librerie Java. Ma posso cambiare la formulazione se pensi che sia troppo forte.
Giorgio,

@Kilian Foth: ho rimosso il termine dipendere perché il focus della mia domanda è piuttosto sull'interoperabilità tra Scala e Java. Clojure e Java.
Giorgio

@KilianFoth Questa dovrebbe essere una risposta perché risolve il problema principale della domanda. L'obiettivo numero uno di ogni nuova versione di Java è la compatibilità con le versioni precedenti.
maple_shaft

3
@maple_shaft: ho corretto la mia domanda e rimosso la parola "dipendere". Come ho sottolineato in un altro commento, il mio problema non è come Scala o Clojure dipendono dalle funzionalità Java o JVM, ma come Scala / Clojure può "vedere" le funzionalità Java. Per quanto ne so possono vedere funzionalità di Java 6 come classi, interfacce, oggetti, metodi, tipi di dati primitivi. Ciò consente a Scala / Clojure di utilizzare (chiamare) il codice Java 6. La mia domanda è: queste lingue "vedranno" (e, quindi, saranno in grado di usare) i futuri costrutti del linguaggio Java o questo richiederebbe estensioni ai linguaggi Scala / Clojure?
Giorgio,

Risposte:


15

In realtà Java 8 non introduce molto che sarà dannoso per altri linguaggi JVM che interagiscono con Java. Il lavoro svolto su Lambdas ha aiutato a risolvere una serie di piccoli problemi relativi a invokedynamic, MethodHandles, MethodReferences ecc. - A parte questo, continua come al solito. Detto questo, c'è un intero nuovo gruppo di API che le altre lingue JVM potrebbero potenzialmente chiamare ora. Quelli che useranno di default o no dipende da loro.

Il più grande cambiamento che ha influito sull'interoperabilità è effettivamente arrivato con Java 7 - con il bytecode invokedynamic che consente chiamate di associazione dinamica / tardiva all'interno della JVM - qualcosa che inizialmente era progettato per le altre lingue sulla JVM. Da allora è stato utilmente adattato per Lamdbas, quindi a partire da Java 8, Java inizierà effettivamente a emettere questi bytecode.

Alcuni linguaggi (ad esempio JRuby) stanno già usando pesantemente l'invocinodinamica, mentre altri (Scala, Groovy et al) stanno ancora studiando il suo uso o sono nelle prime fasi di patch in. In teoria rende le loro chiamate dinamiche quasi performanti come quelle esistenti Chiamate invokestatic di Java, al contrario della miriade di soluzioni più lente che sono state costrette a utilizzare in passato.

Java 9 porterà ulteriori sfide per i linguaggi JVM con il progetto Jigsaw che entrerà nella piattaforma che sarà l'inizio della fine per il caricamento e i percorsi di classe tradizionalmente per la JVM. Le persone del linguaggio JVM ne sono abbastanza consapevoli e mi aspetto che avvenga una collaborazione sensata.


1
Ma, per quanto ne so, una chiusura alla Scala è un oggetto.
Giorgio

1
Sì. Scala ha recentemente abbandonato il supporto per Java 1.5, ci vorrà molto tempo prima che cadano 1.6.
Jörg W Mittag

1
@Giorgio Le funzionalità del linguaggio di Java sono irrilevanti in quanto la maggior parte di queste equivale a trucchi bytecode quando compilati comunque. Se accettiamo che JVM sarà sempre compatibile con le versioni precedenti, anche se vengono introdotti nuovi bytecode, Scala non sarà influenzato e potrà scegliere di sfruttare queste nuove funzionalità JVM a proprio piacimento.
maple_shaft

1
"Le funzionalità del linguaggio di Java sono insignificanti poiché la maggior parte di queste equivale a trucchi bytecode quando compilate comunque.": Se un'altra lingua vuole usare un costrutto Java, deve essere in grado di riconoscere il bytecode generato per quel costrutto. Se Java introduce un nuovo costrutto mappato al nuovo bytecode, la lingua host dovrebbe almeno implementare un nuovo wrapper / interfaccia per riconoscere e utilizzare il nuovo bytecode. Ad esempio, se un lambda Java 8 non ha creato un oggetto ma un nuovo costrutto con un nuovo bytecode specifico per esso, la lingua host deve essere adattata per riconoscerlo.
Giorgio

2
@Giorgio: Certo, ma non sono previsti cambiamenti di questo tipo per la piattaforma Java 8. In effetti, il JVMS è stato esteso solo due volte nell'intera storia della piattaforma Java, nel 2003 e nel 2010, e la seconda volta (introduzione del invokedynamicbytecode) era specificamente per supportare linguaggi diversi da Java; infatti, il linguaggio Java 7 non supporta né usa quel bytecode.
Jörg W Mittag,

2

Scala sta per essere lasciata indietro quando Java aggiunge lambda perché a Java lambda viene assegnato un tipo in base al contesto in cui vengono utilizzati, mentre Scala lambda viene assegnato un tipo in base alle loro arità, tipi di parametro e tipi di ritorno, quindi ad esempio,

executor.execute(() -> { System.out.println("hello world"); });

da Java 8 può essere scritto in Scala come:

executor execute new Runnable {
    override def run() { println("hello world") }
}

a meno che tu non usi / scriva dei wrapper che convertono Scala () => Unit in Runnable.


Grazie per la risposta e anche per aver risposto alla mia domanda (+1). Se ho capito bene, Scala dovrà continuare a utilizzare le classi anonime per istanziare le interfacce in un contesto in cui Java 8 utilizzerà lambdas (perché Java 8 lambdas ha una semantica diversa rispetto a Scala lambdas). Un altro punto che non mi è chiaro è cosa accadrà se un metodo Java restituisce un lambda Java. Cosa succede se una classe Scala chiama quel metodo? Quale sarà il tipo di ritorno in Scala?
Giorgio,

1
@Giorgio In Java 8 un'espressione lambda è una scorciatoia a livello di linguaggio per creare un'istanza di interfaccia che dichiara un singolo metodo e che è differita dal contesto. Quindi, quando un metodo Java 8 restituisce un lambda, in realtà restituisce un'istanza di interfaccia che viene dichiarata come tipo di ritorno del metodo. Come di Scala 2.9.1, il tipo di ritorno sta per essere semplicemente un caso di alcuni dicono di interfaccia (Runnable o comparatore), che si può non trattare come un lambda Scala, a meno che o versioni future di Scala libary introdurre una conversione implicita da quella interfaccia al tipo di scala lambda.
hellodanylo,

@SkyDan: Ok, quindi Scala vedrà i lambda Java come oggetti che implementano qualche interfaccia. Questo punto non mi era chiaro: pensavo che Java avrebbe generato un bytecode diverso da quello di un oggetto. Ma deve essere un oggetto nascosto, altrimenti non verrebbe riconosciuto come implementazione di un'interfaccia. Penso di averlo capito adesso.
Giorgio

@Giorgio, anche se vuoi saperne di più sui cambiamenti relativi a lambda in Java 8 e sulle forze che guidano questi cambiamenti, ti consiglio di leggere questa affascinante e dettagliata panoramica del progetto Lambda .
hellodanylo,

@SkyDan: leggendolo ora. Mi sembra che lambda fanno rappresentare gli oggetti (anche se il tipo / interfaccia è dedotta dal contesto in cui sono definiti). Quindi le informazioni fornite su mail.openjdk.java.net/pipermail/lambda-dev/2011-August/… ("i lambda non sono oggetti") sono errate o, almeno, fuorvianti.
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.