{"id":34212,"date":"2020-01-06T15:08:37","date_gmt":"2020-01-06T14:08:37","guid":{"rendered":"https:\/\/blog.jetbrains.com\/fr\/?p=461"},"modified":"2020-01-06T15:19:35","modified_gmt":"2020-01-06T14:19:35","slug":"ce-qui-vous-attend-dans-kotlin-1-4-et-ses-versions-ulterieures","status":"publish","type":"post","link":"https:\/\/blog.jetbrains.com\/fr\/2020\/01\/06\/ce-qui-vous-attend-dans-kotlin-1-4-et-ses-versions-ulterieures\/","title":{"rendered":"Ce qui vous attend dans Kotlin 1.4 et ses versions ult\u00e9rieures"},"content":{"rendered":"Lors de sa keynote \u00e0 la KotlinConf, Andrey Breslav a pr\u00e9sent\u00e9 notre vision strat\u00e9gique concernant les principaux axes pour l'\u00e9volution de Kotlin, et nos projets pour Kotlin 1.4, qui sera publi\u00e9e courant 2020.\r\n\r\nRegardez toute la keynote ci-dessous :\r\n\r\n\r\n\r\nNotre ambition est de faire de Kotlin un partenaire fiable pour tous vos projets et qu'il devienne votre langage de pr\u00e9dilection. Pour ce faire, nous allons le faire briller sur toutes les plateformes. Plusieurs \u00e9tudes de cas d'entreprises reconnues montrent que nous progressons efficacement dans cette direction.\r\n\r\nKotlin 1.4, pr\u00e9vue pour le printemps 2020, permettra \u00e0 l'\u00e9cosyst\u00e8me Kotlin de faire un nouveau pas en avant.\r\nL'accent sur la qualit\u00e9\r\nAvec Kotlin 1.4 nous entendons privil\u00e9gier avant tout la qualit\u00e9 et les performances. Kotlin est un langage moderne qui est d\u00e9j\u00e0 pionnier sur de nombreuses id\u00e9es et approches. Il va rester moderne et en constante \u00e9volution. Cependant, nous pensons qu'actuellement Kotlin a atteint un stade o\u00f9 l'am\u00e9lioration de l'exp\u00e9rience globale doit primer sur l'ajout de fonctionnalit\u00e9s. C'est pourquoi Kotlin 1.4 n'apportera que quelques petits changements au langage. Ils sont expliqu\u00e9s en d\u00e9tail ci-dessous.\r\n\r\nNous avons d\u00e9j\u00e0 r\u00e9ussi \u00e0 obtenir des r\u00e9sultats impressionnants en am\u00e9liorant les performances des EDI prenant en charge Kotlin. La saisie automatique du code s'est consid\u00e9rablement acc\u00e9l\u00e9r\u00e9e par rapport aux versions pr\u00e9c\u00e9dentes :\r\n\r\nEn collaboration avec l'\u00e9quipe Gradle, nous avons acc\u00e9l\u00e9r\u00e9 les scripts Gradle. L'importation Gradle en Kotlin 1.3.60 dans Android Studio est environ 2,5 fois plus rapide et demande environ 75% moins de m\u00e9moire qu'avec Kotlin 1.3.10 :\r\n\r\n\r\n\r\nDe plus, le chargement de build.gradle.kts ne sollicite pratiquement pas le processeur ! De plus, la compilation de Kotlin\/Native en mode dev devient jusqu'\u00e0 2 fois plus rapide gr\u00e2ce \u00e0 la mise en cache du code.\r\n\r\nNous comprenons que la vitesse de build est souvent la plus grande pr\u00e9occupation de nos utilisateurs, et nous am\u00e9liorons constamment notre cha\u00eene d'outils pour y r\u00e9pondre. Mais des am\u00e9liorations incr\u00e9mentielles ne parviennent pas \u00e0 suivre le rythme de la croissance naturelle des bases de code de production : tandis que nous acc\u00e9l\u00e9rons la compilation, les utilisateurs \u00e9crivent davantage de code, et le temps de build global ne s'am\u00e9liore pas assez. Il est devenu \u00e9vident qu'il faudrait r\u00e9impl\u00e9menter le compilateur pour le rendre tr\u00e8s rapide.\r\nNouveau compilateur\r\nLa nouvelle impl\u00e9mentation du compilateur doit r\u00e9pondre \u00e0 trois objectifs : \u00eatre tr\u00e8s rapide, unifier toutes les plateformes prises en charge par Kotlin et fournir une API pour les extensions du compilateur. Il s'agit d'un travail de plusieurs ann\u00e9es, mais nous avons commenc\u00e9 il y a un certain temps, donc certaines parties de cette nouvelle impl\u00e9mentation arriveront d\u00e8s la version 1.4, et la transition sera tr\u00e8s progressive. C'est d\u00e9j\u00e0 en cours : par exemple, si vous avez essay\u00e9 le nouvel algorithme pour l'inf\u00e9rence de type, il fait partie du nouveau compilateur. L'approche sera la m\u00eame pour les autres parties ; c'est-\u00e0-dire que les deux versions seront disponibles pendant un certain temps, l'ancienne, et la nouvelle en mode exp\u00e9rimental. Lorsque la nouvelle version sera stable, elle deviendra la version par d\u00e9faut.\r\nAcc\u00e9l\u00e9ration gr\u00e2ce au nouveau front-end\r\nL'acc\u00e9l\u00e9ration que nous attendons du nouveau compilateur proviendra principalement d'une nouvelle impl\u00e9mentation front-end.\r\n\r\nPour fournir un peu de contexte, la compilation peut \u00eatre consid\u00e9r\u00e9e comme un pipeline qui r\u00e9cup\u00e8re des fichiers source et les transforme progressivement en code ex\u00e9cutable. La premi\u00e8re grande \u00e9tape de ce pipeline est famili\u00e8rement appel\u00e9e le front-end du compilateur. C'est la partie qui analyse le code, r\u00e9sout les noms, v\u00e9rifie les types, etc. Cette partie du compilateur fonctionne \u00e9galement \u00e0 l'int\u00e9rieur de l'EDI pour mettre en \u00e9vidence les erreurs, naviguer vers les d\u00e9finitions et rechercher les utilisations des symboles dans votre projet. Et c'est l'\u00e9tape qui demande le plus de temps \u00e0 kotlinc actuellement. Nous voulons donc la rendre beaucoup plus rapide.\r\n\r\nL'impl\u00e9mentation actuelle n'est pas encore termin\u00e9e et elle n'arrivera pas dans la version 1.4. Toutefois, elle effectue d\u00e9j\u00e0 la majeure partie du travail le plus fastidieux, et nous pouvons mesurer l'acc\u00e9l\u00e9ration attendue. Nos benchmarks (la compilation de YouTrack et du compilateur Kotlin lui-m\u00eame) montrent que le nouveau front-end sera environ 4,5 fois plus rapide qu'aujourd'hui.\r\nExtensibilit\u00e9 et back-ends unifi\u00e9s\r\nUne fois que le front-end a termin\u00e9 l'analyse du code, un back-end g\u00e9n\u00e8re les ex\u00e9cutables. Nous avons trois back-ends : Kotlin\/JVM, Kotlin\/JS et Kotlin\/Native. Historiquement, les deux premiers \u00e9taient \u00e9crits ind\u00e9pendamment et ne partageaient pas beaucoup de code. Lorsque nous avons initi\u00e9 Kotlin\/Native, il reposait sur une nouvelle infrastructure construite autour d'une repr\u00e9sentation interne (IR) pour le code Kotlin, qui fonctionne de fa\u00e7on quelque peu similaire au bytecode dans les machines virtuelles. Nous migrons maintenant les deux autres back-ends vers le m\u00eame IR. Par cons\u00e9quent, nous partagerons une grande partie de la logique des back-ends et disposerons d'un pipeline unifi\u00e9, qui permettra de mettre en commun la plupart des fonctionnalit\u00e9s, optimisations et corrections de bugs pour toutes les cibles.\r\n\r\nNous migrerons progressivement vers les nouveaux back-ends, et dans la version 1.4, il est peu probable qu'ils soient activ\u00e9s par d\u00e9faut, mais les utilisateurs pourront choisir de les utiliser explicitement.\r\n\r\nUne infrastructure de back-end commune permet d'envisager des extensions de compilateur multiplateformes. On peut se connecter au pipeline pour ajouter des traitements et\/ou des transformations personnalis\u00e9s qui fonctionneront automatiquement pour toutes les cibles. Dans la version 1.4, nous ne fournissons pas d'API publique pour de telles extensions (l'API sera stabilis\u00e9e plus tard), mais nous travaillons en \u00e9troite collaboration avec nos partenaires, notamment JetPack Compose, qui travaillent d\u00e9j\u00e0 sur leurs plugins de compilation.\r\nD\u00e9couvrez KLib : Kotlin Library Format\r\nPour construire une biblioth\u00e8que multiplateforme en Kotlin qui soit v\u00e9ritablement fiable pour les clients, il faut un format de distribution qui fonctionne \u00e9galement sur n'importe quelle plateforme. Nous vous pr\u00e9sentons donc KLib : un format de biblioth\u00e8que multiplateforme pour Kotlin. Un fichier KLib contient un IR s\u00e9rialis\u00e9. Votre code peut l'ajouter en tant que d\u00e9pendance et le back-end du compilateur le r\u00e9cup\u00e9rera et g\u00e9n\u00e9rera du code ex\u00e9cutable pour la plateforme donn\u00e9e. L'analogie avec le bytecode reste \u00e9galement valable ici : on peut analyser et transformer les KLibs tout comme le bytecode JVM. Toute transformation apport\u00e9e \u00e0 l'IR s\u00e9rialis\u00e9 affecteront toutes les plateformes pour lesquelles le KLib sera utilis\u00e9.\r\n\r\nEn fait, Kotlin\/Native utilise le format des KLibs pour distribuer les biblioth\u00e8ques natives Kotlin depuis un certain temps, et nous en \u00e9tendons maintenant le format pour prendre en charge d'autres back-ends et biblioth\u00e8ques multiplateformes. Le format sera exp\u00e9rimental dans la version 1.4 et nous pr\u00e9voyons de fournir un ABI stable dans les futures versions.\r\nPlus d'actualit\u00e9s multiplateformes\r\nEx\u00e9cution de code iOS dans Android Studio\r\nNous travaillons sur un plugin pour Android Studio qui pourra ex\u00e9cuter, tester et d\u00e9boguer le code Kotlin sur les appareils iOS et les simulateurs. Le plugin utilise du code propri\u00e9taire d'IntelliJ, il sera donc \u00e0 source ferm\u00e9e. Il n'apportera pas de prise en charge linguistique pour Objective-C ou Swift, et certaines op\u00e9rations telles que le d\u00e9ploiement sur AppStore pourront n\u00e9cessiter l'ex\u00e9cution de Xcode, mais tout ce que vous ferez avec le code Kotlin fonctionnera \u00e0 partir d'Android Studio avec le nouveau plugin install\u00e9. Nous pr\u00e9voyons de proposer un aper\u00e7u de ce plugin en 2020.\r\nAm\u00e9liorations de l'ex\u00e9cution de Kotlin\/Native\r\nEn plus de Linux, Windows, macOS et iOS, Kotlin\/Native fonctionne maintenant sur watchOS et tvOS. Pratiquement tous les appareils peuvent donc ex\u00e9cuter Kotlin. Nous travaillons \u00e9galement sur les performances d'ex\u00e9cution de Kotlin\/Native pour acc\u00e9l\u00e9rer encore les programmes iOS Kotlin.\r\nBiblioth\u00e8ques principales\r\nLes biblioth\u00e8ques principales de Kotlin fonctionnent sur toutes les plateformes. Cela inclut kotlin-stdlib qui g\u00e8re tous les types et collections de base, kotlinx.coroutines, kotlinx.serialization et kotlinx.io. La prise en charge des dates est vraiment n\u00e9cessaire dans le monde multiplateforme et c'est sur cela que nous travaillons : des dur\u00e9es exp\u00e9rimentales ont d\u00e9j\u00e0 \u00e9t\u00e9 ajout\u00e9es \u00e0 stdlib et la prise en charge de DateTime est en cours.\r\n\r\nAutre ajout important aux biblioth\u00e8ques Kotlin : Flow, une impl\u00e9mentation de Reactive Streams bas\u00e9e sur les coroutines. Flow est excellent pour le traitement des flux de donn\u00e9es et il utilise la puissance de Kotlin pour cela. Outre son ergonomie, Flow apporte plus de vitesse. Sur certains benchmarks, il est presque 2 fois plus rapide que les impl\u00e9mentations de Reactive Streams populaires.\r\nPour les auteurs de biblioth\u00e8ques\r\nComme la cr\u00e9ation de nouvelles biblioth\u00e8ques est vitale pour l'\u00e9cosyst\u00e8me Kotlin, nous continuons d'am\u00e9liorer l'exp\u00e9rience des auteurs de biblioth\u00e8ques. Le nouveau mode de cr\u00e9ation des biblioth\u00e8ques vous aidera \u00e0 fa\u00e7onner votre code de fa\u00e7on optimale pour obtenir des API stables. De plus, nous allons publier Dokka 1.0 pour prendre en charge la g\u00e9n\u00e9ration de documents pour toutes les plateformes.\r\nWeb multiplateforme\r\nLe partage de code entre les plateformes est id\u00e9al pour les mobiles, mais \u00e9galement pour les clients Web : beaucoup peuvent \u00eatre partag\u00e9s avec le serveur ou avec des applications mobiles. Nous investissons de plus en plus dans les outils Kotlin\/JS, et pouvons d\u00e9sormais effectuer des allers-retours de d\u00e9veloppement tr\u00e8s rapides, entre le changement de code Kotlin et la visualisation des r\u00e9sultats dans le navigateur :\r\n\r\n\r\n\r\nNous avons \u00e9galement am\u00e9lior\u00e9 JS interop afin que vous puissiez d\u00e9sormais associer une d\u00e9pendance NPM \u00e0 un projet Kotlin et que toutes les d\u00e9finitions de type .d.ts soient r\u00e9cup\u00e9r\u00e9es automatiquement par la cha\u00eene d'outils Kotlin.\r\n\r\nLe nouveau back-end IR apportera \u00e9galement des am\u00e9liorations consid\u00e9rables \u00e0 la taille des binaires. Les fichiers JS compil\u00e9s peuvent \u00eatre r\u00e9duits \u00e0 la moiti\u00e9 de leur taille actuelle.\r\nNouvelles fonctionnalit\u00e9s de langage\r\nKotlin 1.4 apportera quelques nouvelles fonctionnalit\u00e9s linguistiques.\r\nConversions SAM pour les classes Kotlin\r\nLa communaut\u00e9 nous a demand\u00e9 de prendre en charge les conversions SAM pour les classes Kotlin (KT-7770). La conversion SAM s'applique si vous passez une lambda comme argument lorsqu'une interface ou une classe ne comportant qu'une seule m\u00e9thode abstraite est attendue comme param\u00e8tre. Le compilateur convertit alors automatiquement la lambda en une instance de la classe impl\u00e9mentant la fonction membre abstraite.\r\n\r\nLes conversions SAM ne fonctionnent actuellement que pour les interfaces Java et les classes abstraites. L'id\u00e9e initiale derri\u00e8re cette conception \u00e9tait d'utiliser explicitement les types de fonction pour de tels cas d'utilisation. Il s'est cependant av\u00e9r\u00e9 que les types de fonction et les alias de types ne couvraient pas tous les cas d'utilisation et qu'il fallait donc souvent garder une interface en Java uniquement pour obtenir une conversion SAM.\r\n\r\nContrairement \u00e0 Java, Kotlin ne permettra pas une conversion SAM pour chaque interface avec une seule m\u00e9thode abstraite. Nous pensons qu'une intention de rendre une interface applicable \u00e0 la conversion SAM devrait \u00eatre explicite. Ainsi, pour d\u00e9finir une interface SAM, vous devrez marquer une interface avec le mot-cl\u00e9 fun, pour souligner qu'elle peut \u00eatre utilis\u00e9e en tant qu'interface fonctionnelle :\r\nfun interface Action {\r\n    fun run()\r\n}\r\n\r\nfun runAction(a: Action) = a.run()\r\n\r\nfun main() {\r\n    runAction {\r\n        println(\"Hello, KotlinConf!\")\r\n    }\r\n}\r\n\r\nNotez que le passage d'une lambda au lieu d'une interface fun ne sera pris en charge que dans un nouvel algorithme d'inf\u00e9rence de type.\r\nM\u00e9lange d'arguments nomm\u00e9s et positionnels\r\nKotlin interdit de m\u00e9langer des arguments comportant des noms explicites (\"nomm\u00e9s\") et des arguments normaux sans noms (\"positionnels\"), \u00e0 moins que vous ne placiez tous les arguments nomm\u00e9s apr\u00e8s tous les arguments positionnels. Il existe toutefois un cas dans lequel c'est vraiment probl\u00e9matique : lorsque tous les arguments restent dans leur position correcte et que vous souhaitez sp\u00e9cifier un nom pour un argument qui se trouve au milieu. Kotlin 1.4 r\u00e9soudra ce probl\u00e8me, vous pourrez donc \u00e9crire du code comme :\r\nfun f(a: Int, b: Int, c: Int) {}\r\n\r\nfun main() {\r\n    f(1, b = 2, 3)\r\n}\r\n\r\nOptimisation des propri\u00e9t\u00e9s d\u00e9l\u00e9gu\u00e9es\r\nNous allons am\u00e9liorer la compilation sous-jacente de la propri\u00e9t\u00e9 lazy et de quelques autres propri\u00e9t\u00e9s d\u00e9l\u00e9gu\u00e9es.\r\n\r\nEn r\u00e8gle g\u00e9n\u00e9rale, une propri\u00e9t\u00e9 d\u00e9l\u00e9gu\u00e9e peut acc\u00e9der \u00e0 l'objet de r\u00e9flexion KProperty correspondant. Par exemple, lorsque vous utilisez Delegates.observable, vous pouvez afficher des informations sur la propri\u00e9t\u00e9 modifi\u00e9e :\r\nimport kotlin.properties.Delegates\r\n\r\nclass MaClasse {\r\n    var maProp: String by Delegates.observable(\"&lt;no name&gt;\") {\r\n        kProperty, ancienneValeur, nouvelleValeur -&gt;\r\n        println(\"${kProperty.name}: $ancienneValeur -&gt; $nouvelleValeur\")\r\n    }\r\n}\r\n\r\nfun main() {\r\n    val utilisateur = MaClass()\r\n    user.myProp = \"first\"\r\n    user.myProp = \"second\"\r\n}\r\n\r\nPour rendre cela possible, le compilateur Kotlin g\u00e9n\u00e8re une propri\u00e9t\u00e9 de membre syntaxique suppl\u00e9mentaire, un tableau stockant tous les objets KProperty qui repr\u00e9sente les propri\u00e9t\u00e9s d\u00e9l\u00e9gu\u00e9es utilis\u00e9es dans la classe :\r\n&gt;&gt;&gt; javap MaClass\r\n\r\npublic final class MaClass {\r\n    static final kotlin.reflect.KProperty[] $$delegatedProperties;\r\n    ...\r\n}\r\n\r\nCependant, certaines propri\u00e9t\u00e9s d\u00e9l\u00e9gu\u00e9es n'utilisent pas du tout KProperty. Pour celles-ci, la g\u00e9n\u00e9ration d'un objet dans $$delegatedProperties n'est pas optimale. La version Kotlin 1.4 optimisera ces cas. Si les op\u00e9rateurs de propri\u00e9t\u00e9 d\u00e9l\u00e9gu\u00e9s sont inlige et que le param\u00e8tre KProperty n'est pas utilis\u00e9, les objets de r\u00e9flexion correspondants ne seront pas g\u00e9n\u00e9r\u00e9s.\r\n\r\nL'exemple le plus remarquable est la propri\u00e9t\u00e9 lazy. L'impl\u00e9mentation de getValue pour la propri\u00e9t\u00e9 lazy est inline et n'utilise pas le param\u00e8tre KProperty :\r\ninline operator fun &lt;T&gt; Lazy&lt;T&gt;.getValue(thisRef: Any?, property: KProperty&lt;*&gt;): T = value\r\n\r\n\u00c0 partir de Kotlin 1.4, lorsque vous d\u00e9finirez une propri\u00e9t\u00e9 lazy, l'instance KProperty correspondante ne sera plus g\u00e9n\u00e9r\u00e9e. Si les seules propri\u00e9t\u00e9s d\u00e9l\u00e9gu\u00e9es que vous utilisez dans une classe sont des propri\u00e9t\u00e9s lazy (et d'autres propri\u00e9t\u00e9s conformes \u00e0 cette optimisation), aucun tableau $$delegatedProperties ne sera g\u00e9n\u00e9r\u00e9 pour la classe :\r\nclass MonAutreClasse {\r\n    val lazyProp by lazy { 42 }\r\n}\r\n\r\n&gt;&gt;&gt; javap MonAutreClasse\r\npublic final class MonAutreClasse {\r\n    \/\/ la suite n'est plus g\u00e9n\u00e9r\u00e9e :\r\n    static final kotlin.reflect.KProperty[] $$delegatedProperties; \r\n    ...\r\n}\r\n\r\nVirgules de fin\r\nCette modification syntaxique mineure s'av\u00e8re incroyablement pratique ! Vous pouvez placer une virgule de fin suppl\u00e9mentaire apr\u00e8s le dernier param\u00e8tre d'une liste de param\u00e8tres. Vous pouvez ensuite \u00e9changer des lignes ou ajouter de nouveaux param\u00e8tres sans avoir \u00e0 ajouter ou supprimer de virgules.\r\nAutres changements notables\r\nUne fonction typeof utile introduite  dans Kotlin 1.3.40  va devenir stable et prise en charge sur toutes les plateformes.\r\n\r\nLa fonctionnalit\u00e9 qui vous permet d'activer break et continue \u00e0 l'int\u00e9rieur de when \u00e9tait d\u00e9j\u00e0 d\u00e9crite dans l'article de blog de la version 1.3.60 .\r\nMerci\u00a0!\r\nNous remercions tous ceux qui ont essay\u00e9 les versions EAP de Kotlin et les fonctionnalit\u00e9s exp\u00e9rimentales et nous faire part de leurs retours d\u2019exp\u00e9rience. Nous d\u00e9veloppons le langage Kotlin avec vous et beaucoup de nos d\u00e9cisions de conception reposent sur vos pr\u00e9cieuses contributions. Pr\u00e9server la rapidit\u00e9 et l'efficacit\u00e9 de cette boucle de r\u00e9troaction avec la communaut\u00e9 est vraiment important pour d\u00e9velopper et am\u00e9liorer Kotlin !\r\n\r\nNous sommes vraiment reconnaissants \u00e0 tous les membres de notre communaut\u00e9 qui cr\u00e9ent tant de choses incroyables avec Kotlin. Continuons \u00e0 Kotliner ensemble !\r\n\r\nAu fait, le plugin Kotlin dans IntelliJ IDEA et Android Studio recueille des statistiques anonymis\u00e9es sur votre utilisation de ses fonctionnalit\u00e9s. Nous vous prions de bien vouloir activer ces statistiques, car elles nous aident \u00e0 comprendre ce qui fonctionne, ce qui pose probl\u00e8me et sur quelles am\u00e9liorations nous devons nous concentrer.\r\n\r\nAuteur de l'article original en anglais :\u00a0Svetlana Isakova","protected":false},"excerpt":{"rendered":"Lors de sa keynote \u00e0 la KotlinConf, Andrey Breslav a pr\u00e9sent\u00e9 notre vision strat\u00e9gique concernant les principaux axes pour l'\u00e9volution de Kotlin, et nos projets pour Kotlin 1.4, qui sera publi\u00e9e coura","protected":false},"author":{"name":"Delphine Massenhove","link":"https:\/\/blog.jetbrains.com\/fr\/author\/delphine-massenhovejetbrains-com"},"featured_media":34213,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[89],"tags":[5319],"cross-post-tag":[],"acf":[],"featured_image":"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/01\/fr-Keynote-Andrey-Breslav-KotlinConf-2019.jpg","_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/posts\/34212"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"},{"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=34212"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/posts\/34212\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/34213"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=34212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=34212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=34212"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=34212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}