Ceylon est un nouveau langage s’exécutant sur la JVM. Il rejoint une liste désormais assez longue qui comprend notamment :
- Groovy
- Jython
- Jruby
- Scala
- Kotlin
- Fantom
- Gosu
- …
Gavin King a créé Ceylon parce qu’il était frustré par les limitations de Java. Cette session a été animée par deux français, Emmanuel Bernard et Stéphane Epardaud qui sont commiters sur le projet. Ils ont débuté la session en définissant les objectifs de Ceylon, avant de continuer sur ses fonctionnalités à l’aide de code. Je ne vais pas reproduire le code qu’ils ont utilisé pendant la présentation dans cet article, je vais essayer d’être plus concis.
Emmanuel commence par nous indiquer les objectifs de Ceylon :
- Permettre d’écrire du code plus simple que l’équivalent en java
- Éviter au développeur de tomber dans les principaux pièges de java
Ceylon est pensé pour être lu facilement par des développeurs venant du monde Java. Emmanuel insiste bien sur ce point : Ceylon doit être simple à utiliser mais également simple à lire. Le code ne doit pas soulever d’ambiguïté.
Principes de base
Classe simple
shared class User(String username, Natural age) { shared String username = username; shared Natural age = age; shared void printUser() { print("User name : " username " with age " age " is printed"); } }
Cette classe est courte, mais il y a déjà plusieurs choses à dire dessus :
- Le mot-clé
class
indique évidemment qu’il s’agit d’une déclaration de classe - Le mot-clé
shared
est l’équivalent dupublic
de Java. Si le mot-cléshared
est omis, alors la visibilité est privée (visibilité par défaut en Ceylon) - A la suite de la déclaration de la classe
User
se trouvent des paramètres(String username, Natural age)
, il s’agit de la déclaration du constructeur. Je dis bien du car une Ceylon interdit la surcharge de méthode et donc un seul constructeur est autorisé Natural
est l’objet représentant un nombre entier naturel. En Ceylon, il n’y a pas de type primitif- Les attributs de la classe sont obligatoirement initialisés, il n’y a pas de valeur par défaut, même
null
n’est pas implicite. Ici, les valeurs sont celles fournies au constructeur - La déclaration de la méthode
printUser
se fait comme en Java, le mot-cléshared
en plus si on souhaite l’exposer - La concaténation de chaîne de caractère peut se faire sans le caractère +. La concaténation avec le caractère + fonctionne également
Méthodes
shared class Parent() { shared default void printMe() { print("I'm in parent class"); } shared void printMessage(String messageToPrint = "default argument value") { print("I'm in parent class and I print " + messageToPrint); } } shared class Child() extends Parent() { shared actual void printMe() { print("I'm in child class"); } } void testCeylon() { // appel de méthodes Parent p = Parent(); p.printMe(); p.printMessage(); // default value of parameter used - will work on milestone 2 p.printMessage("message given as argument"); // classic call p.printMessage { // name argument used messageToPrint = "message with named arguments"; }; }
Encore une fois, malgré la petite taille de code et sa lisibilité, plusieurs fonctionnalités sont à décrire :
- Comme dit plus haut, les méthodes ne sont pas surchargeables. Pour palier à cette obligation les paramètres peuvent avoir des valeurs par défaut (ligne 6), des varargs peuvent être utilisés (comme en java), ou des union types peuvent être utilisés (voir la doc pour plus de détails)
- Les paramètres des méthodes sont nommés – ligne 22
- Les méthodes peuvent être redéfinies dans les classes filles mais il faut l’autoriser explicitement grâce au mot clé
default
dans la classe parent (équivalent duvirtual
du C++ utilisé dans la classe parent) – ligne 2 - Lors de la rédéfinition de la méthode dans une classe fille, il faut obligatoirement utiliser le mot-clé
actual
(équivalent à l’annotation@Override
de Java) – ligne 12
null et immuabilité
Par défaut toutes les variables sont immuables en Ceylon. Afin de les rendre modifiables il faut explicitement adapter la syntaxe de déclaration d’une variable en ajoutant le mot-clé variable
et effectuer l’affectation avec l’opérateur := :
shared class ImmutableExample(Natural year) { // immutable Natural year = year; // Mutable variable Natural writableYear := year; }
Afin d’éviter les trop nombreux NullPointerException
de Java, une variable qui pourrait contenir la valeur null
doit être déclaré à l’aide d’un ?
. Ceci a des conséquences sur la manière d’utiliser ces variables comme le montre le code ci-dessous :
// myBestVariable can be null String? myBestVariable = functionThatCanReturnNull(); // to work on myBestVariable, a null check must be done if (exists myBestVariable) { functionThatNeedAString(myBestVariable); } else { functionThatNeedAString("default value"); }
Autres fonctionnalités
Emmanuel et Stéphane ont présenté d’autres fonctionnalités importantes de Ceylon telles que les union type et les intersection type. Pour plus de détails, reportez vous à la documentation officielle.
Malgré les arguments nommés, il est possible d’utiliser les generics. Les annotations sont également disponibles.
La compatibilité entre Java et Ceylon est également disponible. Ceylon peut utiliser du code écrit en Java, et Java peut appeler du code Ceylon.
En pratique
Emmanuel et Stéphane, après avoir transmis les bases à l’auditoire, effectuent une démo en live de Ceylon dans Eclipse. Un plugin Eclipse a été développé et est déjà fontionnel. L’autocomplétion fonctionne bien, la coloration syntaxique et le refactoring également. Plus d’infos sur le repo git associé.
Aucune version de Ceylon n’a encore été releasée. La prochaine version à sortir sera la milestone 1 qui ne comprendra pas encore toutes les fonctionnalités de la spécification. Trois milestones sont prévues avant que la version 1.0 ne sorte.
Test de Ceylon
Il est évidemment possible aujourd’hui de tester dès aujourd’hui Ceylon et pour cela, j’ai réalisé un petit screencast afin de vous montrer qu’avoir le compilateur Ceylon utilisable sur son poste est vraiment simple et rapide.
Les prérequis sont d’avoir sur sa machine Java 6, Ant et Git. Dans le screencast, je clone les trois repositories Git nécessaires à la création du compilateur. Chacun nécessite Ant afin d’être compilé. Une fois le compilateur généré, je le teste en compilant l’exemple de code que j’ai donné ci-dessus dans le paragraphe Méthodes, et je l’exécute.
Pour ceux qui veulent tester, je vous retranscrits les commandes utilisées dans le screencast afin de faciliter le copier coller
Repository Git | Commande pour compiler le repository |
---|---|
git://github.com/ceylon/ceylon.language.git | ant clean publish |
git://github.com/ceylon/ceylon-spec.git | ant clean tree publish |
git://github.com/ceylon/ceylon-compiler.git | ant clean build |
Une fois le compilateur généré, je l’ai testé. Mon fichier source se nomme florian_boulay.ceylon et se trouve dans le répertoire samples. Le répertoire build contient les fichiers Ceylon compilés. testCeylon correspond au nom de la fonction appelée pour lancer le programme.
Compilation du fichier Ceylon | ~/ceylon/ceylon-compiler/bin/ceylonc -src samples -out build samples/florian_boulay.ceylon |
Exécution du fichier Ceylon | ~/ceylon/ceylon-compiler/bin/ceylon -cp build/unversioned/default_module-unversioned.car testCeylon |
Ceylon est un langage simple à comprendre pour qui vient de Java. En écrire est également à la portée de tous. Jusque là les objectifs de Gavin King sont atteints.
Fin de la session
Pour finir, Emmanuel nous indique que Ceylon a enfin sont site web : http://ceylon-lang.org
Il contient une documentation très complète, la spécification du langage écrite par Gavin King, un blog et tout ce qu’il faut pour contribuer au développement du langage. C’est là bas qu’il faut aller si vous souhaitez tester le langage qui n’a pas encore été releasé, mais peut être testé via la récupération du code source sur Github.
Comme vous le voyez, le logo de Ceylon est un éléphant, est-ce un hommage à PHP ? On peut lui souhaiter qu’il ait le même succès que PHP
De nombreux nouveaux langages ont émergé ces derniers mois fonctionnant sur la JVM (Eclipse Xtend, JetBrains Kotlin). Comme dit plus haut, Ceylon veut rester accessible à tout le monde en restant simple et facilement compréhensible. Est-ce que ces atouts seront suffisants pour faire de Ceylon une alternative à Java réellement utilisée, comme l’est Scala aujourd’hui ? Faites vous votre propre opinion et essayez le.