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.
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 :
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.