Il y a quelques mois, l'architecte Oracle JVM John Rose et l'architecte Oracle du langage Java Brian Goetz ont publié la première proposition minimale sur les value types (NdlT: "types valeurs"). Les value types permettront aux développeurs de définir de nouveaux types qui partagent certaines sémantiques avec les types primitifs. L'objectif de cette proposition initiale est simplement de permettre le prototypage et l'expérimentation ainsi que la production des premiers micro-benchmarks. Puisque la version finale n'est pas attendue avant Java 10, la proposition n'ajoute qu'une seule nouvelle instruction de bytecode pour le support des value types et remet tout changement du langage Java à une version ultérieure.
Puisque le langage Java lui-même n'est pas modifié par cette proposition, la seule manière d'utiliser les nouvelles fonctionnalités sera au travers des instructions bytecode adéquates. Cela signifie que seuls les développeurs travaillant sur des outils de génération de bytecode, tels que les développeurs de langages JVM, auront accès aux value types. En plus de ça, les capacités des value types ne seront disponibles que pour les classes dénotées et construites à cet effet, qui sont chargées dans des modules spécifiques aux value types et qui sont présents dans des fichiers de classe d'une version mineure et majeure bien précise. Cette approche hautement isolée assure que les utilisateurs avancés peuvent accéder aux nouvelles capacités de la JVM, tandis que les utilisateurs ordinaires peuvent continuer d'utiliser la JVM sans rencontrer de problèmes.
L'ensemble des changements supportant cette première version des value types peuvent être trouvés dans la proposition, qui peut être résumée aux quatre éléments suivants :
- Une nouvelle annotation appelée
@DerivedValueType
pour indiquer à la JVM un type value-capable (NdlT: "type valorisable"). Il est important de distinguer ici value type et value-capable type. Les types value-capable sont des classes Java ordinaires que la JVM peut utiliser pour générer un value type. Si les value types ne sont pas activés, alors le value-capable type est juste une classe ordinaire. - Une extension du format du fichier
.class
pour ajouter la définition d'un nouveau descripteur Q-Type. Le format actuel définit les signatures de type via une lettre, incluant les primitives (I pour integer, C pour character, etc) et ce qui est appelé un L-Type pour les objets (L suivi du nom pleinement qualifié de la classe, par exemple "Ljava/lang/String;"). Le Q-Type fonctionnera de manière similaire à un L-Type mais sera spécifique aux value types (et son descripteur commencera par la lettre Q). - Une nouvelle instruction bytecode appelée "
typed
" pour déplacer les Q-Types vers et depuis la pile. La nouvelle instruction fonctionnera comme une sorte de macro-instruction, c'est à dire qu'elle pourra être combinée avec d'autres instructions existantes pour simuler l'existence de multiples nouveaux bytecodes. Cette approche donnera deux paramètres àtyped
: un index pointant sur la définition du Q-Type de sorte que la JVM sache ce qu'elle doit charger ou stocker, et un second bytecode indiquant l'opération à exécuter. Cela est similaire à l'opérateur existantwide
. - Une nouvelle classe appelée
ValueType<T>
avec des méthodes pour exécuter de la réflexion sur les Q-Types, de manière analogue àClass<T>
pour les types ordinaires. Ceci est particulièrement important parce que pour réduire le nombre de nouvelles instructions bytecode au minimum nécessaire, il n'y aura pour le moment pas d'instructions pour créer ou manipuler les Q-Types. Offrir des capacités de réflexion signifie que ces opérations peuvent quand même être réalisées au travers du handle de méthode adéquat, mais sans avoir à s'engager sur une nouvelle instruction bytecode.
Cette proposition est loin d'être complète et sa nature expérimentale suggère qu'elle diffèrera de la version finale. Comme les auteurs eux-mêmes l'ont indiqué, il y a toujours une chance qu'aucun de ces éléments ne fasse partie de la release finale. Cependant, cette version permettra le prototypage avec le Projet Panama ou les expérimentations sur GPU, ce qui donnera un retour sur les performances, l'effort de développement nécessaire pour une solution complète et sur l'ergonomie. Par exemple, l'une des choses que l'on s'attend à découvrir au travers de cette activité est l'ensemble final d'instructions bytecode qui devraient être ajoutées à la JVM pour pleinement supporter les value types.