Scala : slides et compte rendu

Nous avons la chance de recevoir lundi dernier Aleksandar Prokopec qui travaille sur les collections Scala avec Martin Odersk, le créateur du langage.

Aleksandar Prokopec

Aleksandar Prokopec

Ce fût une présentation très dense du langage. Si on devait présenter Scala en quelques points clés :

  • Un langage statiquement typé, avec un support puissant de l’inférence de type
  • Conçu pour tourner sur une JVM et compatible avec toutes les librairies Java
  • Un langage orienté objet : tout est objet (pas de types primitifs, les opérateurs sont des méthodes…)
  • Egalement un langage fonctionnel. Le langage ne privilégie aucune des deux approches, il réunit la puissance des deux paradigmes.

Scala permet d’écrire des programmes performants en un minimum de lignes de code, grâce à l’approche fonctionnelle.
Dans la tour de Babel des langages de programmation, Scala essaye d’unifier les concepts (pour les lier dans les ténèbres ? 😉 )
Aleksandar nous a montré un grand nombre d’aspects du langage comme les Collections mutables ou immutables ou encore les traits (un concept entre les interfaces et les classes abstraites de Java). Mais nous sommes allés encore plus loin jusqu’aux aspects transactionnels en mémoire (avec les blocs atomic) ou
l’utilisation des implicit.

Là où on serait obliger d’écrire un tas de boucles en Java, on peut écrire ce genre de code avec Scala :

      
      //déclaration d'une liste d'entiers
      var numbers = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

      //filtrage de la liste : on ne veut que les entiers pairs
      var evenNumbers = numbers.filter(x=>x%2==0)
      
      //on ajoute 1 à chaque élément
      var oddNumbers = evenNumbers.map(_+1)

      //affichage du résultat
      oddNumbers.foreach(println(_))

Le compilateur est capable de deviner le type dans la plupart des cas. Ici il est clair que evenNumbers est une liste d’entiers.

Le caractère _ est une sorte de caractère joker, le compilateur scala est assez intelligent pour le remplacer par la valeur appropriée.
evenNumbers.map(_+1) est par exemple équivalent à evenNumbers.map(x=>x+1)

Cette approche fonctionnelle permet aussi une amélioration des performances. Là on en Java on serait obligé de faire un code séquentiel avec des boucles, on laisse à Scala le choix de l’implémentation d’une fonction . Il est alors possible d’utiliser, par exemple, la programmation concurrente pour accélérer le traitement de la fonction filter en profitant des architectures multi-coeurs. Aleksandar travaille justement sur la parallélisation des tâches pour les collections Scala.

Il existe d’autres notions encore plus puissantes comme le pattern matching ou les streams, je vous laisse découvrir tout ça dans les slides :

Scala runs on the JVM

Scala a la réputation d’être un langage complexe. Alors, verdict ?
Le code plus concis permet une meilleure lisibilité. Donc potentiellement une meilleure maintenabilité.
Il est effectivement possible de faire des choses difficilement compréhensibles pour les néophites. Mais c’est finalement le cas de la plupart des langages fonctionnels.
Une fois les concepts de la programmation fonctionnelle assimilés, le gain est réel. En respectant des normes de codage (que l’on peut fixer au sein d’une équipe)  et en faisant un peu attention, je suis certain qu’il est tout à fait possible d’écrire du code plus lisible et maintenable qu’avec Java.
Et vous qu’en pensez vous?