Scala-Programmiersprache: Big-Data-Analytik ermöglichen
Scala ist eine der führenden Programmiersprachen für Data-Science-Plattformen und -Tools. Dieses Projekt entwickelte neue Konzepte, um die in diesem Bereich eingesetzten Programmiersprachen verständlicher und benutzerfreundlicher zu machen.
Porträt (abgeschlossenes Forschungsprojekt)
Das Projekt bestand aus mehreren Teilen. Das erste Arbeitspaket befasste sich mit den elementaren Datenstrukturen, die den Zugriff auf eine Datenbank ermöglichen. Hierbei war ein grösseres Hindernis zu überwinden: Während die Datenstrukturen in Programmiersprachen in der Regel aus einigen wenigen Feldern bestehen, können Datenbankeinträge mehrere hundert Spalten umfassen. Dieses Problem sollte gelöst werden, indem die Programmiersprache so erweitert wurde, dass die Datenstrukturen flexibler definiert werden können. Das zweite Paket widmete sich der Optimierung: Wie erstellt man effizienten Code für typische Big-Data-Workloads? Beide Arbeitspakete gingen in eine Anwendung ein, die unser Konzept für eine verteilte Datenverarbeitung abbildet.
Hintergrund
Die Programmiersprache Scala wird seit 2003 an der EPFL entwickelt. Ihre vielen positiven Eigenschaften haben Scala zur Programmiersprache für eine neue Generation von Big-Data-Softwarebibliotheken gemacht, die inzwischen von mehreren Hunderttausend Entwicklern weltweit genutzt werden. Zu den bekannteren Programmiergerüsten oder Frameworks, die in Scala verfasst sind, gehören Spark, Flink, Scalding, Summingbird und Kafka. Scala ist auch als Abfrage- und Programmiersprache für die Arbeit mit diesen Frameworks beliebt.
Ziele
Die Interaktion zwischen verschiedenen Programmiersprachen und Datenbanken sollte verbessert werden. Das bedeutete nicht, dass spezifische Datenbankmerkmale in eine Programmiersprache integriert werden, was ohnehin nicht durchführbar wäre. Wir wollten vielmehr die Philosophie von Scala – ihre Universalität – aufgreifen und herausfinden, wie man die grundlegenden Abstraktionen (Formulierungen der wesentlichen Aufgaben), die an den Schnittstellen zwischen Datenbanken und Programmiersprachen eingesetzt werden, besser formulieren und exportieren kann.
Bedeutung
Das Projekt wird den Stand der Technik von Data-Science-Frameworks und -Tools weiterentwickeln. Durch die verbesserte Einbindung von Abfragesprachen in universelle Programmiersprachen werden wir solidere Grundlagen für die Gestaltung komplexer Big-Data-Anwendungen erhalten. Das Projekt dürfte darüber hinaus bessere Abstraktionen für die Strukturierung und den Aufbau von Suchmaschinen der nächsten Generation liefern, die komplexe verteilte Daten verarbeiten. Somit erhalten wir bessere Data-Science-Tools, die ihrerseits die Produktivität der Datenwissenschaft steigern und eine bessere Integration von Resultaten in andere IT-Systeme ermöglichen.
Resultate
Das Projekt hat sein Hauptziel erreicht: Mehrere neue Technologien wurden in ein kohärentes Set von Abstraktionen für die Schnittstelle mit Daten integriert und deren Nutzen in Open-Source-Projekten validiert. Die Implementierungen dieser Abstraktionen sind von ausreichend hoher Qualität zur Integration in Scala 3, der nächsten Hauptversion von Scala, die im Juli 2021 erschienen ist. Wie Scala 2 soll auch Scala 3 eine produktionsreife Plattform für grosse Anwendungen sein, nicht nur eine Forschungssprache.
Das Projekt entwickelte insbesondere die folgenden neuen Konzepte und Techniken, die in Scala 3 eingebettet wurden:
- Datensätze werden durch eine neue Abstraktion für
Programmatische Strukturtypen unterstützt. In der vorherigen Version von Scala wurden Strukturtypen immer mit Java-Reflektion implementiert, was sie als Repräsentation von extern behandelten Datenbankzeilen unbrauchbar machte. Das neue Design und die Implementierung erlauben es den Entwicklerinnen und Entwicklern, eigene Implementierungen von Strukturtypen bereitzustellen. Dies ist besonders in einem Datenbankkontext relevant, wo Datensätze auf der Ebene der Programmiersprache als Low-Level-Byte-Blöcke dargestellt werden. - Die Serialisierung wird auf generische Weise durch den neuen
Typklassen-Ableitungsmechanismus von Skala 3 unterstützt. Typklassen sind Schnittstellen (in Scala: Merkmale) mit mindestens einem Typparameter. Typklassenableitung bedeutet, dass Instanzen solcher Merkmale basierend auf der Struktur des Typarguments automatisch vom Compiler erzeugt werden können. - Die Meta-Programmiermöglichkeiten von Scala 3 erlauben es, Berechnungen sicher zur Kompilierzeit durchzuführen. Solche Berechnungen können sowohl neue Typen als auch Ausdrücke erzeugen. Zwei Hauptelemente bieten nützliche Grundlagen für die Darstellung von Datenbankabfragen: Erstens ermöglichen
Match-Typen die Berechnung von Typen durch Mustervergleiche auf der Struktur von Scrutinee-Typen. In Kombination mit rekursiven Typen bieten sie mächtige Modellierungsmöglichkeiten über Berechnungen auf Typebene. Zweitens bieten
Inline-Funktionen einen gemeinsamen Rahmen für die Auswertung von Ausdrücken zur Kompilierzeit. - Inlining-Funktionen allein bieten bereits eine gewisse Metaprogrammierfunktionalität und zwar auf sehr sichere Art und Weise. Aber manchmal ist eine feinere Steuerung der Codegenerierung erforderlich. Dies wird in Scala 3 durch ein
Staging-System auf Basis von Anführungszeichen und Splices gewährleistet. Anführungszeichen behandeln Code als Daten. Daten können Lücken haben, die durch Splices gefüllt werden. Eine Systemneuheit in Scala 3 ist, dass es Splices sowohl für Ausdrücke als auch für Typen zulässt. - Ein untergeordneter, detaillierterer Zugriff auf Codebäume wird durch die Definition eines Standardformats für Bäume unterstützt, die der Metaprogrammierung ausgesetzt sind. Das Format heisst TASTy, ein Akronym für «Typed Abstract Syntax Trees». TASTy ist technisch gesehen ein Serialisierungsformat, das aber auf natürliche Weise interne Strukturen von Bäumen, Symbolen und Typen entwickelt.
- Datensätze werden durch eine neue Abstraktion für
Originaltitel
Programming Language Abstractions for Big Data