IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

JDK 19 : les nouvelles fonctionnalités de Java 19 incluent la concurrence structurée, les modèles d'enregistrement
Et l'aperçu d'une API de fonction et de mémoire étrangères

Le , par Bill Fassinou

60PARTAGES

5  0 
L'équipe de développement du JDK a annoncé que le JDK 19 est désormais complet, car il a atteint la phase initiale de lancement. Cela signifie que le dépôt de sources principal a été transféré vers le dépôt de stabilisation du JDK et qu'aucun JEP (Java Enhancement Proposal) supplémentaire ne sera ajouté au JDK 19. Sept fonctionnalités sont prévues dans cette version, notamment la concurrence structurée, les modèles d'enregistrement, un aperçu d'une fonction étrangère et d'une API de mémoire, ainsi que la prise en charge de l'architecture de jeu d'instructions (ISA) Linux/RISC-V. Java 19 sera disponible en septembre 2022.

Conformément au calendrier de sortie du JDK 19, Mark Reinhold, architecte en chef du groupe Java Platform d'Oracle, a annoncé que les ajouts à la prochaine version du kit de développement sont terminés. Pour rappel, une nouvelle version standard de Java est publiée tous les six mois. Avec cette dernière étape dans le processus de publication de la version standard de Java, les autres fonctionnalités prévues, telles que les génériques universels et les objets de valeur, devront attendre une version ultérieure de la plateforme. Les nouvelles fonctionnalités du JDK 19 comprennent :

JEP 405 : un aperçu des modèles d'enregistrement

Cette proposition a pour but d'améliorer le langage de programmation Java avec des motifs d'enregistrement (Record Patterns) pour déconstruire les valeurs d'enregistrement. Les modèles d'enregistrement et les modèles de type peuvent être imbriqués pour permettre une forme puissante, déclarative et composable de navigation et de traitement des données. Il s'agit d'une fonctionnalité du langage en avant-première. Les objectifs de la proposition comprennent l'extension de la correspondance de motifs pour exprimer des requêtes de données plus sophistiquées et composables, sans modifier la syntaxe ou la sémantique des patrons de type.



Cette proposition s'appuie sur la correspondance de motifs pour instanceof, livré dans le JDK 16 en mars 2021. Les plans pourraient prévoir l'extension des modèles d'enregistrement avec des capacités telles que les modèles de tableaux et les modèles de variables. Les modèles d'enregistrement font partie du projet Amber, un effort visant à explorer et à incuber des fonctionnalités Java plus petites et orientées vers la productivité.

JEP 422 : la prise en charge de l'architecture de jeu d'instructions Linux/RISC-V

RISC-V est une architecture de jeu d'instructions (ISA) RISC libre et open source, conçue à l'origine à l'Université de Californie, Berkeley, et maintenant développée en collaboration sous le parrainage de RISC-V International. Elle est déjà prise en charge par un large éventail de chaînes d'outils de langage. Selon l'équipe du JDK, avec la disponibilité croissante du matériel RISC-V, un portage du JDK serait précieux. Avec le portage Linux/RISC-V, Java obtiendrait la prise en charge d'un jeu d'instructions matérielles qui est déjà pris en charge par un large éventail de chaînes d'outils de langage.

RISC-V est en fait une famille d'ISA connexes. Le portage Linux/RISC-V ne prendrait en charge que la configuration RV64GV de RISC-V, un ISA 64 bits à usage général qui inclut des instructions vectorielles. Les développeurs de Java pourraient envisager d'autres configurations RISC-V à l'avenir.

JEP 424 : un aperçu d'une API de fonction et de mémoire étrangères

Cette proposition vise à introduire une API grâce à laquelle les programmes Java peuvent interagir avec le code et les données en dehors de l'environnement d'exécution Java. En invoquant efficacement des fonctions étrangères (c'est-à-dire du code extérieur à l'environnement d'exécution Java) et en accédant en toute sécurité à la mémoire étrangère (c'est-à-dire la mémoire non gérée par la JVM), l'API permet aux programmes Java d'appeler des bibliothèques natives et de traiter des données natives sans le danger et la fragilité de Java Native Interface (JNI).

L'API de fonction et de mémoire étrangères (Foreign Function and Memory API) combine deux API antérieures en incubation : l'API d'accès à la mémoire étrangère et l'API de liaison étrangère. L'API de fonction et de mémoire étrangères a été incubée dans le JDK 17 et réincubée dans le JDK 18. Les objectifs de la proposition comprennent la facilité d'utilisation, les performances, la généralité et la sécurité. Il s'agit dans le JDK 19 d'un aperçu de l'API.

JEP 425 : un aperçu des threads virtuels

La proposition vise à introduire les threads virtuels dans la plate-forme Java. Les threads virtuels sont des threads légers qui réduisent considérablement les efforts d'écriture, de maintenance et d'observation des applications concurrentes à haut débit. Les objectifs sont : permettre aux applications serveur écrites dans le style simple "thread par requête" de s'adapter à une utilisation matérielle quasi optimale, permettre au code existant qui utilise l'API java.lang Thread d'adopter les threads virtuels avec un minimum de changements, et permettre le dépannage, le débogage et le profilage des threads virtuels avec les outils JDK existants.

L'objectif de cette proposition n'est pas de modifier le modèle de concurrence de base de Java ni de proposer une nouvelle construction de parallélisme des données dans le langage Java ou les bibliothèques Java. Elle n'a pas non plus pour objectif de supprimer l'implémentation traditionnelle des threads ou de faire migrer silencieusement les applications existantes vers l'utilisation des threads virtuels. Il s'agit dans le JDK 19 d'un aperçu de l'API.

JEP 426 : une quatrième incubation d'une API vectorielle

Cette proposition vise à introduire une API pour exprimer des calculs vectoriels qui se compilent de manière fiable au moment de l'exécution en instructions vectorielles optimales sur les architectures de CPU prises en charge, ce qui permet d'obtenir des performances supérieures aux calculs scalaires équivalents. Les développeurs qui utilisent l'API obtiennent un moyen d'écrire des algorithmes vectoriels complexes en Java, en utilisant l'auto-vectoriseur HotSpot, mais avec un modèle utilisateur qui rend les vectorisations plus prévisibles et plus robustes. L'API vectorielle a été incubée dans les JDK 16, JDK 17 et JDK 18.

Les améliorations de l'API proposées pour le JDK 19 comprennent des améliorations pour charger et stocker des vecteurs vers et depuis des MemorySegments, comme défini par l'aperçu de l'API de fonction et de mémoire étrangères. Le JDK 19 ajouterait également deux opérations vectorielles intervoies compress et expand, ainsi qu'une opération complémentaire de compression de masque vectoriel.

L'opération de compression de vecteur fait correspondre les voies d'un vecteur source, sélectionné par un masque, à un vecteur de destination dans l'ordre des voies, tandis que l'opération d'expansion fait l'inverse. L'opération de compression est utile pour filtrer les résultats des requêtes. Dans un autre ajout à l'API vectorielle, les opérations de voie intégrale par bit seraient étendues, y compris les opérations telles que le comptage du nombre de bits à 1, l'inversion de l'ordre des bits, et la compression et l'expansion des bits.

Les objectifs de l'API sont d'être claire et concise, indépendante de la plateforme, d'avoir des performances d'exécution et de compilation fiables sur les architectures x64 et AArch64, et de permettre une dégradation "gracieuse", pour les situations dans lesquelles un calcul vectoriel ne peut pas être entièrement exprimé à l'exécution comme une séquence d'opérations vectorielles.

JEP 427 : une troisième aperçu de la correspondance de motifs pour switch

Cette proposition vise à améliorer le langage de programmation Java grâce à la correspondance de motifs pour les expressions et instructions switch. L'extension de la correspondance de motifs à switch permet de tester une expression par rapport à un certain nombre de motifs, chacun ayant une action spécifique, de sorte que les requêtes complexes orientées données peuvent être exprimées de manière concise et sûre. Il s'agit d'une fonctionnalité du langage en avant-première. Cette fonctionnalité a déjà été présentée en avant-première dans les JDK 17 et JDK 18.

Le troisième aperçu ajoutera des raffinements, notamment le remplacement des motifs protégés par des clauses when dans les blocs switch. Les objectifs du plan comprennent l'élargissement de l'expressivité et de l'applicabilité des expressions et instructions switch en permettant aux motifs d'apparaître dans les étiquettes de cas.

Il s'agit aussi de permettre aux développeurs d'assouplir, s'ils le souhaitent, l'hostilité historique de when à l'égard de null, d'accroître la sécurité des instructions switch et de garantir que les expressions et instructions switch existantes continuent à être compilées sans changement et à s'exécuter avec une sémantique identique.

JEP 428 : la concurrence structurée

Cette proposition vise à simplifier la programmation multithread en en introduisant une bibliothèque pour la concurrence structurée (Structured Concurrency). La concurrence structurée traite plusieurs tâches exécutées dans différents threads comme une seule unité de travail, rationalisant ainsi la gestion et l'annulation des erreurs, améliorant la fiabilité et l'observabilité. Il s'agit d'une API en cours d'incubation.

En effet, d'après l'équipe, les développeurs Java gèrent la complexité en décomposant une tâche en plusieurs sous-tâches. Dans un code ordinaire à un seul thread, les sous-tâches s'exécutent de manière séquentielle. Toutefois, si les sous-tâches sont suffisamment indépendantes les unes des autres et si les ressources matérielles sont suffisantes, il est possible d'accélérer l'exécution de la tâche (latence réduite) en exécutant les sous-tâches simultanément.

Par exemple, une tâche qui compose les résultats de plusieurs opérations d'E/S s'exécutera plus rapidement si chaque opération d'E/S est exécutée dans son propre thread. Grâce à la disponibilité des threads virtuels, il est rentable de dédier un thread à chaque opération d'entrée/sortie. Cependant, l'équipe rappelle que la concurrence structurée ne vise pas les objectifs suivants :

  • l'objectif de cette JEP n'est pas de remplacer les constructions de concurrence de java.util.concurrent, telles que ExecutorService et Future ;
  • l'objectif de ce JEP n'est pas de fournir une API de concurrence structurée définitive pour Java. D'autres constructions de concurrence structurées peuvent être ajoutées par des bibliothèques tierces ou dans les futures versions du JDK ;
  • l'objectif de ce JEP n'est pas de proposer un mécanisme de partage des flux de données entre les threads ("canaux"). Cette question pourrait être abordée par une future JEP ;
  • l'objectif de ce JEP n'est pas de remplacer le mécanisme d'interruption de thread existant par un nouveau mécanisme d'annulation de thread. Cette question pourrait être traitée par un futur JEP.


La sortie officielle du JDK 19 pour une utilisation en production est prévue pour le 20 septembre, précédée d'une seconde phase de lancement débutant le 21 juillet, et de la publication des versions candidates (RC) les 11 et 25 août. Les versions d'accès anticipé du JDK 19 sont accessibles sur le site du JDK.

Source : Java 19

Et vous ?

Que pensez-vous des nouvelles fonctionnalités de Java 19 ?

Voir aussi

JDK 18, l'implémentation de référence de Java 18, est désormais disponible, elle propose comme Python, Ruby, PHP ou encore Erlang, un mini serveur Web prêt à l'emploi

La version 2022.1 d'IntelliJ IDEA va prendre en charge les fonctionnalités de Java 18 : un aperçu des mises à jour pour le langage

Les contrôleurs de conformité d'Oracle incluraient désormais Java dans les audits de licence, les abonnements payants introduits il y a trois ans retiennent désormais l'attention de l'équipe

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de thelvin
Modérateur https://www.developpez.com
Le 30/07/2022 à 3:32
Citation Envoyé par 23JFK Voir le message
C'est quoi cette idée à la con de casser la portabilité en privilégiant l'encodage système sur UTF-8 ?
L'idée c'est que depuis Java 18, on a arrêté d'avoir un "charset par défaut" dans Java qui dépende de la machine sur laquelle on fait tourner le programme.

Ça fait maintenant un certain temps qu'il est moins souvent utile pour un programme, de s'adapter à la machine en cours, que de simplement faire comme tout le monde et d'utiliser utf-8.

Du coup, depuis Java 18, le charset par défaut c'est utf-8 et puis c'est tout. Peu importe la machine. On peut en définir un autre avec des options de démarrage, mais si on fait rien contre, désormais le charset par défaut c'est utf-8. Pour la plupart des usages, c'est très bien, ça unifie le comportement de Java quelle que soit la machine sur laquelle on programme, et ça évite d'encourager des bugs.

Par contre il y a un truc nase, c'est que sous windows, les consoles n'utilisent pas l'encodage utf-8. Or l'encodage pour écrire dans la console, c'était l'encodage par défaut (ce qui ne marchait d'ailleurs pas bien, parce que sous Windows, les consoles n'utilisent pas le même charset que le reste du système. N'empêche, c'était comme ça.) De ce fait, il a été décidé que changer le charset par défaut alors que sur les consoles Windows il y a peu de chances que ce soit le bon, c'était pas top et donc pour le cas précis de System.out et System.err, le charset utilisé reste le même qu'avant Java 18. Un nouveau réglage de charset est inventé, seulement pour System.out et System.err.

Comme ça si les gens avaient reconfiguré leurs consoles pour afficher les accents des programmes Java, ça continuerait de marcher tout pareil.

Sauf que :

- il y en a qui utilisent des consoles "moins communes" qui utilisent bel et bien l'encodage utf-8. Du coup pour ce cas c'était pas une bonne idée d'empêcher l'usage d'utf-8, donc on fournit un moyen de l'utiliser.
- ceux qui essayaient d'afficher correctement les accents des programmes Java dans la console, ils ne configuraient pas la console. Ils programmaient leur programme Java pour utiliser le charset de la console. Une méthode (assez mauvaise) de faire ça est de démarrer le programme Java avec comme charset par défaut, celui de la console. Ça marchait mais ça change le charset par défaut de tout le programme juste pour gérer la console. Mais donc, depuis Java 18, ce système est cassé puisque System.out et System.err n'utilisent plus le charset par défaut. D'où le besoin d'un réglage qui permette de refaire un truc de ce genre comme avant. Ce ne sera probablement pas utilisé pour faire de l'utf-8, mais autre chose. Peu importe, on a un exemple de comment s'en servir.
3  0 
Avatar de walfrat
Membre émérite https://www.developpez.com
Le 14/06/2022 à 9:50
Beaucoup de chose intéressantes, mais je suis toujours collé au JDK 8 au boulot
2  0 
Avatar de OButterlin
Modérateur https://www.developpez.com
Le 30/07/2022 à 16:29
Citation Envoyé par 23JFK Voir le message
Faut quand même vouloir se faire mal pour utiliser System.out dans une console windows.
Non, pas du tout, ça dépend du type de programme qu'on développe.
Par exemple, j'ai développé une API pour intégrer des fichiers csv / xls(x) / reqûetes SQL etc, la sortie System.out est très utile pour tracer l'activité des processeurs d'intégration, et ça permet au système de planification des travaux de récupérer une log utile en cas de problème.

Bien sûr, je n'utilise pas ça dans une application web ou dans un EJB métier...
2  0 
Avatar de 23JFK
Membre expert https://www.developpez.com
Le 29/07/2022 à 20:00
C'est quoi cette idée à la con de casser la portabilité en privilégiant l'encodage système sur UTF-8 ?
3  2 
Avatar de thelvin
Modérateur https://www.developpez.com
Le 04/12/2022 à 17:06
Ben oui mais alors tu fais des reproches à Java que tu ne fais jamais à rien d'autre.

Tous les systèmes fonctionnent comme ça, avec ces effets, depuis que tu existes. Mais maintenant c'est Java ta tête de turc.

Tu reproches littéralement à Java de ne pas être resté à la version que tu t'es mis à utiliser à un moment, puisque par définition de nouvelles versions ça veut dire des changements, et que par définition un changement fait qu'un truc qui comptait sur le fait que ce soit pas comme ça, se met à ne plus marcher. Ça signifie qu'aucun effort de compatibilité ascendante n'est parfait, comme notamment ça n'a jamais été particulièrement bon dans aucune chose que tu aies jamais utilisée. Et pourtant ce n'est pas à tout le reste que tu fais des reproches.

Et sinon, si quelque chose ne marche pas en changeant la version "canonique" de Java installée sur un système, il suffit de ne pas la changer en installant d'autres versions. Rien de malsain là-dedans.
1  0 
Avatar de Sachin Bhatt
Membre à l'essai https://www.developpez.com
Le 29/06/2022 à 15:45
Des trucs géniaux. Mais je devrai également faire des recherches détaillées sur les autres fonctionnalités de Java 18.
0  0 
Avatar de smillien62
Futur Membre du Club https://www.developpez.com
Le 15/11/2022 à 12:21
Pour basculer la console Windows en UTF-8 :
chcp 65001
0  0 
Avatar de grunt2000
Membre éclairé https://www.developpez.com
Le 01/12/2022 à 19:35
Les amis, mais connaissez-vous une entreprise qui utilise java 17 en production ?
Si c'est le cas, c'est à l'unité. Rien n'est compatible avec lui, et de loin :
chaque ligne commande pour lancer un traitement existant s'agrémente de

Code : Sélectionner tout
1
2
3
4
5
6
java --add-exports java.base/sun.nio.ch=ALL-UNNAMED \
   --add-opens java.base/java.util=ALL-UNNAMED \
   --add-opens java.base/java.nio=ALL-UNNAMED \
   --add-opens java.base/java.lang=ALL-UNNAMED \
   --add-opens java.base/java.lang.invoke=ALL-UNNAMED \
   -jar leProgramme.jar
Alors, Java 19, quand il y a zéro utilisateurs de Java 17... À quoi bon...
Depuis le flop des modules, les choix sont discutables.
0  0 
Avatar de thelvin
Modérateur https://www.developpez.com
Le 02/12/2022 à 5:52
Hello,

on est pas encore en prod mais on utilise Java 17 pour nos versions en cours de release, et on a pas détecté de problème de ce genre-là.
C'est pas en prod, mais c'est en dev, QA, staging et on attaque la pré-prod lundi.

On notera :

- que nous on n'utilise pas les modules, du coup oui c'est pas surprenant qu'on ait pas ce problème-là.
- que des bibliothèques populaires de l'écosystème Java qui comptent comme module sans nom, il en reste plus franchement des quantités. (Au boulot on utilise pas les modules, mais je le fais à titre perso et elles ont toutes un nom.)
- qu'on est pas censé utiliser les classes fournies par la JVM en dehors des packages java et javax. Et que ça fait plus de 15 ans que tout le monde s'en passe sans problème.
0  0 
Avatar de grunt2000
Membre éclairé https://www.developpez.com
Le 02/12/2022 à 22:22
Je vois ça avec les exécutables existants que j'ai à droite et à gauche dans l'entreprise.

Je ne peux pas dire chacun de quels dépendances ils sont faits qui amènent quels problèmes, parce qu'avec les dépendances, par Maven, l'une tire l'autre et une application peut rassembler souvent 20 à 50 jars.
Simplement, constater qu'ils ne se lancent pas du premier coup, sans réglages.

Il y a peu, j'essayais Spark et Zeppelin : eh bien, aucun ne passe en Java 17. Java 17 n'assure pas la compatibilité ascendante. En tous cas, pas instantanément : il faut faire des réglages pour avoir un fonctionnement correct, ce qui implique d'avoir la capacité d'intervenir sur toutes les applications : retrouver leurs .sh de lancement, pour les adapter. Faut avoir le temps et l'envie.

Le problème, c'est pas de passer un programme en Java 17.
Mais que tous les programmes qui sont sur son PC ou serveur le supportent : parce que c'est rare (et pas sain) les machines avec deux JDK ou Java de versions différentes qui fonctionnent conjointement. Donc on préfère migrer un bon coup.
Et là, c'est vraiment pas parti pour. Java 17 m'a l'air d'être un flop, ce qui m'interroge sur la suite de Java. Java 19 ? À quoi bon ? Si personne n'est sur le 17 ?
0  0