Scala pour le big data
Scala est l’un des principaux langages de programmation pour les plateformes et les outils de la science des données. Dans le cadre ce projet, nous avons travaillé sur de nouveaux concepts de langage de programmation afin d’en améliorer la clarté et la facilité.
Portrait (projet de recherche terminé)
Le projet est divisé en différentes parties. La première s’occupe des structures de données fondamentales nécessaires à l’accès aux bases de données. Ici, nous avons dû combler un écart d’échelle. En effet, les structures des données dans les langages de programmation n’ont généralement que peu de domaines, alors que les fichiers des bases de données peuvent avoir plusieurs centaines de colonnes. Nous avons essayé de résoudre le problème en étendant le langage de programmation de manière à pouvoir définir davantage de structures de données flexibles. Une autre partie du projet s’intéresse à l’optimisation : comment pouvons-nous générer un code efficace pour des tâches typiques du Big Data ? Tous les ensembles de tâches seront compris dans une application illustrant notre approche de traitement distribué des données.
Contexte
L’EPFL développe depuis 2003 le langage de programmation Scala. Grâce à une série de caractéristiques favorables, Scala est le langage d’implémentation d’une nouvelle génération de "frameworks" (bibliothèque logicielle) Big Data utilisé par des centaines de milliers de développeurs de par le monde. Spark, Flink, Scalding, Summingbird et Kafka sont les "frameworks" les plus populaires écrits en Scala. Scala est également un langage de requête et de programmation pour travailler avec ces "frameworks".
Objectif
Nous avons voulu améliorer les combinaisons entre langages de programmation et bases de données. L’objectif n’était pas d’intégrer les caractéristiques spécifiques des bases de données dans un langage de programmation, car ce serait infaisable. Conformément à la philosophie de Scala, qui est un langage polyvalent, nous avons cherché des moyens de mieux exprimer et exporter des abstractions de programmation fondamentales (des moyens de formuler des tâches essentielles) utilisées dans les interfaces entre bases de données et langages de programmation.
Importance
Le projet fera progresser des « frameworks » et des outils de pointe pour la science des données. Une meilleure intégration des langages de requête dans les langages de programmation à usage général fournira des bases plus solides pour écrire des applications Big Data complexes. Nos travaux devraient aussi fournir de meilleures abstractions pour structurer et réaliser la prochaine génération de moteurs de données distribués complexes. Cela entraînera à son tour la création de meilleurs outils pour la science des données, rendra les spécialistes plus productifs et permettra une meilleure intégration de ce domaine de recherche dans d’autres systèmes d’information.
Résultats
Le projet a atteint son principal objectif : intégrer plusieurs nouvelles technologies dans un ensemble cohérent d'abstractions pour l'interfaçage avec les données et valider son utilité dans des projets open source. Les implémentations de ces abstractions sont de qualité suffisante pour être intégrées dans Scala 3, la prochaine version majeure de Scala qui est disponible depuis juillet 2021. Comme Scala 2, Scala 3 est une plateforme prête à la production pour des applications majeures, et pas seulement un langage de recherche.
En particulier, le projet a développé les nouveaux concepts et techniques suivants qui ont été intégrés dans Scala 3 :
- Les enregistrements sont pris en charge par une nouvelle abstraction pour les
types structurels programmatiques. Dans la version précédente de Scala, les types structurels étaient toujours implémentés à l’aide de la réflexion Java, ce qui empêchait de les utiliser comme des représentations de lignes de base de données gérées en externe. Les nouvelles conception et implémentation permettent aux développeuses et développeurs de fournir leurs propres implémentations des types structurels. Cela est particulièrement vrai dans un contexte de base de données où les enregistrements au niveau du langage de programmation sont représentés comme des blocs d'octets de niveau inférieur. - La sérialisation est prise en charge de manière générique par le nouveau
mécanisme de dérivation de type de classe de Scala 3. Les classes de type sont simplement des interfaces (dans Scala : des « traits ») avec au moins un paramètre de type. La dérivation de classe de type implique que les instances de ces traits peuvent être générées automatiquement par le compilateur d’après la structure de l'argument type. - Les fonctions de métaprogrammation de Scala 3 permettent d'effectuer des calculs en toute sécurité au moment de la compilation. De tels calculs peuvent générer de nouveaux types ainsi que des expressions. Il existe deux éléments principaux qui fournissent des bases utiles pour représenter les requêtes de base de données. Premièrement, les
types de correspondance permettent de calculer des types par appariement de motifs sur la structure des types de scrutins. Combinés aux types récursifs, ils offrent des capacités de modélisation puissantes via le calcul au niveau du type. Deuxièmement, les
fonctions inline fournissent un cadre commun pour évaluer les expressions au moment de la compilation. - À elles seules, les fonctions d'inlining fournissent déjà des fonctionnalités de métaprogrammation de manière très sûre. Mais il est nécessaire parfois d'avoir un contrôle plus précis de la génération du code, lequel est assuré dans Scala 3 par un
système d’activation basé sur des « quotes » et des « splices ». Les quotes traitent le code comme des données. Les données peuvent présenter des trous qui sont remplis par des splices. Une nouveauté du système développé dans Scala 3 permet d’avoir des splices à la fois pour les expressions et les types. - Un accès plus détaillé de niveau inférieur aux arbres de codage est assuré par la définition d'un format standard pour les arbres exposés à la métaprogrammation. Le format est appelé
TASTy, qui est un acronyme formé à partir de « Typed Abstract Syntax Trees ». TASTy est techniquement un format de sérialisation, qui engendre toutefois des structures internes d'arbres, de symboles et de types de manière naturelle.
- Les enregistrements sont pris en charge par une nouvelle abstraction pour les
Titre original
Programming Language Abstractions for Big Data