Kotlin le langage qui monte…

La veille technologique étant un élément fondamental chez Sopra Steria, nous allons vous présenter les bases d’un langage relativement récent qui fait de plus en plus parler de lui, et qui a déjà conquis un certains nombre de territoires.

Vous allez nous dire “encore” un autre langage! Effectivement,  l’avènement de JavaScript et de Java était déjà tout un sujet. Sont apparues ensuite les dérivées majeures de ces langages telles que Typescript pour le premier, ou Groovy, Scala et Clojure pour le second. Alors que peut apporter ce nouveau langage? C’est à cette question que nous allons répondre dans cet article.

 

Kotlin, d’où ça sort?

Kotlin est un langage à l’initiative de l’éditeur européen JetBrains fondé en 2000 en République tchèque. Ce dernier est très connu pour ses produits de développement tels qu’IntelliJ IDEA, Resharper, Teamcity ou Upsource. Ils ont été primés de nombreuses fois par des panels d’utilisateurs.
Jetbrains a investit, il y a déjà plusieurs années, dans la R&D autour des langages de programmation.

Cela a commencé en 2007 par la plateforme MPS (Meta Programming System) qui permet de modéliser et d’instrumenter des DSL (Domain Specific Language). En 2011, ils présentent les premiers jets d’un langage de programmation développé en interne, Kotlin. Cette première mouture du langage se veut un nouveau langage pour la JVM. Il s’exécute donc, après compilation, dans un environnement Java.
La première version estampillée 1.0 voit le jour début 2016. Elle est issue de l’ouverture des sources du langage sous licence Apache 2, et d’une phase de construction d’une communauté grandissante d’utilisateurs qui participent aux évolutions du langage.

Un an après, Google, qui est déjà partenaire de Jetbrains par l’intermédiaire d’Android Studio (une version d’IntelliJ Idea dédiée à Android), annonce lors du Google I/O que Kotlin est maintenant supporté officiellement comme un des langages de la plateforme Android. Cette annonce est accueillit sous un tonnerre d’applaudissement dans la salle. Et d’autres rumeurs parcourent déjà les couloirs!

Qu’est-ce qui peut faire qu’un langage engendre un tel engouement?

Un langage multi-plateforme et multi-cible

Si Jetbrains a construit Kotlin sur la base d’un langage compatible avec Java et s’exécutant sur cette plateforme, les ambitions de Jetbrains ne s’arrêtent pas là.
Kotlin a déjà plusieurs compilateurs qui adressent d’autres plateformes que Java.

Au jour d’aujourd’hui, Kotlin est compilable ou transpilable pour les environnements suivant:

EnvironnementVersion minimumMécanique Gestion MémoireMaturitéCompilation
Java6.0managée (JVM)productionbyte code java
Android4.xmanagée (JVM)productionbyte code java
JavaScript BrowserEcma 5managée (JSVM)quasi-productiontranspilation JS 5
JavaScript ServerNode.js 4managée (JSVM)quasi-productiontranspilation JS 5
Windows natif7managée (émulation)
+ allocation non managée
previewbinaire
MacOS natif10.11managée (émulation)
+ allocation non managée
previewbinaire
iOS natifnécessite une compilation sous MacOS avec cible iphonemanagée (émulation)
+ allocation non managée
previewbinaire
Linux x86-64 natifUbuntu 14 et équivalentmanagée (émulation)
+ allocation non managée
previewbinaire
Linux RaspberryPinécessite une compilation sous Linux x86-64 avec cible raspberrypimanagée (émulation)
+ allocation non managée
previewbinaire

Compilation native

Comme vous pouvez le constater, Kotlin peut être compilé en binaire sur différentes plateformes. Cette fonctionnalité repose sur le projet LLVM , qui apporte toutes les briques nécessaires pour compiler des programmes, sur de multiples plateformes, tout en offrant des mécaniques diverses pour ajouter des fonctionnalités de haut niveau. On retrouve des fonctions telles que la gestion de la mémoire (Garbage Collector entre autre), ou la gestion des co-routines. Associé à  ce compilateur, Kotlin propose un modèle de librairies binaires (.ktlib), qui sont compatible quelque soit la plateforme source ou cible. Une mécanique qui va participer à la bonne diffusion du langage.

Un langage simple mais puissant

La première préoccupation de Kotlin est de simplifier la tâche de développement par la mise en place de mécaniques simples et concises.
Pour y arriver, Jetbrains a construit son langage sur les réussites et aussi les déboires d’un certain nombre de langages dont Groovy, Scala et Clojure.

Qu’apporte donc ce langage aux développeurs?

Au départ, Kotlin se veut un langage de substitution pour la JVM. Comme base de langage minimum, il propose l’ensemble des concepts existant dans Java 8, avec une syntaxe souvent plus simple et pragmatique, et avec des fonctionnalités plus avancées. Ce niveau de fonctionnalité est disponible dès le JDK 6 (qui est le JDK officiel sous Androïd), ce qui permet même sur un JDK daté, de bénéficier d’un langage de haut niveau.
Les concepteurs du langage ont pris pour principes majeurs d’écrire un langage simple, essayant de gommer les “défauts” de Java, mais aussi promouvant les principes SOLID et Clean Code.

Dans les points suivants, je présente les grands principes du langage. Ces points sont là pour découvrir les bases du langage, mais une plongée dans le document de références vous permettra d’en découvrir bien plus.

Syntaxe simplifiée

L’un des concepts du langage est de minimiser les constructions syntaxiques pour reposer principalement sur les mécanismes objet de la programmation. Tout comme certains de ses illustres prédécesseurs, par exemple Smalltalk ou CLOS (Common LISP Object System), Kotlin minimise les éléments de syntaxe et les mots clés.

Le point virgule peut être utilisé pour séparer des instructions sur la même ligne, mais il est complètement optionnel quand les instructions sont sur des lignes différentes.

La déclaration d’une variable passe par deux mots clés, soit var, qui permet de définir une variable qui peut être réutilisée par la suite, soit val, qui permet de définir une variable qui ne pourra pas être modifiée par la suite (remplace les notions de final).
Le typage s’écrit de façon différente de java:

Une grande différence par rapport à Java repose sur le fait que toute suite d’instructions est une aussi une expression.

 

Un typage souple vérifié statiquement

Les variables sont typées, soit lors de leur déclaration, soit au moment de l’initialisation.

Le compilateur est capable à tout moment de connaitre le type concret de la valeur d’une variable, il n’y a donc aucun risque à l’exécution.
Cette connaissance permet aussi des construction plus simples:

Les types primitifs et les fonctions sont des types de première classe

Dans Kotlin, il n’y a pas de types primitifs, tous les types sont des classes, Int représente aussi bien int que Integer, mais avec les caractéristique d’un objet Integer.

Le langage supporte les fonctions, ce sont des types de première classe. Donc, contrairement à Java, on peut écrire une fonction en dehors d’une classe et la manipuler comme un objet en la préfixant par “::”.

Les fonctions peuvent avoir des paramètres dont les valeurs sont initialisées lors de la définition. Lors de l’invocation d’une fonction (ou méthode), les paramètres peuvent être nommés explicitement, ce qui permet de rendre le code plus lisible.

Comme évoqué précédemment, les constructions de type lambda expressions de Java 8 sont présent sous une forme un peu différente:

Développer optimalement : classes, objets, héritage, extensions.

Un des principes évoqué précédemment, est que Kotlin a été créé pour se substituer à Java, en lui apportant des constructions permettant d’économiser l’écriture de code (et moins de code, c’est moins de bugs). Du côté de la construction de classes, les ajouts sont aussi nombreux.

Par défaut, les classes ne sont pas ouvertes à l’héritage, pour pouvoir hériter d’une classe, il faut qu’elle soit déclarée comme ouverte avec le mot clé open. L’idée, derrière ce changement, est que l’héritage est généralement mal utilisé et mal maîtrisé, et qu’il faut s’en passer si on ne sait pas ce qu’on fait. Le langage propose, d’ailleurs, tout le nécessaire pour s’en passer.

Effectivement on trouve la délégation comme moyen de substitution, et dans Kotlin, c’est une mécanique native.

En Kotlin, il n’y a pas de membres statiques, là aussi, pour éviter un certain nombre de constructions maladroites en Java. Quand on a besoin de fonctionnalité identiques, on utilise une déclaration de type object , qui créé un objet singleton.

Contrairement à l’approche statique proposée par Java, l’ensemble des fonctions et des propriétés sur object restent associé à une instance, de plus, un object comme une class peut implémenter une interface.

Vous avez dit Exceptions et NullPointerException?

Nous allons terminer ce petit tour du langage par deux aspects, qui ont leur importance dans les développements Java, et qui ont été revus dans le cadre de Kotlin.

Le premier aspect est le fait, qu’au contraire de Java, les exceptions sont par défaut non vérifiées.
Il n’est donc pas nécessaire de déclarer les exceptions, et de les propager tout au long du flot de contrôle si ce n’est pas nécessaire. Ceci permettant d’avoir un code plus simple et aussi sécurisé.

Le deuxième aspect d’importance, c’est que par défaut, aucune donnée d’un type Kotlin ne peut être null, donc il y a très peu de chances de faire des programmes dont les variables ne sont pas initialisées. Toutefois, pour l’interopérabilité avec Java (ou les autres langages), le langage permet de déclarer un type supportant null comme élément. Pour cela, il suffit de suffixer le nom du type par ?, le compilateur se chargeant de notifier de toute incohérence dans le code.

Comme vous pouvez le constater, quelque soit la construction que vous utilisez, le compilateur sera toujours là pour vous dire qu’il y a soit une incohérence, soit un manque de vérification. Il n’y a aucune raison de retrouver la sacro-sainte  NPE (NullPointerException) dans du code Kotlin.

Vous voulez aller plus loin?

Dans cet article, nous avons effleuré les bases et principes de ce langage. Kotlin vous intrigue, voir il vous intéresse? Alors voici le moyen de sauter dans le bain très rapidement.

Tout d’abord commençons par le site TryKotlin qui permet de se familiariser avec le langage. Il offre directement sur internet un éditeur Kotlin et une exécution en ligne. De nombreux exercices, d’abord triviaux, et de plus en plus élaborés, permettent de découvrir les nombreuses subtilités du langage. Une fois les bases acquises, vous pouvez même faire des petits projets dans cet environnement.
Pour bien cerner les différences de langage, allez consulter le document: Comparison to Java Programming Language. Vous pourrez aussi vous référer au document qui permet de bien comprendre comment le code Java et le code Kotlin cohabite ici.

Mais rappelez vous, Kotlin fonctionne aussi dans d’autres environnements, il vous faudra regarder la documentation correspondante pour Javascript et les environnements natifs.

Maintenant que vous maîtrisez les bases du langage, nous sommes sûr que vous voulez aller plus loin, et vous trouverez ci-dessous une liste commentée de liens sur Kotlin:

Conclusion

Kotlin n’est très certainement pas le saint-Graal des langages de programmation, et il va lui falloir un peu de temps pour s’imposer de façon certaine.
Mais ce langage démarre avec pas mal de fées au dessus de son berceau. Basé sur une syntaxe simple et concise, il intègre correctement des concepts qui permettent d’écrire des applications plus robustes. De plus, il s’affranchit des principaux défauts de Java et de Javascript.
Enfin, il intègre des patterns plébiscitées par les gourous de la programmation tels que B. Eckels et R. Martin.
En n’oubliant pas qu’il sera très bientôt disponible sur de nombreuses plateformes, sans nécessiter une JVM ou un moteur Javascript. Peut-être un concurrent pour les langages Go ou C eux-même?

L’annonce de Google sur Android a été suivie par un engouement très important de la communauté, et de gros projets ont migré de Java à Kotlin (Uber, Pinterest, Evernote, Trello).
Dans le monde Java, l’adoption a commencé par les fournisseurs d’outils, la prochaine version de Gradle (outil de build) reposera sur Kotlin, Pivotal intègre Kotlin dans Spring 5 pour simplifier la programmation, et pour fournir des DSL (Domain Specific Language) de plus haut niveau. Côté JavaScript il se dit que des portages d’Angular sur Kotlin sont en cours et qu’ils sont prometteurs.

Alors, rendez-vous dans deux ans, pour voir si Kotlin est entré dans la liste des langages qu’utilisent régulièrement nos développeurs !