Par contre, un des inconvénients de Scala est sa vitesse d’exécution, pas toujours suffisante : il faut compter le temps de démarrage de la JVM, puis les optimisations que le moteur JIT peut effectuer sur le code qui lui est soumis, sans oublier que le ramasse-miettes peut venir jouer. La sécurité que le langage offre peut aussi aller à l’encontre de la performance à l’exécution : il est impossible de s’échapper du bac à sable défini, à l’exception de quelques utilisateurs très expérimentés. Finalement, au niveau de l’accès aux bibliothèques natives préexistantes, leur réutilisation est presque impossible — après tout, ces bibliothèques natives pourraient causer des problèmes de sécurité !
Pour résoudre ces problèmes, une équipe de l’EPFL, déjà à l’origine de Scala, a lancé en 2016 le développement de Scala Native. Ce compilateur Scala exploite LLVM, l’infrastructure de compilateurs derrière Clang, notamment. La syntaxe de cette variante de Scala ne diffère de l’originale que par quelques ajouts, dont l’objectif est de faciliter l’interopérabilité avec des bibliothèques natives, comme des structures C (avec l’annotation @struct sur une classe) ou encore l’allocation de mémoire sur le tas avec des pointeurs.
Scala Native vient donc corriger certains des inconvénients du langage de programmation orienté objet et fonctionnel Scala.
Scala Native est un compilateur AOT optimisant pour Scala construit sur l'infrastructure de compilateur LLVM. Pour information, la compilation anticipée (ou compilation AOT) est une compilation qui traduit un langage évolué en langage machine avant l'exécution d'un programme. Elle s’oppose à la compilation à la volée (JIT) qui se fait lors de l'exécution du programme. Cela signifie qu'il n'y a pas de phase warm-up qui est commune aux compilateurs JIT ; ce qui assure donc un démarrage instantané avec Scala Native.
Contrairement à l'implémentation de référence de Scala générant un bytecode qui s'exécute sur la machine virtuelle Java (JVM), la toolchain de Scala Native produit des exécutables natifs autonomes. D’après l’équipe de développement, cela permet à Scala de s’exporter de plus en plus vers des dispositifs à ressources limitées.
Scala Native version 0.3.9
L’équipe de développement a annoncé la sortie de Scala Native numérotée v0.3.9. En voici les particularités.
Primitives de bas niveau.
Code Scala : | Sélectionner tout |
1 2 3 4 5 6 7 | type Vec = CStruct3[Double, Double, Double] val vec = stackalloc[Vec] // allocate c struct on stack !vec._1 = 10.0 // initialize fields !vec._2 = 20.0 !vec._3 = 30.0 length(vec) // pass by reference |
Les primitives de bas niveau vous permettent d’ajuster à la main votre application pour qu’elle fonctionne exactement comme vous le souhaitez. Vous êtes donc au contrôle.
Interopérabilité transparente avec le code natif
Code Scala : | Sélectionner tout |
1 2 3 4 5 | @extern object stdlib { def malloc(size: CSize): Ptr[Byte] = extern } val ptr = stdlib.malloc(32) |
Appeler du code C n'a jamais été aussi simple. Avec l'aide d'objets externes, vous pouvez appeler de manière transparente du code natif sans aucune surcharge d'exécution.
Temps de démarrage instantané
Code Scala : | Sélectionner tout |
1 2 3 4 5 6 | > time hello-native hello, native! real 0m0.005s user 0m0.002s sys 0m0.002s |
Source : Scala Native
Et vous ?
Que pensez-vous de Scala Native ? L’avez-vous déjà testé ?
Quelles opportunités offre-t-il pour Scala ?
Quelles sont, d’après vous, ses limites ?
Voir aussi :
Scala Native : un générateur de code natif pour accéder au bas niveau depuis le langage Scala
La version 2.13 du langage Scala est disponible avec une refonte des collections et des améliorations de la bibliothèque standard
Kotlin gagne trois places et dépasse Scala dans le classement PYPL, l'indice qui analyse la fréquence de recherche des tutoriels sur Google
Kubernetes touché par une faille critique pouvant provoquer une escalade de privilège, des correctifs sont disponibles pour le système d'orchestration
Feuille de route de Scala 3.0 : il utilisera le compilateur Dotty afin de simplifier la structure du langage, Scala 3.0 est attendu en 2020