Dans sa quête permanente de productivité et de performances pour le langage Java, Brian Goetz, architecte du langage Java chez Oracle, et Alex Buckley, responsable des spécifications pour le langage Java et la Java Virtual Machine chez Oracle, ont proposé un ensemble de mots-clés avec trait d'union pour Java. L'objectif déclaré est de fournir un chemin pour faire évoluer un langage mature dans lequel l'ajout de nouvelles fonctionnalités peut être un défi en raison du jeu actuel de mots-clés, tel que défini dans la spécification du langage Java de Java 12.
Les objectifs de la mise en œuvre de mots-clés avec trait d'union, tels que spécifiés dans le document JDK-8223002, sont les suivants :
- Explorer les options syntaxiques possibles aux concepteurs du langage Java pour les besoins de nouvelles fonctionnalités.
- Résoudre le problème perpétuel des tokens pour mots clés qui sont si rares et coûteux que les concepteurs du langages doivent contraindre ou corrompre le modèle de programmation Java pour s'adapter aux mots clés disponibles.
- Conseiller les concepteurs du langues sur le style de mot-clé adapté à différents types de fonctionnalités.
Au fil des ans, plusieurs techniques ont été utilisées pour faire évoluer le langage: [a] eminent domain - reclassifier un identifiant en mot-clé (comme assert
dans Java 1.4 et enum
dans Java 1.5); [b] overload - réutilise un mot clé existant pour une nouvelle fonctionnalité; [c] distort - crée une syntaxe à l'aide d'un mot clé existant (tel que @interface
); [d] smoke and mirrors - et crée l'illusion d'un nouveau mot clé utilisé dans un nouveau contexte (par exemple, var
limité à des variables locales). Ces techniques ont toutes été problématiques d'une certaine manière. Par exemple, l'ajout du mot-clé assert
a cassé presque tous les frameworks de test.
Le concept de mot-clé composé complétera les techniques existantes et utilisera une combinaison de mots-clés classiques et/ou contextuels existants. Les mots clés classiques sont «une séquence de lettres Java toujours identifiée comme un mot clé, jamais comme identifiant». Les mots clés contextuels sont «une séquence de lettres Java identifiée comme un mot clé dans certains contextes mais comme identifiant dans tous les autres contextes.» Des exemples de mots clés classiques potentiels comprennent : non-final
, break-with
et value-class
. Des exemples de mots clés contextuels potentiels incluraient : non-null
, read-only
et eventually-true
.
L'une des difficultés rencontrées lors de la mise en œuvre de mots-clés avec trait d'union concerne la manière dont un lexer de recherche anticipé arbitraire ou fixe doit analyser une expression telle que a-b en trois tokens (identifiant, opérateur, identifiant) ou un mot clé constitué d'un trait d'union.
Un échange par courrier électronique d'OpenJDK plus tôt cette année a proposé d'introduire le mot clé à trait d'union break-with
pour JDK 13 (sa publication est prévue pour septembre 2019). Cependant, il a finalement été décidé d'abandonner le mot clé break-with
en faveur d'un nouveau mot clé yield
et de redéfinir la preview des expressions switch
. La finalisation éventuelle de la nouvelle syntaxe du switch
comme expression devrait permettre d'introduire le concept de pattern matching qui est à l'étude depuis près de deux ans.
Brian Goetz et Alex Buckley ont commenté les avantages et les inconvénients du concept de mot-clé avec trait d'union, en écrivant :
Laisser une fonctionnalité en dehors de Java pour des raisons de simplicité est acceptable; en laisser une de côté parce qu'il n'y a aucun moyen de dénoter la sémantique n'est pas évident. C'est un problème constant dans l'évolution du langage et un coût permanent payé par tous les développeurs Java.
Une façon de vivre sans créer de nouveaux mots-clés consiste à arrêter complètement de faire évoluer Java. Certains pensent que c'est une bonne idée, mais ce serait une raison idiote de le faire faute de tokens disponibles. Java a une longue vie devant lui et les développeurs Java sont enthousiasmés par les nouvelles fonctionnalités qui leur permettent d'écrire du code plus expressif et fiable.
Brian Goetz a parlé à InfoQ de ces mots-clés avec trait d'union proposés :
InfoQ : Quelle a été la réponse de la communauté pour les mots-clés composés d'un trait d'union dans le langage Java ?
Brian Goetz : Comme vous vous en doutez, cela couvre tout le spectre. Certains étaient ravis de voir le soin apporté à la question de savoir comment développer au mieux un langage mature ; d'autres se sont plaints du fait que l'on philosophait pour ce couper les cheveux en quatre et auraient préféré que nous travaillions sur leur fonction préférée à la place.
InfoQ : Quelle est la probabilité que les techniques existantes, «eminent domain», «overload», «distort» et «smoke and mirrors», soient à nouveau utilisées pour élargir l'ensemble des mots clés en langage Java si la proposition de mot-clés à trait d'union n'est pas acceptée ?
Brian Goetz : Je le regarde comme un ensemble d'options, avec une nouvelle option intéressante et flexible ayant été ajoutée à l'ensemble. Néanmoins, dans une situation donnée, l'une des autres options peut être encore meilleure. Nous n'excluons rien.
InfoQ : Conformément à la JEP 354, le mot-clé avec trait d'union proposé break-with
a été abandonné au profit du nouveau mot-clé, yield
pour JDK 13. Qu'est-ce qui a conduit à la décision de ne pas utiliser le premier mot-clé à trait d'union en langage Java ?
Brian Goetz : Le principal candidat avec un trait d'union était
break-with
, mais dans les groupes de discussion avec les utilisateurs, les gens trouvaient toujours cela difficile et non évident. Des mots-clés composés sont au menu, mais cela ne signifie pas que nous devons les utiliser à chaque fois. Dans l'ensemble, les gens ont trouvéyield
plus naturel (bien sûr, certains n'ont pas aimé cela, car cela leur rappelle de retourner une valeur d'une coroutine). Il s'est avéré queyield
, dans la position grammaticale spécifique dans laquelle il se trouvait, était un candidat raisonnable pour un mot clé contextuel (toutes les positions grammaticales ne sont pas aussi aptes).
InfoQ : À mesure que Java évolue plus rapidement avec le cycle de publication de six mois, quelle est la probabilité qu'un mot clé constitué d'un trait d'union soit finalement introduit dans le langage Java ?
Brian Goetz : Quand on en a besoin, c'est au menu. Il est probable que les Sealed Types nécessiteront un moyen de ne pas sceller, tels que
non-sealed
.
InfoQ : Quel est le message le plus important à retenir que vous aimeriez que nos lecteurs sachent au sujet des mots clés avec trait d'union ?
Brian Goetz : Nous sommes vraiment soucieux de trouver un équilibre entre la nécessité de faire évoluer la compatibilité du language tout en la rendant lisible.
- Brian Goetz Speaks to InfoQ on Pattern Matching for Java par InfoQ (17 septembre 2017)
- break-with par Brian Goetz (17 janvier 2019)
- Keyword Management for the Java Language par Alex Buckley (25 avril 2019)