Bücherempfehlungen: Funktionale Programmierung

20 Nov

Es gibt diverse Arten von Programmiersprachen. Heute wird viel von imperativen Programmiersprachen gebrauch gemacht. Sie sagen, welche Schritte etwas getan werden soll. Ein typischer Vertreter dieser Kategorie ist zum Beispiel Java (obwohl auch hier langsam Funktionale Elemente Einzug halten). Ein anderer, seit 1930 in der Mathematik bekannter Ansatz konzentriert sich nicht so sehr auf eine Schrittweise Anleitung, sondern darauf, wie die Funktionen kombiniert werden können, sodass neue Funktionalität entsteht. Ein häufig zitiertes, wenn auch längliches Paper mit dem Titel „Why Functional Programming Matters“ von John Hughes stellt die Vorteile sehr schön zusammen.

Ein paar typische funktionale Elemente wirken sehr praktisch. Hier ein Beispiel zur Quadrierung alle Elemente einer Liste in Java:

int[] squared(int[] list) {
    int[] result = new int[list.length];
    for (int i = 0; i < list.length; ++i) {
        result[i] = list[i] * list[i];
    }
    return result;
}

In Scala geht dies in einer Zeile:

def squared(list:List[Int]) = list.map((x) => x * x)

Die Map-Funktion übernimmt als Parameter eine weitere Funktion. Diese nimmt einen Parameter x entgegen, und gibt x * x als Resultat zurück. „Map“ ist hier eine Funktion höherer Ordnung. Dass sind solche Funktionen, die als Parameter weitere Funktionen entgegennehmen. Viele andere Probleme werden rekursiv ausformuliert.

Ich möchte nicht behaupten, dass Funktionale Programmierung ein Allheilmittel ist. Insbesondere ist es eine nicht zu verachtende Umgewöhnung. Allerdings halten die Konzepte erneut Einzug in die Programmierung (sei es Javascript, Ruby, die .NET-Welt, oder eben Java), und es kann nicht schaden, zumindest ein paar Ideen zu kennen.

Doch wie fängt man an? Ich möchte an dieser Stelle ein paar Bücher vorstellen, die vor allem die Vorzüge einer Mischung der Konzepte in den Vordergrund stellen, und so den Einstieg erleichtern. Sinnvoll sind diese Bücher in erster Linie für Leute, die schon Erfahrung im Programmieren haben.

hopEine der ersten Programmiersprachen, die ich lernte, war Perl. Ich verteidige diese Sprache heute noch sehr gerne, denn ich habe stets das Gefühl, dass diejenigen, die ihr vorwerfen, unleserlich zu sein, nie ernsthaft mit ihr arbeiteten. Im Gegenteil: ihre Syntax erlaubt es, sehr leserlichen Code zu schreiben, von eigenen DSLs ganz zu schreigen (zugegeben, die Objektorientierung wurde auf eine einzigartige Art und Weise eingeführt). Perl erlaubt es, Funktionsreferenzen als Parameter zu verwenden. Damit es es möglich, Funktionen effizient zu komponieren. Bekannte Beispiele von Perl selbst sind die Funktionen map und grep. Das Buch „Higher Order Perl“ von Mark Jason Dominus greift diesen Ansatz auf und zeigt elegante Lösungen für zahlreiche Probleme. Dabei führt er am Rande in das Verständnis funktionale Programmierung ein und behandelt sie als Selbstverständlichkeit. Die Quellcodes sind auf Perl beschränkt, die Konzepte lassen sich aber an vielen Stellen problemlos in andere Programmiersprachen übertragen – was grundsätzlich empfehlenswert ist. Auf der verlinkten Webseite gibt es das Buch als kostenloses PDF.  Wer Perl kennt wird mit diesem Buch viel Spaß haben!

pisScala ist eine verhältnismäßig junge Sprache von Martin Odersky für die Java Virtual Machine (JVM). Er hat zuvor Generics in Java eingeführt, die JVM ist ihm also alles andere als neu. Scala ist kompatibel zu Java, es ist also möglich, Java-Libraries in Scala weiterzuverwenden – ein großer Pluspunkt. Doch was unterscheided Java und Scala? Scala micht diverse Paradigmen, und erlaubt dadurch unter anderem Funktionale Programmierung. Die Schattenseite ist, dass Scala als das „C++ unter den JVM-Sprachen gilt“. Nichtsdestotrotz finde ich die Sprache packend: Sie bietet eine geniale Eleganz dabei, Probleme zu formulieren. Sie führt Konzepte wie Pattern Matching auf Datenstrukturen ein, implementiert das Actor-Pattern und bietet eine gut verständliche Variante von Mehrfachvererbung (die sogenannten Traits). Eine gute Einführung in die Sprache bietet das Buch „Programming in Scala“ von Odersky et al. Scala ist keine rein funktionale Sprache, Fans der Objektorientierung werden ebenfalls bedient. Wer Java kennt wird wenig Probleme haben, Scala zu lernen. Die neu umgesetzten, aus anderen Programmiersprachen bekannten, Konzepte machen viel Spaß. Meines Erachtens eine aufstrebende Sprache mit viel Zukunft. Das „Stairwaybook“ nimmt den Leser mit auf eine Reise mit vielen praktischen Beispielen sowie tiefen Einblicken in die Sprache und bereitete zumindest mir beim Lesen viel Freude.

Zuletzt möchte ich noch auf eine andere Sprachfamilie aufmerksam machen. Im Vergleich zu den obigen beiden Empfehlungen gibt es natürlich auch eine ganze Reihe Programmiersprachen, die – wenn überhaupt – eine weniger deutliche Brücke zur objektorientierten Programmierung schlagen. Zu diesen Sprachen gehören unter anderem Clojure, F#, Haskel und Lisp. Auch diese Sprachen haben ihre Vorzüge. Beispielsweise sind Lisp-Programme selbst kein String mit Anweistungen – das Programm selbst ist eine Datenstruktur aus Listen. Und als solche lässt es sich sogar manipulieren. Der Einstieg in diese Sprachen ist allerdings etwas ungewohnt und erfordert Experimente und Geduld. Aber keine Angst, es lohnt sich . Es gibt zahlreiche Einführungen zu den Themen. Exemplarisch sei für F# aus dem Hause Microsoft auf ActiveVB und Wikibooks verwiesen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert