Le 11 juin dernier sortait la nouvelle release du language Scala : 2.13.
C’est l’avant-dernière version avant la version majeure du language 3. La prochaine version (2.14) aura comme seul objectif de préparer la migration vers la 3.
Aujourd’hui nous allons parler de la version 2.13 et des changements amenées par cette version.
Les 4 grands parties impactées sont :
- Collections
- Standard library
- Language
- Compiler
Dans le détail, de manière synthétique, que c’est-il passé :
Collections :
- D’une manière générale, la library standard collection a été remaniée selon différents axes : Simplification, performance et sécurité. Cela constitue les changements majeurs de cette release,
- Bien que pas mal de chose ait changé, normalement le code basé sur une version précédente devrait continuer à fonctionner. Néanmoins, quelques exceptions feront qu’il faudra envisager des petites adaptations,
- L’utilisation de l’implicit canbuildFrom (qui permet d’adapter les collections au fur et à mesure de leur changement) ne sera plus utilisé. Cette suppression permet d’ailleurs d’optimiser les performances du compilateur. Dans certains cas, ou c’est vraiment indispensable, un implicit BuildFrom sera utilisé,
- Les collections parallèles seront maintenant dans un module à part,
- Tout ce qui concerne l’interropérabilité avec Java est localisé dans un package dédié : `scala.jdk`,
- ajout de nouvelles functions : .unfold, .lenghtIs, .sizeIs, LazyIs, taEach, etc..
– Une hiérarchie plus simple, suppression de Traversable et TraversableOnce,
Beaucoup d’autres éléments ont changé sur la librarie collections. Pour avoir plus de détails vous pouvez suivre les liens suivants:
- https://docs.scala-lang.org/overviews/collections-2.13/introduction.html
- https://docs.scala-lang.org/overviews/core/architecture-of-scala-213-collections.html
- https://docs.scala-lang.org/overviews/core/collections-migration-213.html
Standard library > Concurrency :
Les futures ont été repensées avec les objectifs suivants :
- Fournir un comportement plus déterministe avec un ensemble plus large de condition de défaillance,
- Fournir des performances accrues,
- Avoir un socle plus robuste pour supporter plus d’exigences.
Plus de détails ici :
- https://github.com/scala/scala/pull/6610
- https://github.com/scala/scala/pull/7663
- https://github.com/scala/scala/pull/7470
- https://github.com/scala/scala/pull/7784
Standard library > nouvelles feature :
De nouvelles fonctionnalités ont été ajoutées dans la librairie standard. Nous n’allons pas lister l’ensemble des ajouts, mais voici une petite synthèse :
- L’interpolation de chaine de caractères disponibles dans le pattern matching https://github.com/scala/scala/pull/7387
- Introduction des opérations pipe et tap, qui permettent de chainer des opérations https://github.com/scala/scala/pull/7007
- Introduction de scala.util.Using. C’est un utilitaire permettant de gérer automatiquement les ressources. https://github.com/scala/scala/pull/7468 ,https://github.com/scala/scala/pull/6907
- Ajout de la function andthen sur les PartialFunction ce qui offre la possibilité de combiner deux fonctions partielles. https://github.com/scala/scala/pull/7263
- Remplacement des traites Claneable et Serializable par des alias de type. https://github.com/scala/scala/pull/6729
La liste est loin d’être exhaustive.
Compiler
- Compilation déterministe et reproductible : Le compilateur génère une sortie identique sur plus de cas avec d’avoir une construction reproductible : https://github.com/scala/scala-dev/issues/405
- Amélioration des optimisations : Les opérations sur les collections et les tableaux sont beaucoup plus optimisées (incluant des améliorations sur l’inlining ) https://github.com/scala/scala/pull/7133
- Le compilateur propose des suggestions sur les corrections possibles sur des identifiers non reconnus https://github.com/scala/scala/pull/6711
- Suppression de la dépendance du jar du compilateur scala avec scala-xml https://github.com/scala/scala/pull/6436
Compatibilité
Toutes les informations sur les problématiques de compatibilité entre les versions de Scala ainsi avec le Jdk sont expliquées ici
D’une manière générale, Scala 2.11, 2.12, 2.13 sont dans la plupart des cas compatibles au niveau des sources (ceci afin de faciliter le cross-building) En revanche, pas de compatibilité binaire. La raison est pour permettre de garder une amélioration sur le compilateur Scala ainsi que la librairie standard.
Enfin vous trouverez la liste des librairies open-source déjà compatibles avec cette nouvelle version
la liste grossit très rapidement. Ce qui encourage une migration vers la nouvelle version.
Ici, nous avons vu qu’une petite synthèse de cette nouvelle version. Je vous encourage à aller lire la documentation officielle ainsi que le changelog.