mercredi 20 juillet 2011

Kotlin: un nouveau langage pour la JVM

JetBrains (l'éditeur de l'excellent IDE IntelliJ IDEA) vient d'annoncer qu'ils lançaient leur propre langage pour la JVM : Kotlin.
Cette annonce arrive quelques mois après celle de Red Hat qui a presénté le langage Ceylon au mois d'Avril.


Alors à quoi ressemble ce nouveau langage? Pour faire court, prenez Scala, rendez le un peu plus abordable et facile d'accès, ajoutez y un peu de Groovy et quelques nouvelles features.

Vous comprendrez mieux avec quelques exemples de code .

On peut facilement écrire ce genre de code grâce aux expressions lambda :
names filter {it.startsWith("A")} map {it.toUpperCase()} foreach {print(it)}

Ce code écrit en majuscule dans la console tous les nom commençant par A.
C'est le genre de choses toutes simples qui peuvent être vraiment lourdes à écrire en Java...

On peut également faire du pattern matching à la Scala :
fun cases(obj : Any) {
  when(obj) {
    1          => print("One")
    "Hello"    => print("Greeting")
    is Long    => print("Long")
    !is String => print("Not a string")
    else       => print("Unknown") 
  }
}

Kotlin est un langage à typage statique. Mais il propose un mécanisme d'inférence de type pour alléger la syntaxe :
var a : Int = 1
var b = 1 // Type inféré

On peut même automatiser les cast dans certains cas :
if (obj is String) 
    return obj.length // pas de cast explicite 

Le langage fournit un système de properties très bien pensé (pour éviter d'écrire les getters et setters à la main), qui rappelle un peu celui de C#.

La gestion des null est aussi très efficace et devrait résoudre pas mal de problèmes liés au null pointers. Un champ ne peut être null que si on l'autorise :
var a : String = "abc"
a = null // erreur de compilation

var b : String? = "abc"
b = null // ok

Pour y accéder, on fait comme en Groovy :
b?.length() 

Ceci renverra length() si b est non null, rien sinon. On pourra donc éviter quelques fastidieux if(b!=null) dans notre code.

Pour réduire le risque d'erreurs, l'utilisation du "?" est obligatoire pour accéder aux objets "nullables" :
b.length() //erreur de compilation

Enfin, le langage offre la même sécurité que Scala au niveau de l'immutabilité, avec l'usage du mot clé "val" (au lieu de "var") pour déclarer une propriété immuable. Ceci aura aussi une incidence sur la génération automatique des accesseurs : seul un getter est généré pour une propriété de type val.

Si cette mise en bouche vous a ouvert l'appétit, je vous conseille de regarder ces exemples plus détaillés sur le site du langage.

En tout cas personnellement je trouve ça très prometteur. Le support natif dans IntelliJ IDEA sera un gros plus des son lancement. J'espère sincèrement que ce langage aura sa chance dans la jungle des langages pour la JVM!

MAJ : Vous pouvez dès à présent jouer avec la Web demo de Kotlin