Die Programmiersprache Scala kombiniert funktionale und objektorientierte Konzepte. heise Developer sprach mit dem Scala-Erfinder Martin Odersky über die Anfänge, Herausforderungen und andere Programmiersprachen, die Konzepte von Scala übernommen haben.

heise Developer: Scala ist mit vierzehn Jahren inzwischen eine ausgereifte Programmiersprache, die unter anderem jährlich über tausend Entwickler zu den Scala Days zieht, die in Europa und den USA stattfinden. Erzähl doch mal, wie alles begann!

Martin Odersky: Die Anfänge sind von Java her gekommen, womit ich schon die Jahre vorher beschäftigt war. Wir hatten uns bereits länger überlegt, wie man Java und funktionales Programmieren zusammenbringt. Die erste Sprache hieß Pizza und hatte mäßigen Erfolg. Dann habe ich einen erfolgreichen Java-Compiler geschrieben, den Borland-Compiler. Danach habe ich noch einen Compiler geschrieben, der zu dem offiziellen Sun-Compiler javac ab Java 1.4 wurde und mit Generics umgehen konnte.

Wir wollten aber funktionales Programmieren auf die Java-Plattform bringen. Viele haben damals nicht daran geglaubt, dass man funktionales und objektorientiertes Programmieren zusammenbringen kann. Dass man es theoretisch konnte, wussten wir bereits, aber die Frage war: Kann man das auch praktisch umsetzen. Daher begann es zunächst unter dem Titel "Scala Experiment". Inzwischen kann man wohl sagen, dass das Experiment geglückt ist. Nun beschäftigen uns erweiterte Fragen wie Tooling.

Das Tooling ist besser als sein Ruf

heise Developer: Genau dazu gab es anfangs Klagen. Hat sich das geändert? Ist das Toolset inzwischen mit dem von Java vergleichbar?

Odersky: Java ist natürlich eine ganz hohe Latte. Vermutlich ist höchstens in .NET das Tooling ähnlich ausgereift wie in Java. Aber im Vergleich zu anderen Sprachen ist Scala inzwischen gut aufgestellt. Die IDEs waren lange Zeit ein Problem, aber IntelliJ ist das Tool der Wahl und sehr gut benutzbar. Auch VS Code wird wohl in absehbarer Zeit auf derselben Höhe sein. Eclipse ist noch eine gute Alternative, aber das ist eine schwierigere Plattform.

Auch der Scala-Compiler ist mittlerweile ausgereift. Wenn man Scala nicht allzu akrobatisch programmiert, ist der Compiler sehr schnell – entgegen dem Ruf, den er hat. Meist wird ohnehin inkrementell kompiliert, und ich sehe in meinen Projekten kein Problem mit der Übersetzungszeit.

In Scala gibt es mit implicit und Makros enorme Ausdrucksfähigkeit, auch sehr komplizierte Sachen zu machen. Manche Frameworks nutzen das sehr aggressiv, und es wird Unmengen an Code zur Compile-Zeit generiert. Somit ist das Tooling vor allem deshalb eine Herausforderung, weil die Leute sehr ambitionierte Dinge mit Scala umsetzen, was die Tools unter Stress setzt.

heise Developer: Im JavaScript-Umfeld ist seit einiger Zeit der Trend bei den Frameworks, dass sie erst mal schlanker und modularer werden, statt noch mehr Funktionen zu bieten und damit weiter zu wachsen. Das ist dann vielleicht auch bei Scala gefragt.

Odersky: Das ist definitv der Fall. Es gab einen sehr guten Blogpost in der Scala-Community mit dem Titel "The Principle of Least Power": Man sollte immer die Lösung wählen, die am wenigsten mächtig ist, aber noch das Problem löst. Und ich finde, das ist genau richtig – gerade bei einer Sprache, die sehr fähig ist, die Sachen in Bibliotheken auszudrücken, ist es leicht, damit Missbrauch zu treiben, also zu groß und zu ausdrucksfähig zu werden.

Eine Sprache wie Go ist quasi diametral das Gegenteil zu Scala. Programmierer haben dabei im Kern das, was es gibt, und sonst kann man gar nichts machen. Man sollte mit den wenigen generischen Typen programmieren – und fertig. Scala ist das exakte Gegenteil. In der Sprache ist sehr wenig, aber man kann alles über Bibliotheken ausdrücken. Man muss daher an die Library-Designer appellieren, dass sie das nicht missbrauchen sollen.

Das Tempo bewusst zurückgenommen

heise Developer: Man hat so das Gefühl, dass nach den vielen Neuerungen am Anfang das Entwicklungstempo bei Scala stark gedrosselt ist. Heißt das, dass jetzt alles Wesentliche in der Sprache enthalten ist? Provokativ gefragt: Ist Scala trotzdem noch zeitgemäß?

Odersky: Wenn man die Sprache selbst betrachtet, stimmt das - da gab es in den letzten fünf Jahren weniger Entwicklungen als davor. Man könnte jetzt auch sagen: Scala hat gewonnen, denn die Features, die Scala früher schon hatte, haben jetzt alle anderen Sprachen auch. Closures beispielsweise, auch wenn Scala nicht die erste war, die das hatte. Auch Orientierung auf Expressions. Viele Sachen, bei denen Scala Pionier war, sind heute Standard.

Wenn man wirklich funktional, immutable (unveränderbar) sein will, dann hat das Einflüsse auf viele andere Sachen. Beispielsweise braucht man auch eine gute Collections-Bibliothek, die ebenfalls immutable ist. Die von Java ist ja per Default mutable und taugt nicht zur täglichen Arbeit. Scala ist durchaus noch ein Vorreiter.

In den letzten Jahren haben wir das Tempo bewusst zurückgenommen. Viele Entwickler haben sich Stabilität für ihre Codebasen gewünscht. Deshalb haben wir gesagt: Wir machen in der Hauptlinie von Scala eine Pause, und die Neuentwicklung geschieht im Dotty-Projekt, das der nächste große Schritt von Scala sein wird. Es handelt sich nur um einen Projektnamen: DOT steht für "Dependent Object Types". Auf der Basis haben wir eine Neuentwicklung des Compilers gemacht und teilweise auch in der Sprache aufgeräumt. Es wird mehrere Neuerungen geben, die die Sprache auch leichter benutzbar machen sollen.

heise Developer: Wie sieht denn der Zeitrahmen aus für die nächste Sprachversion auf Basis von Dotty.

Odersky: Von Dotty existieren Releases als Developer-Previews und es gibt schon einige Entwickler, die das benutzen. Wir planen, die endgültige Version als Scala 3.0 im Jahr 2019 zu veröffentlichen.

heise Developer: Freut es dich, dass andere Sprachen viel von Scala übernommen haben, oder siehst du das Nachmachen als Konkurrenz.

Odersky: Na ja, ich bin da eigentlich ziemlich gelassen. Das Wichtige sind die Konzepte, nicht ob es diese oder jene Sprache ist. Für mich ist es wichtig, wie wir objektorientiertes Programmieren für die Modularität und funktionales Programmieren für die Eleganz und die Sicherheit kombinieren können. Und wenn andere Sprachen das nachmachen, dann umso besser. Scala 3 wird selbst einige neue Konzepte einführen, und hoffentlich werden andere Sprachen da auch wieder irgendwann nachziehen.

Scala ist nicht schwer zu lernen

Martin Odersky ist vor allem als Erfinder von Scala bekannt. Davor hat er neben der Programmiersprache Pizza unter anderem zwei wichtige Java-Compiler geschrieben: Den für Borland und den offiziellen Java-Compiler javac. Odersky ist der Gründer des Unternehmens Lightbend und lehrt an der Schweizerischen École Polytechnique Fédérale de Lausanne (EPFL) als Professor für Programmiermethoden.

heise Developer: Dennoch hat Scala nach wie vor den Ruf, es sei schwer zu erlernen. Was meinst du dazu?

Odersky: Von meiner Warte aus stimmt das absolut nicht. Die erste Erkenntnis für mich war, dass vor allem Jugendliche gut mit der Sprache zurechtkommen: Wenn man sie vor einen Scala-Editor setzt, setzen sie die Projekte sehr einfach um – viel einfacher als in Java. Es gibt kein public, static, void, main – die ganzen Konventionen, die man erst mal lernen musst.

Da stellt sich natürlich die Frage, woher der Ruf kommt. Ein Problem könnte sein: Weil die Sprache so ausdrucksmächtig ist, gibt eine breite Spanne von möglichen Programmierstilen, die teilweise auch Konzepte anderer Sprachen adaptieren. Beispielsweise sind viele Konzepte, die ursprünglich in der funktionalen Sprache Haskell entwickelt wurden, mittlerweile auch als Scala Bibliotheken verfügbar, die oft mit viel Enthusiasmus beworben werden. Die Haskell-Portierung ist alles andere als einfach, weil Scala nun mal nicht Haskell ist. Es ist teilweise erstaunlich, dass das überhaupt in Scala funktioniert. Wenn man das Vorgehen aber als Einstieg in Scala vertritt, dann kann es schon komplex werden.

Das Problem ist aber vielleicht noch allgemeiner. Scala unterstützt eingebettete "Domain Specific Languages" (DSL) sehr gut, weil es so flexibel ist. Das kann aber zum Problem werden, wenn die eingebetteten DSLs selber kompliziert und schwer zu benutzen sind. Unter anderem ist das Scala-Build-Tool eine DSL, die zwar sehr mächtig, aber nicht einfach ist. Da müssen wir etwas Einfacheres hinbekommen.

Eine interessante Analogie ist, dass Scala in demselben Sinn komplex ist wie das Spiel Go. Das heisst: Die Grundregeln von Go sind einfach, aber sie können Stellungen und Spiele von ausserordentlicher Komplexität ausdrücken. Die Analogie ist nicht perfekt, da die Syntax und Regeln von Scala natürlich umfangreicher sind als die Regeln von Go. Aber im Vergleich zu anderen statisch typisierten Sprachen ist Scala relativ kompakt. Der Vergleich geht also schon in die richtige Richtung.

heise Developer: Hat Scala im Bereich Machine Learning (ML) Vorteile beispielsweise im Zusammenspiel mit Spark, das in Scala geschrieben ist und es als Abfragesprache unterstützt. Im Bereich ML trifft man ja primär auf Python.

Odersky: Die Abwägung ist folgende: Python ist sehr etabliert, und es gibt mehr Programmierer, die die Sprache beherrschen als bei Scala. Scala hat aber mehrere Vorteile. Da die Sprache funktional ist, vereinfacht sie das Modellieren. Der zweite Punkt sind die Typen – statisch gegen dynamisch. Scala ist statisch typisiert, was vor allem bei der Wiederverwendung stark hilft. Ein dritter Vorteil ist, dass viele der Frameworks wie Spark oder Flink zum grossen Teil in Scala geschrieben sind, sodass die Integration besser ist.

heise Developer: Noch mal zurück zu den anderen Programmiersprachen. Gibt es eine, die für dich aktuell besonders interessant ist?

Odersky: Da sind einmal die Sprachen, die Scala ähneln, und wie schon erwähnt gibt es immer mehr davon. Kotlin beispielsweise übernimmt viele Scala-Konzepte, wenngleich es einige der mächtigeren auslässt, darunter Higher-kinded Types oder Implicits.

Dann ist es natürlich auch interessant, Sprachen zu studieren, die manches grundsätzlich anders machen. Unter dem Aspekt würde ich zwei Sprachen nennen. Eine wäre Rust, um zu sagen, "OK, was macht man, wenn man keinen Garbage Collector hat?" Das ist ein interessantes Problem. Und bei den betroffenen Sprachen ist Rust wohl die mit dem ausgefeiltesten Typsystem. Das Zweite wäre eine Sprache, die mit den Typen für die Programmverifikation noch viel weiter geht als Scala. Idris oder Agda sind beispielsweise Sprachen, in denen man auch Programmbeweise mit dem Typsystem machen kann. Mich würde interessieren, wie praktikabel das ist und wie weit man damit kommt.

Imitation is the best form of flattery

heise Developer:Nimmst du Kotlin nicht übel, dass sie so viel von Scala übernommen haben?

Odersky: Nein, ganz und gar nicht. "Imitation is the best form of flattery". Im Prinzip ist das eine Validierung, dass das, was wir gemacht haben, Sinn ergibt. Sonst hätten es andere nicht übernommen. Da Kotlin recht ähnlich zu Scala ist, aber konzeptionell zwischen Java und Scala angesiedelt ist, könnte es auch helfen, Hemmungen von Java-Programmierern gegenüber Scala abzubauen.

heise Developer: Gibt es Konzepte, die du aus anderen Sprachen nach Scala holen möchtest?

Odersky: Ja, aber anders. Manche von den sehr fortgeschrittenen funktionalen Sprachen sind rein funktionale Sprachen – das bedeutet, dass man statisch durch die Typen unterscheiden kann, ob eine Berechnung eine mathematische Funktion ist, also keine Seiteneffekte hat, oder ob sie eine Prozedur ist, die ein Resultat zurückgibt, aber eben Seiteneffekte haben kann. Das ist oft wichtig, wenn es um hohe Zuverlässigkeit und Robustheit geht. Haskell hat beispielsweise I/O-Monaden um das auszudrücken. In Scala wollen wir auch dahin kommen, dass wir statisch ausdrücken können, ob etwas funktional ist oder nicht, wollen aber keine Monaden dafür benutzen. Wir denken, dass wir etwas dafür gefunden haben, müssen jedoch erst noch ausprobieren, ob das klappt.

Drei Themenbereiche, in denen Scala glänzt

heise Developer: Zum Abschluss: Welche Entwickler, die noch keine Berührungspunkte zu Scala haben, sollten sich die Programmiersprache anschauen? Also für welche Themenbereiche empfiehlst du Scala besonders.

Odersky: Da will ich drei Bereiche herausgreifen: Erstens den Bereich Data Science, Big Data und Machine Learning. Da ist Scala schon recht groß, aber immer noch nicht so etabliert wie beispielsweise Python.

Scala Days Europe Martin Odersky wird die Scala Days Europe mit seiner Keynote eröffnen. Die Fachkonferenz rund um Scala findet vom 14. bis 17. Mai in Berlin statt. Veranstalter sind Lightbend, heise Developer und dpunkt.verlag.

Zweitens auf jeden Fall Reactive, im Sinne von Distributed Programming, Programmieren für die Cloud, wo reaktive Programmierung der Alltag ist. Da gibt es Scala-Bibliotheken mit sehr durchdachten, erprobten und bewährten Funktionen im Vergleich zu dem, was andere Systeme haben. Ich hoffe, dass Programmierer beispielsweise über Akka und Play zu Scala finden.

Und das Dritte, wo Scala eher ein Außenseiter ist: Scala.js, also Scala auf JavaScript. Das ist eine enorm fähige Implementierung, die aber derzeit hauptsächlich von Scala-Entwicklern genutzt wird, die aufs Frontend wollen. Aber ich denke, Scala.js ist auch etwas, das sich andere Leute, die von JavaScript kommen, anschauen könnten. (rme)



Die Fragen stellte Rainald Menge-Sonnentag.