Sent from Hauptstadt!

ein Blog für den geneigten Leser

Scala: Funktionale Programmierung

Tags: ,

Kategorie Software Engineering | 8 Kommentare »

Letztes Jahr hatte ich mir mal Ruby on Rails näher angeschaut – und war enttäuscht. Nach all dem Hype hätte ich mir mehr erwartet. Nüchtern betrachtet ist es aber nichts weiter als eine etwas modernisierte Skriptsprache mit einem Framework drumherum. Dieses Jahr habe ich einen Blick auf Scala bzw. funktionale Programmiersprachen geworfen – und bin begeistert. Ich glaube, funktionale Programmierung wird das nächste große Ding!

Vereinfachend gesagt (ja, sehr vereinfachend, ich weiß!), kennt die Informatik lediglich 3 Programmierparadigmas:

  1. Imperative Sprachen, also if-then-else, Schleifen, Methoden, usw., zum Beispiel in Pascal oder C.
  2. Objektorientierte Sprachen, also Vererbung, Klassen, Polymorphie, usw., zum Beispiel in C++, Java und C#.
  3. Funktionale Sprachen, also Funktionen höherer Ordnung, Lambda-Kalkül, Listenmanipulation, usw., zum Beispiel in Lisp, F# und Scala.

In der breiten Masse werden heute meist Programmiersprachen wie Java, C# oder PHP verwendet, die sowohl objektorientiert als auch imperativ sind. Der Übergang zwischen imperativ und objektorientiert ist fließend, denn schon in C findet man mit struct die Möglichkeit zur Definition eines abstrakten Datentyps, eine Vorform des Klassenbegriffs. Jeder Informatik Bachelor Student dürfte heute mit mindestens einem objektorientierten Vertreter in seiner Ausbildung konfrontiert werden, was die enorme Verbreitung sicher auch erklärt.

Funktionale Sprachen, obwohl genauso lange bekannt, sind zumindest in der Praxis weniger häufig vertreten. Doch warum? Aus meiner Sicht sind funktionale Sprachen zunächst schwerer zu verstehen. Imperative Programmierung kann man gut an Kochrezepten erläutern und auch für Objektorientierung finden sich einfache Beispiele wie der Bau unterschiedlicher Autos auf Basis einer einheitlichen Plattform. Neben der leichteren Erlernbarkeit von objektorierntierten Sprachen dürfte auch Faulheit eine Rolle spielen. Warum sollte man ein abstrakteres Konzept lernen und nutzen, wenn man bisher auch mit einfacheren Konzepten ans Ziel kam? Abgesehen von wissenschaftlichen Aufgabenstellungen kann man heute die meisten Probleme gut mit imperativen und objektorientierten Programmiersprachen lösen.

Inzwischen gibt es aber zwei Trends, die die Aufgabenstellungen verändern und nach eleganteren Lösungen verlangen:

  1. Big Data – Die Analyse von großen Datenmengen (in Echtzeit) ist nicht mehr nur ein Problem von Wissenschaftlern und Finanzjongleuren, sondern tritt zunehmend in jeder Standardsoftware auf. Man überlege nur, was Amazon alles machen muss, um seinen Kunden sinnvolle Empfehlungen zu alternativen Artikeln zu bieten! Das lässt sich kaum noch mit ein paar Schleifen und if-then-else lösen.
  2. CPUs mit vielen Kernen – Seit einigen Jahren schon werden Prozessoren nicht mehr schneller, sondern es werden die Anzahl der Rechenkerne erhöht. Komplexe Berechnungen müssen deshalb so implementiert werden, dass sie verteilt auf mehreren Prozessoren laufen.

Funktionale Programmiersprachen versprechen Antworten auf diese neuen Herausforderungen. So haben sie meist ausgefeilte Listenimplementierungen, die den Map-Reduce Algorithmus unterstützen (die genaue Idee dahinter erkläre ich in einem späteren Artikel). Dadurch muss nicht mehr ein einzelner Knoten die gesamten Daten analysieren, sondern man kann die Berechnung über eine Vielzahl von Knoten verteilen. Durch die Verwendung von Funktionen höherer Ordnung können in einem Mehrkernsystem Daten plus auf den Daten auszuführende Funktionen über eine Vielzahl von CPU Kernen verteilt werden.

Natürlich bieten auch objektorientierte Programmiersprachen entsprechende Konstrukte bzw. werden um diese erweitert. So werden in Java 8 die so genannten Lamba Ausdrücke eingeführt. Und nichts spricht dagegen, die Listenbibliothek von Java um Ausrücke für den Map-Reduce Algorithmus zu erweitern. Kann also sein, dass man in ein paar Jahren gar nicht mehr deutlich zwischen funktionalen und nichtfunktionalen Sprachen unterscheiden kann, genauso wie schon heute die populären Sprachen eine Mischung aus imperativem und objektorientiertem Programmierparadigma sind.

Trotzdem macht es Sinn, sich schon jetzt in eine funktionale Programmiersprache einzuarbeiten, die bereits solch ein Mischling ist. Hier bietet sich Scala an, …:

In den letzten Wochen habe ich schon kleinere Experimente mit Scala gewagt und werde in den nächsten Artikeln davon berichten. Ich bin natürlich gespannt, ob der geneigte Leser in seiner täglichen Arbeit schon über funktionale Programmierung gestolpert ist oder wurde :-)

8 Kommentare to “Scala: Funktionale Programmierung”

  1. Ach hör mir bloss mit funkionaler Programmierung auf. Seit zwei Jahren nun schlagen wir uns damit rum :-).

    Allerdings verwenden wir keine explizite funktionale Programmiersprache, sondern programmieren in C# unter Verwendung eines funktionalen Paradigmas. Bestimmte Vorteile welche funkt. Compiler bieten, haben wir dann natürlich nicht.

    Aber auch dieser reine Paradigmawechsel war schon schwer. Und Mist kann man auch in funktionalen Sprachen schreiben :-).

    Auch hier kann ich wieder auf Danisch verweisen:
    Kritik an der Programmiersprache Scala

  2. Sebastian sagt:

    @Martin:

    Interessant! Ihr macht ja C#, wenn ich mich recht entsinne. Bedeutet bei euch dann funktional zunächst einmal, dass übergebene Funktionsparameter unveränderbar sind oder setzt ihr noch andere Konzepte ein?

  3. Christian Müller sagt:

    Interessanterweise höre ich seit Jahren dieselbe Argumentation, warum die FP the next big thing sein wird. Und irgendwie passiert von Jahr zu Jahr viel zu wenig. Ok, dass Java8 endlich die Lambdas bekommt, das ist auf jeden Fall ein Beweis dafür, dass die FP (oder eher nur das Paradigma) sich immer mehr etabliert. Aber irgendwie waren und bleiben reine funktionale Programmiersprachen eher esoterische Tools von Wissenschaftlern. Ich bin mittlerweile skeptisch, dass die FP sich durchsetzen wird. Wie du schon gesagt hast, abstrakt zu denken fällt vielen schwer ;)

    Und noch was zu Scala. Ich habe mich mit Scala befasst. Und so wie begeistert ich am Anfang war, so enttäuscht war ich von Scala nach einer Weile. Scala ist eine der verwirrendsten Sprachen, die ich je gesehen habe. Wenn es dich interessiert, habe ich meine Notizen von damals hier veröffentlicht: http://www.notehub.org/2013/4/5/why-i-wont-use-scala

  4. Sebastian sagt:

    @Christian:

    Tja, ob sich nun reine funktionale Sprachen durchsetzen werden, ist tatsächlich zweifelhaft. Aber sie sorgen zumindest für den nötigen Innovationsdruck bei den etablierten Sprachen. Andererseits bedeutet dies auch, dass wir noch 5 Jahre und mehr warten müssen, bis die Konstrukte in der Praxis ankommen, denn die meisten Firmen werden wohl, wenn überhaupt, gerade erst den Sprung von Java 6 auf Java 7 machen.

    Deine Einschätzung zu Scala teile ich größtenteils. Ich habe auch das Gefühl, dass hier Kürze des Codes wichtiger als gute Lesbarkeit war. Auch scheinen sich bei der Sprachdefinition ein paar Mathematiker verwirklicht zu haben, was aber den Durchschnittsprogrammierer schnell überfordern dürfte. Aber vielleicht kann man die gröbsten Probleme auch durch Code Konventionen umgehen?

    Bleibt also zu hoffen, dass sich entweder die etablierten Sprachen schneller bewegen oder die neuen coolen Kids erwachsen werden ;-)

  5. Christian Müller sagt:

    Was ich Dir ausnahmslos empfehlen würde ist Clojure. Unbemerkt für mich selbst ist bereits ein ganzes Jahr vergangen, seit ich für mich die Lisp-Welt entdeckt habe. Im Gegensatz zu Scala, war ich am Anfang sehr skeptisch gegenüber Clojure (keine Klassen — waaas?). Aber diese rein funktionale Sprache hat mich durch ihre Konsistenz, Einfachheit und Expressivität (alles gleichzeitig!) restlos überzeugt.

    Mein Interesse an Lisp geht sogar so weit, dass ich jetzt ein Lisp-Dialekt in JS implementiere (und überall „Lisp“ in der Spalte „Konfession“ angebe :-) — kleiner Scherz).

  6. Sebastian sagt:

    Ja, ich hatte gesehen, dass du viel in dieser Richtung postest und ja auch dein NoteHub damit geschrieben hast. Ich persönlich bevorzuge aber statische Sprachen gegenüber Skriptsprachen, wenn irgendwie möglich, da die Entwicklungsumgebungen meist ausgereifter sind. Von daher sah Scala erst mal nach einem sehr guten Ansatz für mich aus. Mal schauen…

  7. Christian Müller sagt:

    Das stimmt allerdings. Strenge Typisierung und intelligente IDEs ist wohl das, was ich in Lisp am meisten vermisse. Aber Scala’s Unterstützung steckte zumindest mal vor einem Jahr auch noch ziemlich in den Kinderschuhen… Ansonsten, wenn man gute Unit-Tests schreibt (was man eh immer machen muss), wird die dynamische Typisierung zu einem mächtigen Feature. Denn die Dynamik von Lisp führt zu sehr kurzem Code. Kurzer Code bedeutet Verständlichkeit, Wartbarkeit und weniger Fehler.

  8. Sebastian sagt:

    Also ich nutze für Scala momentan IntelliJ Version 12 mit dem Scala Plugin und das ist schon ziemlich gut. Aber natürlich ist die Unterstützung noch nicht mit ausgereiften Java IDEs vergleichbar.

Schreiben sie ein Kommentar