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 !

Kotlin 1.9.0 est disponible :
Un aperçu des nouveautés et améliorations du langage de programmation

Le , par Michael Guilloux

41PARTAGES

3  0 
La version 1.9.0 de Kotlin est disponible et le compilateur K2 pour la JVM est désormais en version bêta. Cette version comprend de nouvelles fonctionnalités du langage ainsi que des améliorations pour Kotlin Multiplatform et Kotlin/Native.

Mais les nouveautés et améliorations les plus importantes portent sur les points suivants :

  • De nouvelles mises à jour du compilateur Kotlin K2
  • Un remplacement stable de la fonction values de la classe enum
  • Un opérateur ..< stable pour les plages sans limite supérieure
  • Une nouvelle fonction commune pour obtenir un groupe de capture regex par son nom
  • Un nouvel utilitaire de chemin pour créer des répertoires parent
  • Une préversion du cache de configuration Gradle dans Kotlin Multiplatform
  • Des changements pour la prise en charge de la cible Android dans Kotlin Multiplatform
  • Une préversion de l'allocation personnalisée de mémoire dans Kotlin/Native
  • Les liaisons de bibliothèque dans Kotlin/Native
  • Des optimisations de la taille des projets dans Kotlin/Wasm

Nous présentons dans la suite ces nouveautés et améliorations avec plus de détails.

Le nouveau compilateur Kotlin K2 est en version bêta pour la JVM

L'équipe Kotlin chez JetBrains continue de stabiliser le nouveau compilateur K2, et K2 pour la JVM est maintenant en version bêta alors qu'il fraie son chemin vers Kotlin 2.0. Le compilateur a été largement testé en compilant avec succès une vaste gamme de projets utilisés par l'équipe Kotlin pour l'assurance qualité.

Le compilateur K2 vise à apporter des améliorations majeures de performances, accélérer le développement de nouvelles fonctionnalités du langage, unifier toutes les plateformes prises en charge par Kotlin, et fournir une meilleure architecture pour les projets multiplateformes.

JetBrains fait de grands progrès pour faciliter la compatibilité avec d'autres plugins de compilateur populaires. Le support de Kotlin Symbol Processing (KSP) et de Jetpack Compose est en préparation, avec des projets d'intégration du support K2 à venir. N'hésitez donc pas à tester K2 sur vos projets Kotlin/JVM et à partager vos commentaires avec JetBrains. Vos retours aideront l'éditeur de logiciels pour développeurs à affiner K2 avant qu'il ne devienne le compilateur stable par défaut dans Kotlin 2.0.

L'ambition de JetBrains ne s'arrête pas là. L'éditeur s'efforce d'atteindre le même niveau de qualité pour la prise en charge multiplateforme avec le compilateur K2. Cet engagement s'inscrit dans la continuité de ses efforts actuels de stabilisation de Kotlin Multiplatform. L'objectif est d'obtenir une prise en charge de qualité bêta complète pour les projets multiplateformes dans K2 simultanément avec la version stable de Kotlin Multiplatform.

Remplacement stable de la fonction values() de la classe enum

Dans la version 1.8.20, la propriété entries pour les classes enum a été introduite en tant que fonctionnalité expérimentale. La propriété entries est un remplacement moderne et performant de la fonction synthétique values(). Dans la version 1.9.0, la propriété entries est stable. La fonction values() est toujours prise en charge, mais JetBrains vous recommande d'utiliser la propriété entries à sa place.

Code Kotlin : Sélectionner tout
1
2
3
4
5
6
7
enum class Color(val colorName: String, val rgb: String) { 
    RED("Red", "#FF0000"), 
    ORANGE("Orange", "#FF7F00"), 
    YELLOW("Yellow", "#FFFF00") 
} 
  
fun findByRgb(rgb: String): Color? = Color.entries.find { it.rgb == rgb }

Opérateur ..< stable pour les plages sans limite supérieure

Le nouvel opérateur ..< pour les plages sans limite supérieure a été introduit dans Kotlin 1.7.20 et est devenu stable dans la version 1.8.0. Dans la version 1.9.0, l'API de la bibliothèque standard pour travailler avec les plages sans limite supérieure est également stable.

Les recherches de JetBrains montrent que le nouvel opérateur ..< facilite la compréhension lorsqu'une plage sans limite supérieure est déclarée. Si vous utilisez la fonction infix until, il est facile de commettre l'erreur de supposer que la borne supérieure est incluse.

Voici un exemple utilisant la fonction until :

Code Kotlin : Sélectionner tout
1
2
3
4
5
6
7
8
fun main() { 
    for (number in 2 until 10) { 
        if (number % 2 == 0) { 
            print("$number ") 
        } 
    } 
    // 2 4 6 8 
}


Et voici un exemple utilisant le nouvel opérateur ..< :

Code Kotlin : Sélectionner tout
1
2
3
4
5
6
7
8
fun main() { 
    for (number in 2..<10) { 
        if (number % 2 == 0) { 
            print("$number ") 
        } 
    } 
    // 2 4 6 8 
}


Nouvelle fonction commune pour obtenir un groupe de capture regex par son nom

Avant la version 1.9.0, chaque plateforme avait sa propre extension pour obtenir un groupe de capture d'une expression régulière par son nom à partir d'une correspondance d'expression régulière. Cependant, il n'existait pas de fonction commune. Il n'était pas possible d'avoir une fonction commune avant Kotlin 1.8.0, car la bibliothèque standard prenait encore en charge les cibles JVM 1.6 et 1.7.

À partir de Kotlin 1.8.0, la bibliothèque standard est compilée avec la cible JVM 1.8. Ainsi, dans la version 1.9.0, il existe désormais une fonction commune groups que vous pouvez utiliser pour récupérer le contenu d'un groupe en utilisant son nom dans une correspondance d'expression régulière. Cela est utile lorsque vous souhaitez accéder aux résultats des correspondances d'expressions régulières appartenant à un groupe de capture particulier.

Voici un exemple avec une expression régulière contenant trois groupes de capture : "city", "state" et "areaCode". Vous pouvez utiliser ces noms de groupe pour accéder aux valeurs correspondantes :

Code Kotlin : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
fun main() { 
    val regex = """\b(?<city>[A-Za-z\s]+),\s(?<state>[A-Z]{2}):\s(?<areaCode>[0-9]{3})\b""".toRegex() 
    val input = "Coordinates: Austin, TX: 123" 
  
    val match = regex.find(input)!! 
    println(match.groups["city"]?.value) 
    // Austin 
    println(match.groups["state"]?.value) 
    // TX 
    println(match.groups["areaCode"]?.value) 
    // 123 
}


Nouvel utilitaire de chemin pour créer des répertoires parent

Dans la version 1.9.0, il existe une nouvelle fonction d'extension createParentDirectories() que vous pouvez utiliser pour créer un nouveau fichier avec tous les répertoires parent nécessaires. Lorsque vous fournissez un chemin de fichier à createParentDirectories(), il vérifie si les répertoires parent existent déjà. S'ils existent, il ne fait rien. Cependant, s'ils n'existent pas, il les crée pour vous.

createParentDirectories() est particulièrement utile lorsque vous copiez des fichiers. Par exemple, vous pouvez l'utiliser en combinaison avec la fonction copyToRecursively() :

Code Kotlin : Sélectionner tout
1
2
3
4
sourcePath.copyToRecursively( 
   destinationPath.createParentDirectories(), 
   followLinks = false 
)


Préversion du cache de configuration Gradle dans Kotlin Multiplatform

Kotlin 1.9.0 prend en charge le cache de configuration Gradle dans les bibliothèques multiplateformes. Si vous êtes l'auteur d'une bibliothèque, vous pouvez déjà profiter des performances améliorées du build.

Le cache de configuration Gradle accélère le processus de build en réutilisant les résultats de la phase de configuration pour les build ultérieurs. Cette fonctionnalité est devenue stable depuis Gradle 8.1.

Notons que le plugin Kotlin Multiplatform ne prend pas encore en charge le cache de configuration Gradle avec les tâches d'intégration Xcode ou le plugin Gradle Kotlin CocoaPods. JetBrains prévoit d'ajouter cette fonctionnalité dans les futures versions de Kotlin.

Modifications pour la prise en charge de la cible Android dans Kotlin Multiplatform

L'équipe Kotlin poursuit ses efforts pour stabiliser Kotlin Multiplatform. Une étape essentielle consiste à fournir une prise en charge de premier ordre pour la cible Android. JetBrains annonce que dans le futur, l'équipe Android de Google fournira son propre plugin Gradle pour prendre en charge Android dans Kotlin Multiplatform.

Pour ouvrir la voie à cette nouvelle solution de Google, JetBrains est en train de renommer le bloc android dans la DSL Kotlin actuelle dans la version 1.9.0. Veuillez modifier toutes les occurrences du bloc android en androidTarget dans vos scripts de build. Il s'agit d'un changement temporaire nécessaire pour libérer le nom android pour la prochaine DSL de Google.

Le plugin de Google sera la méthode recommandée pour travailler avec Android dans les projets multiplateformes. Lorsqu'il sera prêt, JetBrains fournira les instructions de migration nécessaires pour que vous puissiez utiliser le nom android comme auparavant.

Aperçu de l'allocation personnalisée de mémoire dans Kotlin/Native

Kotlin 1.9.0 introduit l'aperçu d'une allocation personnalisée de mémoire. Son système d'allocation améliore les performances d'exécution du gestionnaire de mémoire Kotlin/Native.

Le système d'allocation d'objets actuel dans Kotlin/Native utilise un allocateur polyvalent qui ne dispose pas des fonctionnalités nécessaires pour une récupération de mémoire efficace. Pour compenser cela, il maintient des listes chaînées locales aux threads de tous les objets alloués avant que le garbage collector (GC) ne les fusionne en une seule liste, qui peut être parcourue lors du balayage de mémoire. Cette approche présente plusieurs inconvénients en termes de performances :

  • L'ordre de balayage manque de localité de mémoire et entraîne souvent des motifs d'accès mémoire dispersés, ce qui peut entraîner des problèmes de performances potentiels.
  • Les listes chaînées nécessitent une mémoire supplémentaire pour chaque objet, augmentant l'utilisation de la mémoire, en particulier lorsqu'il y a de nombreux petits objets.
  • La liste unique des objets alloués rend difficile la parallélisation du balayage, ce qui peut entraîner des problèmes d'utilisation de la mémoire lorsque les threads mutateurs allouent des objets plus rapidement que le thread GC ne peut les collecter.

Pour remédier à ces problèmes, Kotlin 1.9.0 introduit un aperçu de l'allocation personnalisée de mémoire. Elle divise la mémoire système en pages, permettant un balayage indépendant dans un ordre consécutif. Chaque allocation devient un bloc mémoire dans une page, et la page conserve les tailles des blocs. Différents types de pages sont optimisés pour différentes tailles d'allocation. L'arrangement consécutif des blocs mémoire garantit une itération efficace à travers tous les blocs alloués.

Lorsqu'un thread alloue de la mémoire, il recherche une page appropriée en fonction de la taille d'allocation. Les threads conservent un ensemble de pages pour différentes catégories de tailles. Généralement, la page actuelle pour une taille donnée peut accueillir l'allocation. Sinon, le thread demande une autre page à partir de l'espace d'allocation partagé. Cette page peut déjà être disponible, nécessiter un balayage ou devoir être créée d'abord.

Le nouvel allocateur permet d'avoir plusieurs espaces d'allocation indépendants simultanément, ce qui permettra à l'équipe Kotlin d'expérimenter différentes mises en page pour améliorer encore les performances.

Pour l'activer, ajoutez l'option du compilateur -Xallocator=custom :

Code Kotlin : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
kotlin { 
    macosX64("native") { 
        binaries.executable() 
  
        compilations.configureEach { 
            compilerOptions.configure { 
                freeCompilerArgs.add("-Xallocator=custom") 
            } 
        } 
    } 
}


Liaison de bibliothèque dans Kotlin/Native

À partir de Kotlin 1.9.0, le compilateur Kotlin/Native traite les problèmes de liaison dans les bibliothèques Kotlin de la même manière que Kotlin/JVM. Vous pourriez rencontrer de tels problèmes si l'auteur d'une bibliothèque Kotlin tierce apporte une modification incompatible aux API expérimentales qu'une autre bibliothèque Kotlin tierce utilise.

Maintenant, les builds ne vont pas échouer pendant la compilation en cas de problèmes de liaison entre les bibliothèques Kotlin tierces. Au lieu de cela, vous rencontrerez ces erreurs uniquement lors de l'exécution, exactement comme sur la JVM.

Le compilateur Kotlin/Native signale des avertissements chaque fois qu'il détecte des problèmes de liaison de bibliothèque. Vous pouvez trouver ces avertissements dans les journaux de compilation. Vous pouvez configurer ce comportement de manière plus approfondie, voire le désactiver dans vos projets.

  • Si vous ne souhaitez pas voir ces avertissements dans vos journaux de compilation, supprimez-les en utilisant l'option du compilateur -Xpartial-linkage-loglevel=INFO.
  • Il est également possible d'élever la gravité des avertissements signalés pour les transformer en erreurs de compilation avec l'option -Xpartial-linkage-loglevel=ERROR. Dans ce cas, la compilation échoue et vous verrez toutes les erreurs dans le journal de compilation. Vous pouvez utiliser cette option pour examiner de plus près les problèmes de liaison.
  • Si vous rencontrez des problèmes inattendus avec cette fonctionnalité, vous pouvez toujours la désactiver en utilisant l'option du compilateur -Xpartial-linkage=disable. De ces cas, n'hésitez pas à les signaler à JetBrains.

Code Kotlin : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// An example of passing compiler options via Gradle build file. 
kotlin { 
    macosX64("native") { 
        binaries.executable() 
  
        compilations.configureEach { 
            compilerOptions.configure { 
  
                // To suppress linkage warnings: 
                freeCompilerArgs.add("-Xpartial-linkage-loglevel=INFO") 
  
                // To raise linkage warnings to errors: 
                freeCompilerArgs.add("-Xpartial-linkage-loglevel=ERROR") 
  
                // To disable the feature completely: 
                freeCompilerArgs.add("-Xpartial-linkage=disable") 
            } 
        } 
    } 
}


Optimisations liées à la taille des projets dans Kotlin/Wasm

Kotlin 1.9.0 introduit des améliorations significatives de la taille des projets WebAssembly (Wasm). En comparant deux projets "Hello World", l'empreinte de code pour Wasm dans Kotlin 1.9.0 est désormais plus de 10 fois plus petite que dans Kotlin 1.8.20.

Ces optimisations de taille se traduisent par une utilisation plus efficace des ressources et des performances améliorées lors du ciblage des plateformes Wasm avec du code Kotlin.

Comment installer Kotlin 1.9.0

Voici présentées les principales nouveautés et améliorations introduites dans Kotlin 1.9.0. Vous obtiendrez la liste complète des changements dans les notes de version.

Si vous utilisez déjà IntelliJ IDEA 2022.3.3 ou 2023.1.1, l'EDI vous proposera automatiquement de mettre à jour Kotlin vers la version 1.9.0. Vous pouvez également effectuer une mise à jour manuelle. IntelliJ IDEA 2023.2 aura le plugin Kotlin 1.9.0 intégré.

Pour Android Studio Giraffe (223) et Hedgehog (231), le plugin Kotlin 1.9.0 sera fourni avec les prochaines mises à jour d'Android Studio. Si vous avez besoin du compilateur en ligne de commande, vous pouvez le télécharger sur la page GitHub de la nouvelle version de Kotlin.

Nouveautés de Kotlin 1.9.0

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