28.09.2009, 16:07 Uhr

F# - Übergang zur funktionalen Programmierung

Mit F# bereichert Microsoft die .NET-Sprachenfamilie um ein neues Mitglied. Bei VS 2008 muss sie noch nachträglich installiert werden, beim kommenden VS 2010 wird sie von Anfang an fest dabei sein. Das F steht für ,,Funktional", das # deutet die sprachliche Nähe zu C# an. Als Hybridsprache soll F# die Welt der funktionalen Programmierung mit der traditionellen Welt der imperativen (prozeduralen) Sprachen vereinigen. Vorschusslorbeeren hat F# bereits reichlich erhalten.
Nach objektorientiert und dynamisch scheint funktional das neue Modewort der Programmiersprachenszene zu sein. Tatsächlich wäre ,,Wiederentdeckung" die etwas bessere Umschreibung, denn die Idee, Programmschritte ausschließlich durch Funktionen zu beschreiben, die nicht gezielt aufgerufen, sondern bei der Programmausführung angewendet werden ist natürlich nicht neu. Die Programmiersprache LISP, die bereits aus den 50er Jahren des letzten Jahrhunderts stammt, kann als die Ur-Mutter der funktionalen Sprachen betrachtet werden. In den 90er Jahren wurde das Konzept von Programmiersprachen wie Erlang (die vom Telekommunikationsunternehmen Ericsson sehr erfolgreich eingesetzt wird) und Haskell wieder aufgegriffen (als das direkte Vorbild für die Syntax von F# gilt die Sprache Ocaml). Auch wenn es von Haskell bereits sehr früh eine .NET-Implementierung gab, erst mit dem F#-Projekt, das bei Microsoft Research im "Forschungslabor" seinen Anfang nahm, gelangte die funktionale Programmierung auf den Radarschirm vieler Entwickler.Funktional = effektiver?Die zentrale Frage ist natürlich, welche Vorteile F# gegen über C# bringt. Funktionale Programmierung erscheint zunächst deutlich anspruchsvoller als die traditionelle imperative Programmierung, wo ein Computerprogramm aus einer Folge von Schritten besteht, die der Reihe nach abgearbeitet werden. Diese Herangehensweise wird seit Jahrzehnten angewendet und erschließt sich auch ohne, dass man einen mathematischen Background benötigt.Bei der funktionalen Programmierung wird ein Problem dadurch gelöst, dass es durch Funktionen beschrieben wird, die sehr viel mehr mathematischen Funktionen ähneln, als es bei einer Funktion in einer imperativen Sprache wie C# der Fall ist (Listing 1, das eine Funktion zeigt, die die Quadratzahlen der Zahlen von 1 bis 10 ausgibt, gibt davon einen kleinen Vorgeschmack). Aus diesem Ansatz resultieren gleich mehrere Vorteile: 1. Der Programmcode wird deutlich kürzer und kompakter. 2. Der Programmablauf wird bezüglich seiner Korrektheit beweisbar (was bei imperativen Sprachen bezüglich ihrer ,,unendlichen" Fülle an Variationsmöglichkeiten, die durch Typenvielfalt und Seiteneffekte bedingt werden, im Allgemeinen nicht möglich ist). Klar, dass sich F# damit für Einsatzbereiche empfiehlt, in denen an die Sicherheit sehr hohe Ansprüche gestellt wird.3. Ein funktionales Programm lässt sich deutlich leichter parallelisieren als ein Programm, das in einer nicht funktionalen Sprache geschrieben ist. Es ist vor allem der letzte Aspekt, der F# gegenüber C# attraktiv macht. Listing 1: Ein ,,Hallo, Welt"-Programm für F# - es gibt die Quadratzahlen auslet Quadrat x = x * xlet Zahlen = [1 .. 10]let QuadratZahlen = List.map Quadrat Zahlenprintfn "N^2 = %A"QuadratZahlenopen SystemConsole.ReadKey(true) F# - ein erster ÜberblickAls Hybridsprache besitzt F# im Vergleich zu C# ein paar vertraute Elemente, auch wenn ein typisches F#-Programm für erfahrene C#-Entwickler am Anfang nur sehr schwer lesbar sein dürfte. Die größte Gemeinsamkeit ist natürlich, dass beide Sprachen auf dem .NET Framework basieren und F# dessen Möglichkeiten im selben Umfang anbietet wie C#. Wie C# ist auch F# eine typenstrenge Sprache, wenngleich explizite Typen aufgrund von Typinferenz nur selten im Quellcode auftauchen. Wie bei C# kommt es auf die Groß-/Kleinschreibung an. Der größte ,,Unterschied" besteht darin, dass Funktionen bei F# lediglich ein weiterer Datentyp sind. Einlet add x y = x + y definiert einen sog. Value, der für eine einfache Operation steht. Der Typ der Parameter wird vom Compiler aus dem +-Zeichen ,,erraten" (für bestimmte Typen gibt es einen Default-Typ, so dass der Compiler über keine hellseherischen Fähigkeiten verfügen muss). add besitzt als Typ eine Funktion im sog. Currying-Format (unter Currying versteht man das Aufteilen einer Funktion in eine Reihe von Teilfunktionen, so dass jede dieser Teilfunktionen mit genau einem Parameter aufgerufen werden kann). Man übergibt einen int als Parameter und bekommt eine Funktion zurück, die ebenfalls einen int als Parameter erwartet. Der folgende Befehl definiert eine Funktion, die eine Quadratzahl bildet: let Quadrat x = x * x Der nächste Befehl entsprechend eine Multiplikationsfunktion: let Mul x y = x * y Der nächste Befehl kombiniert beide Funktionen in einem Ausdruck und gibt das Ergebnis aus:let Res = Mul (Quadrat 10) 20 Die runden Klammern dienen bei F#nicht zur Parameterübergabe, sondern legen die Reihenfolge fest.Die Ausgabe erfolgt relativ vertraut:open System Console.WriteLine (Res) Doch so einfach ist F# natürlich nur, wenn es im Stile eines "Hallo, Welt"-Programms um die allereinfachsten Konstrukte geht. Seine Stärken entfaltet F# immer dann, wenn mehrere Teilschritte in einem Schritt ausgeführt werden sollen. Listing 1 geht einen Schritt weiter. Es definiert über den let-Befehl drei Funktionen, die der Reihe nach angewendet werden. Besonders interessant ist die map-Methode des List-Objekts, da sie die Funktion Zahlen auf die Funktion Quadrat ,,mapt" und dadurch dafür sorgt, dass die Zahlen von 1 bis 10 quadriert werden. Statt eine Schleife programmieren zu müssen, wird eine Funktion definiert und einer anderen Funktion als Argument übergeben, so dass durch das Abarbeiten der Funktion ein Ergebnis resultiert, das ausgegeben wird.Ist dieses Umsetzen von imperativ nach funktional noch halbwegs nachvollziehbar, sieht es bei dem Beispiel in Listing 2 zunächst sicher etwas anders aus, das durch den rekursiven Aufruf der Funktion fib Fibonacci-Zahlen bildet (dabei wird die nächste Zahl der Folge aus der Summe ihrer beiden Vorgänger gebildet). Bei näherer Betrachtung ergeben sich auch in diesem Fall wieder vertraute Elemente, etwa mit dem match-Befehl, der eine Fallunterscheidung durchführt und je nach Wert von x eine andere Funktion aufruft. Listing 2: Die Fibonacci-Zahlen in F#let rec fib x = match x with| x when x <= 0 -> failwith "Aufruf mit einer Zahl > 0." | 1 -> 1 | 2 -> 1| x -> fib (x - 1) + fib (x - 2) Abbildung 1: Visual Studio 2010 bietet Syntax-Highlighting für F# F# in Visual StudioF# gibt es sowohl für VS 2008 als auch als Teil der Beta1 bei VS 2010 (hier wird z.B. ein Syntax-Highlighting geboten). Ansonsten ist alles eher unspektakulär. Es gibt lediglich zwei Vorlagen. Es gibt weder einen Windows Forms- noch einen WPF-Designer, wobei ,,Oberflächenprogrammierung" auch nicht die Absicht von F# ist. Mit F# Interactive gibt es auch einen F#-Interpreter, der für die ersten Gehversuche gut geeignet ist (Befehlszeilen werden hier mit einem ;; abgeschlossen). Abbildung 2: VS 2010 bietet Vorlagen für F#-Projekte F# lernenMicrosoft ist natürlich viel daran gelegen, dass F# möglichst schnell die kritische Masse erreicht, die für eine Programmiersprache erforderlich ist sich zu etablieren. Es gibt daher eine große Auswahl an Tutorials und Material, das den Einstieg erleichtern soll. Ausgangspunkt im Web natürlich das F# Developer Center auf MSDN [1]. Hier findet man ,,jede Menge" Material, das die Einarbeitung in die neue Sprache erleichtern soll. Empfehlenswert sind die zahlreichen ,,How do I?"-Videoclips, in denen eine bestimmte Thematik oder Problemstellung behandelt wird. Eine empfehlenswerte Community Site ist [2]. Speziell an Anfänger richtet sich [3]. F# als echte Konkurrenz für C#?Urteilt man nach der Anzahl der Blogs, Community Sites und Postings in den Newsgroups hat sich F# als Alternative zu C# innerhalb kürzester Zeit etabliert und dürfte für Inhouse-Projekte bei Unternehmen aus dem technischen Bereich bereits intensiv genutzt werden. Seine Stärke ist der Umstand, dass es sich um eine hybride Sprache handelt, die das Beste zweier Welten vereint, und sie eine zu 100% kompatible .NET-Sprache ist. Die wichtigste Aussage ist, dass mit F# grundsätzlich alles möglich ist, was auch in C# möglich ist. F# ist auch ein ,,Testbett" für Sprachfeatures, die in kommende Version von C# (und VB.NET) Einzug halten werden. So basiert LINQ bekanntlich auf Konzepten, die aus dem Bereich der funktionalen Programmierung stammen. .NET 4.0 wird wiederum mit Lazy, Tuples und BigInt Anleihen aus diesem Segment entnehmen.Mit dem kommenden VS 2010 wird F# der breiten Masse der Entwickler zur Verfügung gestellt. Ob es sich wirklich als ,,dritte Kraft" neben C# und VB.NET etablieren kann, werden die kommenden 2-3 Jahre zeigen. Die Chancen stehen dafür sehr gut.Links[1] http://msdn.microsoft.com/en-us/fsharp/default.aspx[2] http://cs.hubfs.net/[3] http://fsharp.net Peter Monadiemi


Das könnte Sie auch interessieren