{"id":246168,"date":"2022-04-04T12:09:26","date_gmt":"2022-04-04T11:09:26","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2022\/04\/kotlin-1-6-20-released\/"},"modified":"2025-09-18T13:49:03","modified_gmt":"2025-09-18T12:49:03","slug":"publication-de-kotlin-1-6-20","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2022\/04\/publication-de-kotlin-1-6-20\/","title":{"rendered":"Publication de Kotlin 1.6.20"},"content":{"rendered":"<p>Nous avons publi\u00e9 Kotlin 1.6.20. Cette nouvelle version donne un aper\u00e7u des futures fonctionnalit\u00e9s du langage et apporte la structure hi\u00e9rarchique par d\u00e9faut pour les projets multiplateformes et des am\u00e9liorations de performances pour les plateformes JVM, JS et Native.<\/p>\n<p>Cet article pr\u00e9sente les am\u00e9liorations suivantes et fournit une <a title=\"#complete-list-of-improvements\" href=\"#complete-list-of-improvements\">liste compl\u00e8te des autres \u00e9volutions<\/a>\u00a0:<\/p>\n<ul>\n<li>Nouvelle prise en charge de la d\u00e9finition des d\u00e9clarations d\u00e9pendantes du contexte dans Kotlin\/JVM r\u00e9sultant du <a title=\"#prototype-of-context-receivers-for-kotlin-jvm\" href=\"#prototype-of-context-receivers-for-kotlin-jvm\">prototype de r\u00e9cepteurs de contexte<\/a>.<\/li>\n<li>Am\u00e9lioration de l&#8217;interop\u00e9rabilit\u00e9 avec les classes et interfaces g\u00e9n\u00e9riques Java gr\u00e2ce aux <a title=\"#definitely-non-nullable-types\" href=\"#definitely-non-nullable-types\">types d\u00e9finitivement non-nullables<\/a>.<\/li>\n<li>Acc\u00e9l\u00e9ration de la dur\u00e9e des builds r\u00e9sultant de la <a title=\"#support-for-parallel-compilation-of-a-single-module-in-the-JVM-backend\" href=\"#support-for-parallel-compilation-of-a-single-module-in-the-JVM-backend\">compilation parall\u00e8le d&#8217;un module unique dans le backend IR de la JVM<\/a>.<\/li>\n<li>Exp\u00e9rience de d\u00e9veloppement optimis\u00e9e, facilit\u00e9e par la <a href=\"#incremental-compilation-for-development-binaries-with-kotlin-js-ir-compiler\">compilation incr\u00e9mentale dans Kotlin\/JS IR<\/a>.<\/li>\n<li><a href=\"#kotlin-native-performance-improvements\">Am\u00e9liorations des performances de Kotlin\/Native<\/a>.<\/li>\n<li>Partage du code facilit\u00e9 par la <a href=\"#hierarchical-structure-support-for-multiplatform-projects\">structure hi\u00e9rarchique des projets multiplateformes<\/a>.<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"Nouveaut\u00e9s de Kotlin 1.6.20\" src=\"https:\/\/www.youtube.com\/embed\/8F19ds109-o?feature=oembed\" width=\"500\" height=\"281\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/figure>\n<hr class=\"wp-block-separator\" \/>\n<h1 id=\"how-to-update\"><span id=\"How_to_update\" class=\"ez-toc-section\"><\/span>Comment faire la mise \u00e0 jour<\/h1>\n<p>Si vous utilisez <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/#section=windows\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> ou <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a>, vous pouvez choisir la mise \u00e0 jour automatique de Kotlin.<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"Mise \u00e0 jour vers Kotlin 1.6.20\" href=\"#how-to-install\">Mise \u00e0 jour vers Kotlin 1.6.20<\/a><\/p>\n<h1 id=\"major-updates\"><span id=\"Major_updates\" class=\"ez-toc-section\"><\/span>Am\u00e9liorations majeures<\/h1>\n<h2 id=\"prototype-of-context-receivers-for-kotlin-jvm\"><span id=\"Prototype_of_context_receivers_for_KotlinJVM\" class=\"ez-toc-section\"><\/span>Prototype de r\u00e9cepteurs de contexte pour Kotlin\/JVM<\/h2>\n<p>Avec Kotlin 1.6.20, vous n&#8217;\u00eates plus limit\u00e9 \u00e0 un r\u00e9cepteur. Si besoin, vous pouvez rendre les fonctions, propri\u00e9t\u00e9s et classes d\u00e9pendantes du contexte (ou <em>contextuelles<\/em>) en ajoutant des r\u00e9cepteurs de contexte \u00e0 leur d\u00e9claration. Les caract\u00e9ristiques du comportement d&#8217;une d\u00e9claration contextuelle sont les suivantes\u00a0:<\/p>\n<ul>\n<li>Elle requiert que tous les r\u00e9cepteurs de contexte d\u00e9clar\u00e9s soient pr\u00e9sents en tant que r\u00e9cepteurs implicites dans la port\u00e9e de l&#8217;appelant.<\/li>\n<li>Elle int\u00e8gre les r\u00e9cepteurs de contexte d\u00e9clar\u00e9s dans sa port\u00e9e en tant que r\u00e9cepteurs implicites.<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\ninterface LoggingContext {&lt;br \/&gt;\n    val log: Logger \/\/ This context provides a reference to a logger&lt;br \/&gt;\n}&lt;\/p&gt;\n&lt;p&gt;context(LoggingContext)&lt;br \/&gt;\nfun startBusinessOperation() {&lt;br \/&gt;\n    \/\/ You can access the log property since LoggingContext is an implicit receiver&lt;br \/&gt;\n    log.info(\"Operation has started\")&lt;br \/&gt;\n}&lt;\/p&gt;\n&lt;p&gt;fun test(loggingContext: LoggingContext) {&lt;br \/&gt;\n    with(loggingContext) {&lt;br \/&gt;\n        \/\/ You need to have LoggingContext in a scope as an implicit receiver&lt;br \/&gt;\n        \/\/ to call startBusinessOperation()&lt;br \/&gt;\n        startBusinessOperation()&lt;br \/&gt;\n    }&lt;br \/&gt;\n}&lt;br \/&gt;\n<\/pre>\n<p>Pour activer les r\u00e9cepteurs de contexte dans votre projet, utilisez l&#8217;option de compilateur <code>-Xcontext-receivers<\/code>. Vous pouvez trouver une description de la fonctionnalit\u00e9 et sa syntaxe dans le <a href=\"https:\/\/github.com\/Kotlin\/KEEP\/blob\/master\/proposals\/context-receivers.md#detailed-design\" target=\"_blank\" rel=\"noopener\">KEEP<\/a>.<\/p>\n<p>Veuillez noter que l&#8217;impl\u00e9mentation est un <strong>prototype<\/strong> :<\/p>\n<ul>\n<li>Lorsque <code>-Xcontext-receivers<\/code> est activ\u00e9, le compilateur produit des binaires de pr\u00e9version qui ne peuvent pas \u00eatre utilis\u00e9s dans le code de production.<\/li>\n<li>La prise en charge des r\u00e9cepteurs de contexte par l&#8217;IDE est actuellement minimale.<\/li>\n<\/ul>\n<h2 id=\"definitely-non-nullable-types\"><span id=\"Definitely_non-nullable_types\" class=\"ez-toc-section\"><\/span>Types d\u00e9finitivement non-nullables<\/h2>\n<p>Pour assurer une meilleure interop\u00e9rabilit\u00e9 lors de l&#8217;extension de classes et d&#8217;interfaces Java g\u00e9n\u00e9riques, Kotlin 1.6.20 permet de marquer un param\u00e8tre de type g\u00e9n\u00e9rique comme d\u00e9finitivement non-nullable sur le site d&#8217;utilisation avec la nouvelle syntaxe <code>T &amp; ; Any<\/code>. La forme syntaxique provient d&#8217;une notation de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Intersection_type\" target=\"_blank\" rel=\"noopener\">types d&#8217;intersection<\/a>. Elle est maintenant limit\u00e9e \u00e0 un param\u00e8tre de type avec des limites sup\u00e9rieures nullables sur le c\u00f4t\u00e9 gauche de <code>&amp;<\/code> et non-nullables <code>Any<\/code> sur le c\u00f4t\u00e9 droit\u00a0:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nfun &lt;T&gt; elvisLike(x: T, y: T &amp; Any): T &amp; Any = x ?: y&lt;\/p&gt;\n&lt;p&gt;fun main() {&lt;br \/&gt;\n   \/\/ OK&lt;br \/&gt;\n   elvisLike&lt;String&gt;(\"\", \"\").length&lt;br \/&gt;\n   \/\/ Error: 'null' cannot be a value of a non-null type&lt;br \/&gt;\n   elvisLike&lt;String&gt;(\"\", null).length&lt;\/p&gt;\n&lt;p&gt;   \/\/ OK&lt;br \/&gt;\n   elvisLike&lt;String?&gt;(null, \"\").length&lt;br \/&gt;\n   \/\/ Error: 'null' cannot be a value of a non-null type&lt;br \/&gt;\n   elvisLike&lt;String?&gt;(null, null).length&lt;br \/&gt;\n}&lt;br \/&gt;\n<\/pre>\n<p>D\u00e9finissez la version du langage sur 1.7 pour activer la fonctionnalit\u00e9\u00a0:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin {&lt;br \/&gt;\n   sourceSets.all {&lt;br \/&gt;\n       languageSettings.apply {&lt;br \/&gt;\n           languageVersion = \"1.7\"&lt;br \/&gt;\n       }&lt;br \/&gt;\n   }&lt;br \/&gt;\n}&lt;br \/&gt;\n<\/pre>\n<p>Pour en savoir plus sur les types d\u00e9finitivement non-nullables, consultez le <a href=\"https:\/\/github.com\/Kotlin\/KEEP\/blob\/c72601cf35c1e95a541bb4b230edb474a6d1d1a8\/proposals\/definitely-non-nullable-types.md\" target=\"_blank\" rel=\"noopener\">KEEP<\/a>.<\/p>\n<p>Veuillez noter que les types d\u00e9finitivement non-nullables sont encore en <strong>version b\u00eata<\/strong>. Ils sont quasiment stables, mais des \u00e9tapes de migration pourraient \u00eatre n\u00e9cessaires \u00e0 l&#8217;avenir. Nous ferons en sorte que vous ayez le moins de modifications possibles \u00e0 effectuer.<\/p>\n<h2 id=\"support-for-parallel-compilation-of-a-single-module-in-the-JVM-backend\"><span id=\"Support_for_parallel_compilation_of_a_single_module_in_the_JVM_backend\" class=\"ez-toc-section\"><\/span>Prise en charge de la compilation parall\u00e8le d&#8217;un module unique dans le backend de la JVM<\/h2>\n<p>Dans Kotlin 1.6.20, nous avons ajout\u00e9 le mode exp\u00e9rimental du backend IR de la JVM pour compiler tous les fichiers d&#8217;un module en parall\u00e8le. La compilation parall\u00e8le permet de r\u00e9duire la dur\u00e9e totale de compilation jusqu&#8217;\u00e0 15\u00a0%.<\/p>\n<p>Activez le mode backend parall\u00e8le exp\u00e9rimental avec l&#8217;<a href=\"https:\/\/kotlinlang.org\/docs\/compiler-reference.html#compiler-options\" target=\"_blank\" rel=\"noopener\">option de compilateur<\/a> <code>-Xbackend-threads<\/code>. Utilisez les arguments suivants pour cette option :<\/p>\n<ul>\n<li><code>N<\/code> est \u00e9gal au nombre de threads que vous souhaitez utiliser. Il ne doit pas \u00eatre sup\u00e9rieur \u00e0 votre nombre de c\u0153urs de processeur, sinon la parall\u00e9lisation cesse d&#8217;\u00eatre efficace en raison du changement de contexte entre les threads<\/li>\n<li><code>0<\/code> pour utiliser un thread pour chaque c\u0153ur de processeur.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/kotlinlang.org\/docs\/gradle.html\" target=\"_blank\" rel=\"noopener\">Gradle<\/a> peut ex\u00e9cuter des t\u00e2ches en parall\u00e8le, mais ce type de parall\u00e9lisation est peu utile lorsqu&#8217;un projet (ou une partie importante d&#8217;un projet) ne repr\u00e9sente qu&#8217;une seule grande t\u00e2che du point de vue de Gradle. Pour un tr\u00e8s gros module monolithique, il est pr\u00e9f\u00e9rable d&#8217;utiliser la compilation parall\u00e8le pour compiler plus rapidement. Si votre projet est compos\u00e9 de nombreux petits modules et que le build est parall\u00e9lis\u00e9 par Gradle, ajouter une couche de parall\u00e9lisation suppl\u00e9mentaire peut nuire aux performances en raison du changement de contexte.<\/p>\n<p>La compilation parall\u00e8le n&#8217;est pas exempte de contraintes :<\/p>\n<ul>\n<li>Elle ne fonctionne pas avec <a href=\"https:\/\/kotlinlang.org\/docs\/kapt.html\" target=\"_blank\" rel=\"noopener\">kapt<\/a> car kapt d\u00e9sactive le backend IR.<\/li>\n<li>Par conception, elle n\u00e9cessite plus de tas JVM. La quantit\u00e9 de tas est proportionnelle au nombre de threads.<\/li>\n<\/ul>\n<h2 id=\"incremental-compilation-for-development-binaries-with-kotlin-js-ir-compiler\"><span id=\"Incremental_compilation_for_development_binaries_with_KotlinJS_IR_compiler\" class=\"ez-toc-section\"><\/span>Compilation incr\u00e9mentale pour les binaires de d\u00e9veloppement avec le compilateur Kotlin\/JS IR<\/h2>\n<p>Nous introduisons un nouveau mode <em>compilation incr\u00e9mentale<\/em> afin de rendre le d\u00e9veloppement Kotlin\/JS avec le compilateur IR plus efficace.<\/p>\n<p>Lors de la cr\u00e9ation de <strong>binaires de d\u00e9veloppement<\/strong> avec la t\u00e2che Gradle <code>compileDevelopmentExecutableKotlinJs<\/code> dans ce mode, le compilateur met en cache les r\u00e9sultats des compilations pr\u00e9c\u00e9dentes au niveau du module. Il utilise les r\u00e9sultats de compilation mis en cache pour les fichiers source inchang\u00e9s lors des compilations suivantes, ce qui permet de les ex\u00e9cuter plus rapidement, notamment pour les petites modifications. Veuillez noter que cette am\u00e9lioration concerne uniquement le processus de d\u00e9veloppement (raccourcissement du cycle modification-build-d\u00e9bogage) et n&#8217;affecte pas la construction des artefacts de production.<\/p>\n<p>Pour activer la compilation incr\u00e9mentale pour les binaires de d\u00e9veloppement, ajoutez la ligne suivante au fichier <code>gradle.properties<\/code> du projet\u00a0:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin.incremental.js.ir=true \/\/ false by default&lt;br \/&gt;\n<\/pre>\n<p>Dans nos projets tests, ce nouveau mode a permis d&#8217;acc\u00e9l\u00e9rer la compilation incr\u00e9mentale jusqu&#8217;\u00e0 30\u00a0%. En revanche, le build propre devenait plus lent \u00e0 cause de la n\u00e9cessit\u00e9 de cr\u00e9er et de pr\u00e9parer les caches.<\/p>\n<h2 id=\"kotlin-native-performance-improvements\"><span id=\"KotlinNative_performance_improvements\" class=\"ez-toc-section\"><\/span>Am\u00e9liorations des performances de Kotlin\/Native<\/h2>\n<p>Kotlin 1.6.20 am\u00e9liore certaines performances et r\u00e9sout des bugs affectant la LLVM IR que Kotlin g\u00e9n\u00e8re. D&#8217;apr\u00e8s les benchmarks effectu\u00e9s sur nos projets internes, nous avons obtenu en moyenne les am\u00e9liorations de performance suivantes :<\/p>\n<ul>\n<li>R\u00e9duction de 15\u00a0% du temps d&#8217;ex\u00e9cution<\/li>\n<li>R\u00e9duction de 20\u00a0% de la taille du code des binaires de version et de d\u00e9bogage<\/li>\n<li>R\u00e9duction de 26\u00a0% du temps de compilation des binaires de version<\/li>\n<\/ul>\n<p>Le temps de compilation d&#8217;un binaire de d\u00e9bogage sur un grand projet interne a \u00e9galement \u00e9t\u00e9 r\u00e9duit de 10 %.<\/p>\n<p>Pour parvenir \u00e0 ces r\u00e9sultats, nous avons impl\u00e9ment\u00e9 une initialisation statique pour certains des objets synth\u00e9tiques g\u00e9n\u00e9r\u00e9s par le compilateur, am\u00e9lior\u00e9 la mani\u00e8re de structurer les IR LLVM pour chaque fonction, et optimis\u00e9 les caches du compilateur.<\/p>\n<h2 id=\"hierarchical-structure-support-for-multiplatform-projects\"><span id=\"Hierarchical_structure_support_for_multiplatform_projects\" class=\"ez-toc-section\"><\/span>Prise en charge de la structure hi\u00e9rarchique pour les projets multiplateformes<\/h2>\n<p>Kotlin 1.6.20 apporte la prise en charge de la structure hi\u00e9rarchique par d\u00e9faut. Depuis son introduction dans <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew14.html#sharing-code-in-several-targets-with-the-hierarchical-project-structure\" target=\"_blank\" rel=\"noopener\">Kotlin 1.4.0<\/a>, nous avons consid\u00e9rablement am\u00e9lior\u00e9 le frontend et rendu l&#8217;importation de l&#8217;IDE stable.<\/p>\n<p>Auparavant, il y avait deux mani\u00e8res d&#8217;ajouter du code dans un projet multiplateforme. La premi\u00e8re consistait \u00e0 l&#8217;ins\u00e9rer dans un ensemble de sources sp\u00e9cifiques \u00e0 une plateforme, ce qui se limitait \u00e0 une cible et ne pouvait pas \u00eatre r\u00e9utilis\u00e9 par d&#8217;autres plateformes. La seconde est d&#8217;utiliser un ensemble de sources commun partag\u00e9 entre toutes les plateformes actuellement prises en charge par Kotlin.<\/p>\n<p>D\u00e9sormais, vous pouvez <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2022\/02\/kotlin-1-6-20-m1-released\/#better-code-sharing-in-your-project\">partager le code source<\/a> entre plusieurs cibles natives similaires qui r\u00e9utilisent une grande partie de la logique commune et des API tierces. La technologie fournira les d\u00e9pendances correctes par d\u00e9faut et trouvera l&#8217;API exacte disponible dans le code partag\u00e9. Cela permet d&#8217;\u00e9viter une configuration de build complexe et de devoir utiliser des solutions alternatives pour que l&#8217;IDE prenne en charge le partage des ensembles de sources entre les cibles natives. Cela aide \u00e9galement \u00e0 emp\u00eacher les utilisations d&#8217;API non s\u00e9curis\u00e9es destin\u00e9es \u00e0 une cible diff\u00e9rente.<\/p>\n<p>La technologie sera aussi utile aux auteurs de biblioth\u00e8ques, car une structure de projet hi\u00e9rarchique permet de publier et d&#8217;utiliser des biblioth\u00e8ques avec des API communes pour un sous-ensemble de cibles.<br \/>Par d\u00e9faut, les biblioth\u00e8ques publi\u00e9es avec une structure de projet hi\u00e9rarchique sont uniquement compatibles avec des projets de structure hi\u00e9rarchique. Apprenez-en plus sur la <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-hierarchy.html#compatibility\" target=\"_blank\" rel=\"noopener\">compatibilit\u00e9 entre projet et biblioth\u00e8que<\/a>.<\/p>\n<h3 id=\"better-code-sharing-in-your-project\"><span id=\"Better_code-sharing_in_your_project\" class=\"ez-toc-section\"><\/span>Am\u00e9lioration du partage du code dans votre projet<\/h3>\n<p>Sans prise en charge de la structure hi\u00e9rarchique, il n&#8217;y a pas de moyen simple de partager du code entre <em>certaines<\/em> <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-dsl-reference.html#targets\" target=\"_blank\" rel=\"noopener\">cibles Kotlin<\/a> et d&#8217;en <em>exclure<\/em> d&#8217;autres. Un exemple courant est le partage du code entre toutes les cibles iOS et l&#8217;acc\u00e8s \u00e0 des <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-share-on-platforms.html#use-native-libraries-in-the-hierarchical-structure\" target=\"_blank\" rel=\"noopener\">d\u00e9pendances<\/a> sp\u00e9cifiques \u00e0 iOS, comme <code>Foundation<\/code>.<\/p>\n<p>La prise en charge de la structure hi\u00e9rarchique facilite le partage de code. Dans la nouvelle structure, les ensembles de sources forment une hi\u00e9rarchie. Vous pouvez utiliser les fonctionnalit\u00e9s de langage sp\u00e9cifiques \u00e0 la plateforme et les d\u00e9pendances disponibles pour chaque cible pour laquelle un ensemble de sources donn\u00e9 est compil\u00e9.<\/p>\n<p>Prenons par exemple un projet multiplateforme typique avec deux cibles\u00a0: <code>iosArm64<\/code> et <code>iosX64<\/code> pour les appareils et les simulateurs iOS. Les outils Kotlin comprennent que les deux cibles ont la m\u00eame fonction et vous permettent d&#8217;acc\u00e9der \u00e0 cette fonction \u00e0 partir de l&#8217;ensemble de sources interm\u00e9diaires, <code>iosMain<\/code>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/LHS-2rPAgtESE4DYL_hqh6AGQdKUC0BAmS-cGiuoaiHM5Qq4cU1Lwzur0-pjDG8WI_rgu03A-SWj9H4O2T2Y7Cze5guSSod7fEeqVGfS7EL74iTRQjuvyOGP2Uv3pPkNejYPrjJa-1.jpg\" width=\"624\" height=\"279\" \/><\/p>\n<p>La cha\u00eene d&#8217;outils Kotlin fournit les d\u00e9pendances correctes par d\u00e9faut, comme Kotlin\/Native stdlib ou les biblioth\u00e8ques natives. De plus, les outils Kotlin feront le maximum pour trouver exactement la surface d&#8217;API disponible dans le code partag\u00e9. Cela permet d&#8217;\u00e9viter des cas tels que l&#8217;utilisation d&#8217;une fonction sp\u00e9cifique \u00e0 macOS dans du code partag\u00e9 pour Windows par exemple.<\/p>\n<h3 id=\"more-opportunities-for-library-authors\"><span id=\"More_opportunities_for_library_authors\" class=\"ez-toc-section\"><\/span>Plus d&#8217;opportunit\u00e9s pour les auteurs de biblioth\u00e8que<\/h3>\n<p>Lorsqu&#8217;une biblioth\u00e8que multiplateforme est publi\u00e9e, l&#8217;API de ses ensembles de sources interm\u00e9diaires est d\u00e9sormais publi\u00e9e correctement \u00e0 ses c\u00f4t\u00e9s, ce qui la rend disponible pour les utilisateurs. L\u00e0 encore, la cha\u00eene d&#8217;outils Kotlin d\u00e9terminera automatiquement l&#8217;API disponible dans l&#8217;ensemble des sources consommateur, tout en surveillant attentivement les utilisations non s\u00e9curis\u00e9es, comme l&#8217;utilisation d&#8217;une API destin\u00e9e \u00e0 la JVM dans du code JS. En savoir plus sur le <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-share-on-platforms.html#share-code-in-libraries\" target=\"_blank\" rel=\"noopener\">partage de code dans les biblioth\u00e8ques<\/a>.<\/p>\n<h3 id=\"configuration-an-setup\"><span id=\"Configuration_and_setup\" class=\"ez-toc-section\"><\/span>Configuration et installation<\/h3>\n<p>\u00c0 partir de Kotlin 1.6.20, tous vos nouveaux projets multiplateformes auront une structure de projet hi\u00e9rarchique. Aucune autre configuration n&#8217;est n\u00e9cessaire.<\/p>\n<ul>\n<li>Si vous l&#8217;avez d\u00e9j\u00e0 activ\u00e9e <a href=\"https:\/\/kotlinlang.org\/docs\/mpp-share-on-platforms.html#share-code-on-similar-platforms\" target=\"_blank\" rel=\"noopener\">manuellement<\/a>, vous pouvez supprimer les options obsol\u00e8tes \u00e0 partir de <code>gradle.properties<\/code>\u00a0:<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin.mpp.enableGranularSourceSetsMetadata=true&lt;br \/&gt;\nkotlin.native.enableDependencyPropagation=true&lt;br \/&gt;\n<\/pre>\n<ul>\n<li>Avec Kotlin 1.6.20, nous vous recommandons d&#8217;utiliser <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio 2021.1.1<\/a> (Bumblebee) ou une version ult\u00e9rieure pour b\u00e9n\u00e9ficier de la meilleure exp\u00e9rience possible.<\/li>\n<li>Vous pouvez \u00e9galement d\u00e9sactiver cette option. Pour d\u00e9sactiver la prise en charge de la structure hi\u00e9rarchique, d\u00e9finissez les options suivantes dans <code>gradle.properties<\/code>\u00a0:<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin.mpp.hierarchicalStructureSupport=false&lt;br \/&gt;\n<\/pre>\n<h1 id=\"complete-list-of-improvements\"><span id=\"Complete_list_of_improvements\" class=\"ez-toc-section\"><\/span>Liste compl\u00e8te des am\u00e9liorations<\/h1>\n<h2 id=\"language\"><span id=\"Language\" class=\"ez-toc-section\"><\/span>Langage<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#prototype-of-context-receivers-for-kotlin-jvm\" target=\"_blank\" rel=\"noopener\">Prototype de r\u00e9cepteurs de contexte pour Kotlin\/JVM<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#definitely-non-nullable-types\" target=\"_blank\" rel=\"noopener\">Types d\u00e9finitivement non-nullables<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-jvm\"><span id=\"KotlinJVM\" class=\"ez-toc-section\"><\/span>Kotlin\/JVM<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#new-jvmdefaultwithcompatibility-annotation-for-interfaces\" target=\"_blank\" rel=\"noopener\">Nouvelle annotation <code>@JvmDefaultWithCompatibility<\/code> pour les interfaces<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#compatibility-changes-in-the-xjvm-default-modes\" target=\"_blank\" rel=\"noopener\">Modifications de compatibilit\u00e9 dans les modes <code>-Xjvm-default<\/code><\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-parallel-compilation-of-a-single-module-in-the-jvm-backend\" target=\"_blank\" rel=\"noopener\">Prise en charge de la compilation parall\u00e8le d&#8217;un module unique dans le backend de la JVM<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-callable-references-to-function-interface-constructors\" target=\"_blank\" rel=\"noopener\">Prise en charge des r\u00e9f\u00e9rences appelables aux constructeurs d&#8217;interfaces de fonctions<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-native\"><span id=\"KotlinNative\" class=\"ez-toc-section\"><\/span>Kotlin\/Native<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#an-update-on-the-new-memory-manager\" target=\"_blank\" rel=\"noopener\">Mise \u00e0 jour du nouveau gestionnaire de m\u00e9moire<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#concurrent-implementation-for-the-sweep-phase-in-new-memory-manager\" target=\"_blank\" rel=\"noopener\">Impl\u00e9mentation simultan\u00e9e pour la phase de sweep dans le nouveau gestionnaire de m\u00e9moire<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#instantiation-of-annotation-classes\" target=\"_blank\" rel=\"noopener\">Instanciation des classes d&#8217;annotations<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#interop-with-swift-async-await-returning-void-instead-of-kotlinunit\" target=\"_blank\" rel=\"noopener\">Interop\u00e9rabilit\u00e9 avec Swift async\/await\u00a0: retour de <code>Void<\/code> au lieu de <code>KotlinUnit<\/code><\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#better-stack-traces-with-libbacktrace\" target=\"_blank\" rel=\"noopener\">Meilleures traces de pile avec <code>libbacktrace<\/code><\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-standalone-android-executables\" target=\"_blank\" rel=\"noopener\">Prise en charge des ex\u00e9cutables Android autonomes<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#performance-improvements\" target=\"_blank\" rel=\"noopener\">Am\u00e9liorations des performances<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#improved-error-handling-during-cinterop-modules-import\" target=\"_blank\" rel=\"noopener\">Am\u00e9lioration du traitement des erreurs lors de l&#8217;importation de modules cinterop<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-xcode-13-libraries\" target=\"_blank\" rel=\"noopener\">Prise en charge des biblioth\u00e8ques Xcode 13<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-multiplatform\"><span id=\"Kotlin_Multiplatform\" class=\"ez-toc-section\"><\/span>Kotlin Multiplatform<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#hierarchical-structure-support-for-multiplatform-projects\" target=\"_blank\" rel=\"noopener\">Prise en charge de la structure hi\u00e9rarchique pour les projets multiplateformes<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#kotlin-cocoapods-gradle-plugin\" target=\"_blank\" rel=\"noopener\">Mises \u00e0 jour du plugin Kotlin CocoaPods Gradle<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-js\"><span id=\"KotlinJS\" class=\"ez-toc-section\"><\/span>Kotlin\/JS<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#incremental-compilation-for-development-binaries-with-ir-compiler\" target=\"_blank\" rel=\"noopener\">Compilation incr\u00e9mentale pour les binaires de d\u00e9veloppement avec le compilateur IR<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#lazy-initialization-of-top-level-properties-by-default-with-ir-compiler\" target=\"_blank\" rel=\"noopener\">Initialisation lazy des propri\u00e9t\u00e9s de haut niveau par d\u00e9faut avec le compilateur IR<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#separate-js-files-for-project-modules-by-default-with-ir-compiler\" target=\"_blank\" rel=\"noopener\">Fichiers JS s\u00e9par\u00e9s pour les modules du projet par d\u00e9faut avec le compilateur IR<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#char-class-optimization\" target=\"_blank\" rel=\"noopener\">Optimisation de la classe <code>Char<\/code><\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#improvements-to-export-and-typescript-declaration-generation\" target=\"_blank\" rel=\"noopener\">Am\u00e9liorations pour l&#8217;exportation et la g\u00e9n\u00e9ration de d\u00e9clarations TypeScript<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#aftertest-guarantees-for-asynchronous-tests\" target=\"_blank\" rel=\"noopener\">Garanties <code>@AfterTest<\/code> pour les tests asynchrones<\/a><\/li>\n<\/ul>\n<h2 id=\"security\"><span id=\"Security\" class=\"ez-toc-section\"><\/span>S\u00e9curit\u00e9<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#using-relative-paths-in-klibs\" target=\"_blank\" rel=\"noopener\">Utilisation des chemins d&#8217;acc\u00e8s relatifs dans klibs<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#persisting-yarn-lock-for-kotlin-js-gradle-projects\" target=\"_blank\" rel=\"noopener\">Persistance de <code>yarn.lock<\/code> pour les projets Kotlin\/JS Gradle<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#installation-of-npm-dependencies-with-ignore-scripts-by-default\" target=\"_blank\" rel=\"noopener\">Installation des d\u00e9pendances npm avec <code>--ignore-scripts<\/code> par d\u00e9faut<\/a><\/li>\n<\/ul>\n<h2 id=\"gradle\"><span id=\"Gradle%EF%BB%BF\" class=\"ez-toc-section\"><\/span>Gradle<\/h2>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#properties-for-defining-kotlin-compiler-execution-strategy\" target=\"_blank\" rel=\"noopener\">Propri\u00e9t\u00e9s permettant de d\u00e9finir la strat\u00e9gie d&#8217;ex\u00e9cution du compilateur Kotlin<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#deprecation-of-build-options-for-kapt-and-coroutines\" target=\"_blank\" rel=\"noopener\">D\u00e9pr\u00e9ciation des options de build pour kapt et les coroutines<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#removal-of-the-kotlin-parallel-tasks-in-project-build-option\" target=\"_blank\" rel=\"noopener\">Suppression de l&#8217;option de build <code>kotlin.parallel.tasks.in.project<\/code><\/a><\/li>\n<\/ul>\n<h1 id=\"how-to-install\"><span id=\"How_to_install_Kotlin_1620\" class=\"ez-toc-section\"><\/span>Comment installer Kotlin 1.6.20<\/h1>\n<p>Si vous utilisez d\u00e9j\u00e0 <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/#section=windows\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> ou <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a>, votre IDE vous proposera de faire la mise \u00e0 jour vers Kotlin 1.6.20 automatiquement. Vous pouvez \u00e9galement faire la mise \u00e0 jour manuellement en suivant <a href=\"https:\/\/kotlinlang.org\/docs\/releases.html#update-to-a-new-release\" target=\"_blank\" rel=\"noopener\">ces instructions<\/a>.<\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger les derni\u00e8res versions des IDE suivants pour b\u00e9n\u00e9ficier d&#8217;une prise en charge \u00e9tendue pour Kotlin :<\/p>\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/#section=windows\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a>\u00a0: pour d\u00e9velopper des applications Kotlin pour diff\u00e9rentes plateformes.<\/li>\n<li><a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a>\u00a0: pour le d\u00e9veloppement d&#8217;applications mobiles Android et multiplateformes.<\/li>\n<\/ul>\n<p>Assurez-vous aussi de mettre \u00e0 jour les biblioth\u00e8ques kotlinx vers des <a href=\"https:\/\/kotlinlang.org\/releases.html#release-details\" target=\"_blank\" rel=\"noopener\">versions compatibles<\/a> et de sp\u00e9cifier la version 1.6.20 de Kotlin dans les scripts de build de vos projets existants.<\/p>\n<p>Si vous avez besoin du compilateur en ligne de commande, t\u00e9l\u00e9chargez-le depuis la <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.6.20\" target=\"_blank\" rel=\"noopener\">page Github de la version<\/a>.<\/p>\n<h3 id=\"if-you-run-into-any-problems\"><span id=\"If_you_run_into_any_problems\" class=\"ez-toc-section\"><\/span>En cas de probl\u00e8me<\/h3>\n<ul>\n<li>Trouvez de l&#8217;aide sur <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (<a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">recevoir une invitation<\/a>).<\/li>\n<li>Signalez les probl\u00e8mes dans notre outil de suivi <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/li>\n<\/ul>\n<div style=\"background-color: #f1f6fe; margin-bottom: 2px; padding: 5px; margin-right: 0%; text-align: left; min-height: px;\">\n<p>Restez au courant des derni\u00e8res fonctionnalit\u00e9s de Kotlin ! Inscrivez-vous en remplissant le formulaire \u00e0 droite de cet article pour recevoir les actualit\u00e9s relatives \u00e0 Kotlin.<\/p>\n<\/div>\n<h1 id=\"what-else-to-read-and-watch\"><span id=\"What_else_to_read_and_watch\" class=\"ez-toc-section\"><\/span>Autres lectures et vid\u00e9os<\/h1>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/roadmap.html\" target=\"_blank\" rel=\"noopener\">Feuille de route de Kotlin<\/a><\/li>\n<li><a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html\" target=\"_blank\" rel=\"noopener\">Nouveaut\u00e9s de Kotlin 1.6.20 dans la documentation<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-16.html\" target=\"_blank\" rel=\"noopener\">Guide de compatibilit\u00e9 pour Kotlin 1.6<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/\">Kotlin 1.6.0 est disponible\u00a0!<\/a><\/li>\n<\/ul>\n\n\n<p><em>Auteur de l&#8217;article original en anglais <\/em>:<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":237308,"comment_status":"closed","ping_status":"closed","template":"","categories":[907],"tags":[671],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/246168"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=246168"}],"version-history":[{"count":9,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/246168\/revisions"}],"predecessor-version":[{"id":632545,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/246168\/revisions\/632545"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/237308"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=246168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=246168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=246168"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=246168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}