Comment le nouveau développement de Java influencera-t-il son interopérabilité avec des langages comme Scala et Clojure?


11

Autant que je sache, Scala et Clojure ont été conçus comme de nouvelles langues

  1. dépendent de la JVM, et
  2. s'intègre facilement au code Java, dans le sens où ils permettent d'utiliser des classes Java dans le code Scala et Clojure.

À partir de Java 8 (et peut-être encore plus fortement avec les versions ultérieures de Java), il y aura des changements dans la sémantique du langage Java.

Je voulais demander comment ces changements affecteront l'interopérabilité entre Java et Scala / Clojure et quelles en seront les conséquences. Par exemple, étant donné que les lambdas de Java 8 ne sont pas des objets (voir par exemple ici ), Scala et Clojure peuvent avoir à gérer des valeurs Java qui ne sont pas des objets. Serait-ce un problème?

Je peux penser aux scénarios suivants:

  1. Le langage Scala ou Clojure sera étendu pour s'adapter à la nouvelle sémantique Java (pour gérer les nouvelles valeurs non-objet) et prendre en charge l'interopérabilité avec Java.
  2. La langue Scala ou Clojure ne sera pas étendue. Cela ne serait possible que si les nouvelles fonctionnalités Java telles que les valeurs de fonction peuvent être mappées à des concepts existants. Par exemple, dans Scala même une fonction est un objet, donc je suppose que les fonctions Java seraient à nouveau enveloppées dans une sorte d'objets lorsqu'elles deviendront visibles pour Scala.
  3. Le langage Scala ou Clojure continuera de prendre en charge l'interopérabilité jusqu'à Java 6 ou 7, sans suivre le dernier développement de Java. Cela nécessiterait que les anciennes versions de Java soient toujours prises en charge (au moins par OpenJDK ou un autre projet), afin que ces langages puissent être basés sur une branche plus conservatrice / stable de Java.

En résumé: peut-on s'attendre à ce que le développement futur de Java ait un impact sur des langages comme Scala et Clojure pour maintenir l'interopérabilité avec Java? Y a-t-il déjà (lien vers) une discussion en cours sur ce sujet?

Remarque

Je peux imaginer que Scala, Clojure et d'autres langages basés sur JVM n'auront pas de problèmes majeurs à mettre à jour leur implémentation vers des versions plus récentes de la JVM (et que les nouvelles fonctionnalités JVM rendront cette implémentation encore plus facile). Ma question se concentre sur les fonctionnalités de Java en tant que langage et si / comment d'autres langages JVM pourront "voir" / utiliser ces nouvelles fonctionnalités, pas si les langages basés sur JVM fonctionneront sur les dernières JVM.


6
Il est imprécis de dire que Scala etc. dépend de Java. Ils dépendent du code d'octet JVM. Toutes les fonctionnalités d'interopérabilité concernent le bytecode, pas le code source du langage Java, donc quelles que soient les modifications apportées à Java lui-même ne constituent pas une menace. Seules les modifications apportées à la JVM peuvent affecter ces langues, et la JVM est extrêmement conservatrice - elle ne supprime pratiquement jamais la prise en charge de quoi que ce soit. En fait, la plupart des changements dans la JVM de nos jours sont destinés spécifiquement aux nouveaux langages dynamiques.
Kilian Foth, du

@Kilian Foth: Autant que je sache, un Scala Stringest un Java String. Scala utilise donc certaines classes de bibliothèque Java. Mais je peux changer la formulation si vous pensez qu'elle est trop forte.
Giorgio

@Kilian Foth: J'ai supprimé le terme depend car ma question porte plutôt sur l'interopérabilité entre Scala et Java resp. Clojure et Java.
Giorgio

@KilianFoth Cela devrait être une réponse car elle répond à la préoccupation majeure de la question. L'objectif numéro un de toute nouvelle version de Java est la compatibilité descendante.
maple_shaft

3
@maple_shaft: J'ai corrigé ma question et supprimé le mot "dépendent". Comme je l'ai souligné dans un autre commentaire, mon problème n'est pas de savoir comment Scala ou Clojure dépendent des fonctionnalités Java ou JVM, mais comment Scala / Clojure peut "voir" les fonctionnalités Java. Autant que je sache, ils peuvent voir les fonctionnalités de Java 6 comme les classes, les interfaces, les objets, les méthodes, les types de données primitifs. Cela permet à Scala / Clojure d'utiliser (appeler) du code Java 6. Ma question est la suivante: ces langages "verront-ils" (et, par conséquent, pourront-ils utiliser) les futures constructions de langage Java ou cela nécessiterait-il des extensions des langages Scala / Clojure?
Giorgio

Réponses:


15

En fait, Java 8 n'introduit pas grand-chose qui sera préjudiciable aux autres langages JVM qui interagissent avec Java. Le travail effectué sur Lambdas a aidé à résoudre un certain nombre de petits problèmes concernant la dynamique invoquée, les poignées de méthode, les références de méthode, etc. - mais en dehors de cela, il se poursuit normalement. Cela dit, il existe un tout nouveau tas d'API que les autres langages JVM pourraient potentiellement appeler maintenant. Le choix de ceux qu'ils utiliseront par défaut ou non.

Le plus grand changement impactant l'interopérabilité est en fait intervenu avec Java 7 - avec le bytecode dynamique invoqué qui permet les appels de liaison dynamique / tardive au sein de la JVM - quelque chose qui a été initialement conçu pour les autres langages de la JVM. Il a depuis été très utilement adapté pour Lamdbas, donc à partir de Java 8, Java commencera réellement à émettre ces bytecodes.

Certaines langues (JRuby par exemple) utilisent déjà massivement la dynamique invoquée, tandis que d'autres (Scala, Groovy et al) étudient toujours son utilisation ou en sont aux premiers stades de la mise à jour. En théorie, leurs appels dynamiques sont presque aussi performants que ceux existants. Appels invokestatiques Java, par opposition à la myriade de solutions de contournement plus lentes qu'ils ont été contraints d'utiliser dans le passé.

Java 9 posera plus de défis pour les langages JVM avec le projet Jigsaw qui entrera dans la plate-forme qui sera le début de la fin pour le chargement de classe et les chemins de classe traditionnellement pour la JVM. Les gens du langage JVM en sont assez conscients et je m'attends à une collaboration sensée.


1
Mais, à ma connaissance, une fermeture Scala est un objet.
Giorgio

1
Oui. Scala a récemment abandonné la prise en charge de Java 1.5, il faudra beaucoup de temps avant de supprimer 1.6.
Jörg W Mittag

1
@Giorgio Les fonctionnalités du langage de Java sont sans importance car la plupart d'entre elles équivalent à des astuces de bytecode quand elles sont compilées de toute façon. Si nous acceptons que la JVM sera toujours rétrocompatible, même si de nouveaux bytecodes sont introduits, Scala ne sera pas affecté et pourra choisir de profiter de ces nouvelles fonctionnalités JVM à sa convenance.
maple_shaft

1
"Les fonctionnalités de langage de Java sont sans importance car la plupart de celles-ci équivalent à des astuces de bytecode quand elles sont compilées de toute façon.": Si un autre langage veut utiliser une construction Java, il doit être capable de reconnaître le bytecode généré pour cette construction. Si Java introduit une nouvelle construction qui correspond au nouveau bytecode, le langage hôte doit au moins implémenter un nouveau wrapper / interface pour reconnaître et utiliser le nouveau bytecode. Par exemple, si un lambda Java 8 n'a pas créé d'objet mais une nouvelle construction avec un nouveau bytecode spécifique pour lui, le langage hôte doit être adapté pour le reconnaître.
Giorgio

2
@Giorgio: Bien sûr, mais aucune modification de ce type n'est prévue pour la plate-forme Java 8. En fait, le JVMS n'a été étendu que deux fois dans toute l'histoire de la plate-forme Java, en 2003 et 2010, et la deuxième fois (introduction du invokedynamicbytecode) était spécifiquement destinée à prendre en charge des langages autres que Java; en fait, le langage Java 7 ne prend pas en charge ni n'utilise ce bytecode.
Jörg W Mittag

2

Scala est sur le point d'être laissé de côté lorsque Java ajoute des lambdas, car les lambdas Java reçoivent un type en fonction du contexte dans lequel ils sont utilisés, tandis que les lambdas Scala se voient attribuer un type en fonction de leurs arités, types de paramètres et types de retour, par exemple,

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

de Java 8 peut être écrit en Scala comme:

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

sauf si vous utilisez / écrivez des wrappers convertissant Scala's () => Unit en Runnable.


Merci pour la réponse et aussi pour répondre à ma question (+1). Si je comprends bien, Scala devra continuer à utiliser des classes anonymes pour instancier des interfaces dans un contexte dans lequel Java 8 utilisera des lambdas (car les lambdas Java 8 ont une sémantique différente de celle des lambdas Scala). Un autre point qui n'est pas clair pour moi est ce qui se passera si une méthode Java renvoie un lambda Java. Que se passe-t-il si une classe Scala appelle cette méthode? Quel sera le type de retour dans Scala?
Giorgio

1
@Giorgio En Java 8, une expression lambda est un raccourci au niveau du langage pour créer une instance d'interface qui déclare une seule méthode et qui est différée par le contexte. Ainsi, lorsqu'une méthode Java 8 renvoie un lambda, elle retourne en fait une instance d'interface qui est déclarée comme type de retour de la méthode. À partir de Scala 2.9.1, le type de retour sera simplement une instance de quelque interface (Runnable ou Comparator) que vous ne pouvez pas traiter comme un lambda Scala, à moins que vous ou les versions futures de Scala libary introduisiez une conversion implicite à partir de ce interface au type Scala lambda.
hellodanylo

@SkyDan: Ok, donc Scala verra les lambdas Java comme des objets implémentant une interface. Ce point n'était pas clair pour moi: je pensais que Java générerait un bytecode différent de celui d'un objet. Mais ce doit être un objet sous le capot, sinon il ne serait pas reconnu comme la mise en œuvre d'une interface. Je pense que je l'ai maintenant.
Giorgio

@Giorgio, aussi si vous voulez en savoir plus sur les changements liés à lambda dans Java 8 et les forces qui entraînent ces changements, je vous recommande de lire cet aperçu fascinant et détaillé du projet Lambda .
hellodanylo

@SkyDan: le lire maintenant. Il me semble que lambdas faire représenter des objets (même si le type / interface est déduit du contexte dans lequel elles sont définies). Ainsi, les informations fournies sur mail.openjdk.java.net/pipermail/lambda-dev/2011-August/… ("les lambdas ne sont pas des objets") sont incorrectes ou, au moins, trompeuses.
Giorgio
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.