26.01.2009, 16:00 Uhr
Vorschau auf Visual Basic 10 – auf dem Weg zur funktionalen Programmierung
Vorschau auf Visual Basic 10 - auf dem Weg zur funktionalen Programmierung Mit der kommenden Version 10 dürfen sich Visual Basic-Programmierer unter anderem auf Verbesserungen beim Umgang mit Funktionsausdrücken, Collections und Properties freuen. Endlich wird es möglich sein, im Prinzip beliebige Methoden parallel ausführen und damit die Fähigkeiten einer MultiCore-CPU zu nutzen, wenngleich dies streng genommen eine Eigenschaft des kommenden .NET Framework 4.0 ist, zu dem VB10 und C# 4.0 gehören.
Auf grosse Sensationen dürfen Programmiersprachenfans für die nächste und vielleicht auch übernächste Version nicht hoffen, der Trend geht in Redmond zur Zeit in Richtung Detailverbesserung und Gleichschritt bei den Sprachfeatures (u.a. wird C# mit der Version 4.0 optionale Parameter und "späte Bindung" erhalten. Zwei Features, die vor allem bei der "Office-Programmierung" nützlich sind, die aber nur bei wenigen C#-Entwicklern oben auf der Wunschliste gestanden haben dürften). Nachdem mit LINQ bei der letzten Visual Basic-Version ein großer Coup gelandet wurde, geht es mit der nächsten Version in erster Linie um Detailverbesserungen. Das bedeutet aber nicht, dass es keine Meilensteine geben wird. Mit VB 10 und C# 4.0 werden die Compiler die Parallelverarbeitung des .NET Framework 4.0 unterstützen, z.B. durch einen ParallelFor-Befehl, der Schleifen parallel ausführt, und indirekt durch die Erweiterungsmethode AsParallel als Teil der .NET-Klassenbibliothek 4.0.Immer noch ein wenig fremd - Funktionsausdrücke
Eine der wichtigsten Neuerungen, neben LINQ, die mit Visual Basic 9.0 dazu kamen war die Einführung von Funktionsausdrücken (auch Lambda-Funktionen) genannt. Ein Funktionsausdruck ist ein Ausdruck, der einer Variablen vom Typ Fun(Of ) zugewiesen werden kann. Das Schlüsselwort Of deutet es an, es kommt dabei auf die Typen von Parametern und Rückgabewert des Funktionsausdrucks an (Listing 1). Listing 1: Funktionsausdrücke bei Visual Basic 9.0Dim DoAdd As Func(Of Integer, Integer, Integer) Dim DoAdd As New Func(Of Integer, Integer, Integer)(AddressOf Add)Console.WriteLine("Das Ergebnis: {0}", DoAdd(4, 5))Function Add(ByVal p1 As Integer, ByVal p2 As Integer) As IntegerReturn p1 + p2End Function
Die Variable DoAdd, die für einen beliebigen Funktionsausdruck vom Typ (Of Integer, Integer, Integer) also zwei Integer-Parameter und ein Integer-Rückgabewert) steht, kann jederzeit einen anderen Funktionscode erhalten:DoMath = New Func(Of Integer, Integer, Integer)(AddressOf Mul)Der Aufruf DoMath(4,5)ergibt 20, wenn die Funktion Mul entsprechend definiert ist.Der Funktionscode kann der Variablen über den "zweckentfremdeten" Function-Befehl aber auch direkt zugewiesen werden:DoMath = Function(p1, p2) p1 - p2 Da das Ganze auf Delegaten basiert, müssen die Datentypen der Parameter "passen", in dem durch eine implizierte Typenkonvertierung kein Genauigkeitsverlust eintreten kann (ein Single kann für einen Integer eingesetzt werden, aber nicht umgekehrt).Da Visual Basic 9.0 in Bezug auf Funktionsausdrücke eine "1.0-Version" ist, gibt es noch eine Reihe von Einschränkungen. Eine davon ist, dass sich der Funktionscode wirklich auf einen einzelnen Ausdruck beschränken muss. Prozeduraler Code, wie in einer richtigen Funktionsdefinition, ist nicht erlaubt. Auch darf anstelle einer Function keine Sub eingesetzt werden, der Ausdruck muss einen Wert zurückgeben. Eine dritte, eher kosmetische Einschränkung, betrifft den Umstand, dass wenn ein mehrzeiliger Funktionsausdruck möglich wäre, dieser mit Zeilenfortführungsoperatoren umgebrochen werden müsste. Mit dem kommenden VB 10 fallen alle drei Einschränkungen weg. Ein Funktionsausdruck kann regulären Funktionscode enthalten, z.B. einen If-Befehl oder eine Programmschleife, sich über mehrere Zeilen erstrecken, und anstelle einer Function kann auch eine Sub eingesetzt werden. Damit ergeben sich genauso interessante wie flexible Konstruktionen. Listing 2 zeigt, wie der Where-Methode eine komplette Funktion übergeben werden kann, um die Primzahlen zu "berechnen". Listing 2: Die Variable PrimCheck erhält einen aus mehreren Zeilen bestehenden FunktionsausdruckswertDim PrimCheck = Function(n As Integer) As BooleanFor i As Integer = 2 To Math.Sqrt(n)If n Mod i = 0 ThenReturn FalseEnd IfNextEnd Function' Dank Array Literals muss auch bei einem Array kein Typ mehr angegeben werdenDim TestZahlen() = {3, 5, 9, 12, 17, 19, 25}Dim Prims1 = TestZahlen.Where(PrimCheck) Generische Methoden der Array-Klasse
Auch viele erfahrene Visual Basic-Programmierer wissen nicht, dass bereits mit .NET 2.0 und Visual Basic 8.0 die Array-Klasse um zahlreiche generische Shared-Methoden erweitert wurde. Eine davon ist FindAll, dem neben dem Array, das durchsucht werden soll, ein Predicate-Delegat übergeben wird. Dies ist ein Delegat, der für eine Funktion mit einer durch den Typ des Arrays vorgegeben Signatur steht, der ein Wert vom Typ des Arrays übergeben wird, und die immer einen Boolean zurückgibt. FindAll durchsucht alle Werte des Arrays und gibt ein Array mit jenen Typen zurück, für die die Funktion, mit der der Predicate-Delegat instanziert wird, ein True zurückgegeben hat. Es versteht sich von selber, dass der Typ des zurückgegebenen Arrays dem jenes Arrays entspricht, für das FindAll aufgerufen wurde:Dim Ungerade () As Integer = Array.FindAll(Zahlen, New Predicate(Of Integer)(AddressOf CheckUngerade)) CheckUngerade ist wie folgt definiert:Function CheckUngerade (z As Integer) Return z mod 2 = 1 End FunctionAlternativ kann der Funktionsausdruck auch direkt zugewiesen werden: Dim Ungerade () As Integer = Array.FindAll(Zahlen, New Predicate(Of Integer)(Function(z) z Mod 2 = 1))In beiden Fällen resultiert ein Array, das nur die ungeraden Zahlen enthält.Funktionsausdrücke und LINQDoch warum werden Funktionsausdrücke überhaupt gebraucht? Zum einen natürlich, weil sie zu einer etwas flexibleren Programmierung führen und sich funktionale Abläufe durch sie etwas natürlicher und effektiver ausdrücken lassen. Zum anderen, und das ist der Hauptgrund, weil viele der mit LINQ eingeführten Erweiterungsmethoden einen Funktionsausdruck als Parameter erwarten.Noch ist nichts offiziellDas finale VB 10 liegt als Teil des kommenden .NET Frameworks 4.0 noch in weiter Ferne. Microsoft hat Ende Oktober eine erste Vorabversion freigegeben, die noch nicht einmal den Status Alpha trägt. Eine offizielle Beta/CTP könnte es März/April 2009 geben und dann dürfte es noch ein Jahr dauern bis die Version offiziell wird. Es wird also noch viel Wasser den Rhein herab fließen bis Visual Basic-Entwickler "richtig" funktional programmieren können. Dennoch setzt die kommende Version den Trend fort, der bereits mit der aktuellen Version begonnen wurde. Visual Basic-Entwickler, die die Entwicklung ihrer Sprache nicht aus dem Blickwinkel verlieren möchten tun gut daran, sich mit Funktionsausdrücken zu beschäftigen. Vor allem im Zusammenhang mit LINQ gibt es "jede Menge" Einsatzmöglichkeiten.Linkshttp://code.msdn.microsoft.com/vbfuturePeter Monadiemi