Visual Basic.Net: Die Revolution des Punktes

Das Visual-Basic-Update wartet mit diversen konzeptionellen Neuerungen auf. Was es beim Umstieg auf die .Net-Entwicklungsumgebung zu beachten gibt, zeigt der InfoWeek-Workshop.

Artikel erschienen in Swiss IT Magazine 2001/30

     

Visual-Basic-Programmierer dürfen sich auf eine abwechslungsreiche Zukunft einstellen. Spätestens Anfang nächsten Jahres wird Microsoft nach langer Vorbereitungsphase die nächste Generation des Entwicklungsflaggschiffs Visual Studio unter dem Namen Visual Studio.Net auf den Markt bringen, zu der auch eine komplett überarbeitete Version des populären Entwicklungswerkzeuges Visual Basic gehören wird.




Visual Basic.Net ist keine Version 7.0, bei der lediglich das vertraute Numerierungsschema einem weiteren Modetrend geopfert wurde. Es ist eine von Grund auf neu entwickelte Programmiersprache, die anders als ihr Vorgänger nicht mehr auf dem bewährten Component Object Model (COM), sondern auf der brandneuen .Net-Laufzeitumgebung aufsetzt. Notwendig wurde dieser Wechsel, weil COM für die Entwicklung mehrschichtiger, webbasierender Anwendungen nicht mehr ausreichend war. Anstatt W indows mit einer Vielzahl neuer Systemservices auszustatten, die von den verschiedenen Programmiersprachen unterschiedlich und vor allem nicht im gleichen Umfang hätten genutzt werden können, entschloss man sich bei Microsoft zu einem radikalen Neubeginn. Unter dem Namen .Net wurde in den letzten Jahren eine komplett neue Systemumgebung geschaffen, deren drei Säulen eine allgemeine Laufzeitumgebung (die Common Language Runtime, kurz CLR), ASP.Net für die Entwicklung von Webanwendungen und Webdiensten und eine aus mehreren tausend Klassen bestehende Klassenbibliothek sind.


Die CLR: Eine für alle

Die Laufzeitumgebung ist sehr viel mehr als nur ein Nachfolger für die Visual-Basic-6.0-Laufzeitdatei Msvbvm60.dll. Es ist eine komplette Infrastruktur, die allen .Net-Sprachen (neben Visual Basic, C++ und C# gibt es inzwischen fast 20 weitere Sprachen) gemeinsam zur Verfügung steht und die wichtige Services, wie den JIT-Compiler, der den Zwischencode der exe-Dateien in Maschinencode compiliert, oder die Garbage Collection, die sich um die Speicherverwaltung und das regelmässige Entfernen nicht benötigter Objekte kümmert, zur Verfügung stellt. Die CLR ist entweder Bestandteil des Betriebssystems (wie bei Windows XP) oder wird nachträglich einmalig, im allgemeinen zusammen mit der Anwendung, installiert. Anschliessend kann jede .Net-Anwendung auf der Maschine ausgeführt werden. Die CLR läuft sowohl unter Windows 9x und NT 4.0 als auch unter Windows 2000/XP und soll im Rahmen eines Shared-Source-Projektes, zusammen mit dem C#-Compiler, auch nach Free BSD Unix portiert werden. Visual Studio.Net wird dagegen nach den Plänen von Microsoft nur unter Windows NT/2000/XP laufen.



Ein weiterer wichtiger Bestandteil der neuen Programmierumgebung ist die Common Language Infrastructure (CLI), die unter anderem allen .Net-Sprachen den gleichen Satz von Datentypen zur Verfügung stellt. Das bedeutet, dass Visual Basic endlich keine Sonderrolle mehr spielt und sich Programmierer zum Beispiel nicht mehr darüber den Kopf zerbrechen müssen, wie ein Unicode-String behandelt werden muss, der etwa von einer C++-Komponenten übergeben wurde.





Ein erstes Beispiel

Für Visual-Basic-Programmierer klingen alle diese Neuerungen in etwa so, als wäre es über Nacht Pflicht geworden, Programme ausschliesslich in Suaheli kommentieren zu müssen. Dabei ist wie üblich alles halb so wild. Die Programmierung wird unter .Net, hat man sich erst einmal in der neuen Welt zurecht gefunden, sogar in vielen Fällen einfacher sein als früher. Den grössten Luxus bietet die umfangreiche Klassenbibliothek, die nicht nur die meisten gebräuchlichen API-Funktionen ersetzt, sondern neue Funktionen - etwa für die Auswertung regulärer Ausdrücke oder den Dateizugriff - zur Verfügung stellt, von denen Visual-Basic-Programmierer bislang nur träumen konnten. Sind Sie bereit für Ihr erstes "Next Generation"-Visual Basic-Programm? Wenn ja, dann starten Sie den Notepad (oder Ihren Lieblingseditor, etwa UltraEdit) und tippen Sie die Befehlszeilen aus Listing 1 ein. Voraussetzung ist, dass Sie eine Beta von Visual Studio.Net oder zumindest das .Net-Framework SDK installiert haben. Speichern Sie den Text in einer Datei mit dem Namen FirstVBNet.vb ab, öffnen Sie die Eingabeaufforderung und geben Sie die folgende Befehlszeile ein: "vbc firstvbnet.vb".



Dieser Aufruf startet den Visual Basic.Net Compiler, der die Quelltextdatei in eine exe-Datei compiliert. Haben Sie alles richtig eingegeben, sollte anschliessend folgender Aufruf möglich sein: "firstvbnet".




Wundern Sie sich nicht, dass die Ausgabe in der Eingabeaufforderung erscheint. Die neuen Konsolenanwendungen (die auf eine in Win32 enthaltene Einrichtung aufbauen und lediglich in Visual Basic bislang nicht zur Verfügung gestellt wurden) laufen in der Eingabeaufforderung und werden sich einer grossen Beliebtheit erfreuen, da viele Anwendungen keine Benutzeroberfläche erfordern und sich Konsolenanwendungen schnell und ohne Gedanken an die Optik verschwenden zu müssen, umsetzen lassen.



Das war alles andere als kompliziert, und genauso stellt sich die gesamte .Net-Programmierung dar, sobald man den ersten "Schock" überwunden, möglichst viele Beispiele ausprobiert und sich anhand des reichlich vorhandenen Materials eine eigene Meinung gebildet hat. Das Beispielprogramm verwendet, auch wenn es nicht notwendig gewesen wäre, eine Klasse (CHallo). Das einzige Mitglied (SagWas) wurde als "shared" deklariert, was bedeutet, dass die Klasse nicht instanziert werden muss, um das Mitglied benutzen zu können.



Als kleine Zugabe wird über den nachfolgenden Befehl der komplette Name des Assembly (so wird bei .Net eine logische Programmeinheit genannt) ausgegeben.



Die sehr mächtige Reflection-Klasse ermöglicht einen umfassenden Zugriff auf die Metadaten eines Programms, was durch die Ausgabe des Namens natürlich nur angedeutet werden kann.



Anders als bei Visual Basic 6.0 steckt hinter einer kompilierten exe-Datei kein Maschinencode (auch der P-Code wurde abgeschafft). Jeder .Net-Compiler erzeugt einen Zwischencode, der als IL bezeichnet wird, wobei das "I" aber nicht für interpretiert steht. Die Abkürzung IL steht für Intermediate Language und ist die Assemblersprache von .Net. Zwar wäre es denkbar, direkt in IL zu programmieren, doch wäre das sehr umständlich.



Die Aufgabe des Just In Time Compilers (JIT) besteht darin, aus dem IL-Code Maschinencode zu machen, was auch als "jitten" bezeichnet wird. Performance-Nachteile müssen dabei nicht in Kauf genommen werden, denn der JIT-Compiler produziert hochoptimierten Maschinencode. Auch müssen VB-Programmierer nicht mehr neidisch auf ihre C++-Kollegen schielen. Alle .Net-Compiler generieren einen IL-Code, der sich nur in Nuancen unterscheiden dürfte. Und da C# und VB.Net den gleichen Optimierer verwenden, dürften sich diese beiden Programmiersprachen bezüglich der Ausführungsgeschwindigkeit ihrer Compilate nicht messbar unterscheiden.




Bedingt kompatibel

Die vielen Neuerungen führen zwangsläufig zu einem Bruch in der Syntax. Visual Basic.Net ist nicht zu 100 Prozent kompatibel zu seinen Vorgängerversionen. Auch wenn sich Microsoft grösste Mühe gegeben hat, eine möglichst grosse Kompatibilität zu gewährleisten und mit der Beta 2 einige in Entwicklerkreisen heftig diskutierte Neuerungen wieder rückgängig gemacht hat, um jene Programmierer zufrieden zu stellen, die jede Änderung an der Sprache offenbar für unmoralisch halten.



Das beginnt bei Kleinigkeiten wie dem Umstand, dass ein Integer- nun 32 Bit oder ein Long-Wert nun 64 Bit umfasst (der alte Integer wird durch den neuen Datentyp Short ersetzt). Die Änderungen gehen weiter über die Abschaffung der Datentypen Currency und Variant und setzen sich über vertraute Steuerelemente fort, bei denen einzelne Eigenschaften und Methoden neue Namen erhalten haben, und reicht bis zu exotischen Befehlen wie Gosub oder LSet, die in VB.Net ersatzlos abgeschafft wurden.




Das sind keine echten Problemfelder, sondern eher kosmetische Änderungen. Für den Umstand, dass sowohl COM als Fundament von Visual Basic 6.0 als auch die Laufzeitbibliotheken verschwunden sind, ist Visual Basic.Net sogar erstaunlich kompatibel. Praktisch alle vertrauten Funktionen stehen, auch wenn es sich in Wirklichkeit um Methoden der .Net-Klassenbibliothek handelt, unverändert zur Verfügung, wenn es unbedingt sein muss, können Strings nach wie vor mit einer festen Länge definiert werden, auch wenn dies durch die CLI nicht unterstützt wird. Und wer partout nicht auf die (undokumentierte) VarPtr-Funktion verzichten kann, dem spendiert eine Hilfskonstruktion, bei der ein Speicherblock im Arbeitsspeicher festgehalten wird (diese Technik heisst "Memory pinning"), die Möglichkeit, dass ihn die Garbage Collection nicht an einen anderen Ort verfrachten kann.




Automatische Aktualisierung

Trotz diesem teilweise sehr grosszügigen Entgegenkommen, eine 1:1-Konvertierung von Visual-Basic-6.0-Projekten wird nur in Ausnahmefällen möglich sein. Wird ein VB-6.0-Projekt unter Visual Basic.Net geladen, wird es automatisch vom Aktualisierungsassistenten konvertiert (dabei wird eine Kopie angelegt, so dass das alte Projekt nicht verändert wird). Der Aktualisierungsassistent versucht, dem Programmierer möglichst viel Arbeit abzunehmen, kann aber keine Wunder vollbringen. Einfache Änderungen werden schlicht ausgetauscht, etwas anspruchsvollere Konstruktionen werden über die Kompatibilitätsklasse Microsoft.VisualBasic umgesetzt, die einen grossen Teil der VB-6.0-Funktionalität zur Verfügung stellt (dazu gehören auch die zahlreichen Konstanten). Für den Fall, dass der Assistent nichts ausrichten kann, wird an der betreffenden Stelle lediglich ein Kommentar eingefügt.



Die Konvertierung von Projekten dürfte in vielen Fällen zwar grundsätzlich machbar sein, in der Praxis aber oft durch die Fülle kleiner Details und Inkompatibilitäten gebremst werden. Sehr viel schwerer wiegt der Umstand, dass .Net als Plattform ganz neue Möglichkeiten bietet und eine Anwendung, um diese Möglichkeiten nutzen zu können, einen sehr viel stärker komponentenorientierten Aufbau besitzen sollte. Da es im allgemeinen wenig bringen dürfte, ein 6.0-Projekt solange auszubessern, bis es fehlerfrei unter .Net läuft, ist der mehr oder weniger komplette Neuanfang in der Regel die sinnvollere Alternative. Da sich diesen Luxus aber nur wenige Entwickler in naher Zukunft leisten können, hat Microsoft versprochen, Visual Basic 6.0 auf lange Zeit zu unterstützen und hat sogar weitere Servicepacks in Aussicht gestellt.





Durch und durch objektorientiert

Visual Basic.Net ist eine objektorientierte Programmiersprache, die neben Vererbung auch Konstruktoren sowie das Überladen und Überschreiben von Methoden unterschützt. In diesem Punkt unterscheidet es sich lediglich von C#, da es das nur selten benötigte Überladen von Operatoren nicht unterstützt (ein Feature, das mit der nächsten Version nachgereicht werden soll).



Das Prinzip der Klassenprogrammierung haben wir bereits im C# Workshop (InfoWeek 23/2001) von Frank Groth vorgestellt. Da sich Visual Basic.Net nur durch die Namen der Schlüsselwörter, die teilweise besser gewählt wurden, unterscheidet, soll lediglich der Umstand hervorgehoben werden, dass sich die Objektorientierung auch bei Visual Basic.Net durch alle Bereiche der Sprache zieht. Dass dies zur Abwechslung einmal keine durch Marketing geprägte Aussage ist, machen zahlreiche Kleinigkeiten deutlich. So sind beispielsweise auch normale Datentypen Objekte. Unter .Net wird zwischen Wert- und Verweistypen unterschieden - Werttypen speichern den Wert, Verweistypen einen Verweis auf den jeweiligen Typ. Das bedeutet, dass der harmlose Befehl "Dim n As Integer" ein Objekt definiert.




Sie haben richtig gelesen, die Variable "n" ist ein Objekt, auch wenn es sich bei Integer um eine Struktur und bei "n" folglich um einen Werttyp handelt. Dieser Umstand hat für den Programmieralltag keine direkte Bedeutung, führt aber dazu, dass sich etwa die ToString-Methode, die ein Objekt in eine Zeichenkette umwandelt, auf auch die Variable "n" anwenden lässt:











WriteLine("Der Wert von n ist:_
{0}", n.ToString)







ToString ist keine Methode von Integer, sondern der Klasse System.Object, der "Mutter" aller .Net-Klassen, von der sich alle übrigen .Net-Datentypen ableiten. Und es wird noch ein wenig skurriler, auch normale Zahlen sind, da sie einen Datentyp besitzen, Objekte. Der folgende Befehl beweist es:











WriteLine("Auch das ist_
möglich: {0}", 2.ToString)







Auch wenn nicht wenige VB-6.0-Programmierer einen kleinen "Kulturschock" erleiden werden, wenn in allen Projekten auf einmal "public class" auftaucht, wird die konsequente Verwendung objektorientierter Programmelemente mittelfristig die Programmierung erleichtern. Und: Niemand wird gezwungen, ausschliesslich in Klassen zu programmieren, geschweige denn zu denken. Die prozedurale Programmierung dominiert auch bei Visual Basic.Net. Microsoft hat sich auch hier grosse Mühe gegeben, den Charakter von Visual Basic nicht zu zerstören. So gibt es nach wie vor Module, auch wenn sich dahinter Klassen mit gesharten Mitgliedern verbergen.
Wow, Multithreading!



Neben der Vererbung stand das Multithreading Jahre lang ganz oben auf der Wunschliste der Programmierer. Konkret versteht man darunter die parallele Ausführung mehrerer Subprozesse bzw. Threads.



Jetzt ist sie da. Wie die Vererbung ist aber auch Multithreading kein direkter Bestandteil von Visual Basic.Net, sondern wird von der CLR zur Verfügung gestellt. Und wie die Vererbung ist Multithreading ein sehr mächtiges Werkzeug, das nur mit Verstand und Bedacht eingesetzt werden sollte. Für die meisten Programmierer dürfte Multithreading lediglich eine theoretische Option sein. Das Beispiel aus Listing 2 besitzt daher auch nur Lehrbuchcharakter, das den grundsätzlichen Umgang mit Threads veranschaulichen soll.



Es besteht aus einem Windows-Forms-Formular, auf dem zwei Buttons (btnStart und btnReset), zwei Schieberegler und ein Timer (tmrZeit) angeordnet wurden. Nach dem Start wird auf einem Formular das klassische Hase-gegen-Igel-Rennen simuliert, wobei der Rennverlauf durch zwei Schieberegler dargestellt wird. Nach dem Anklicken der Start-Schaltfläche werden zwei Threads gestartet, die zufallszahlengesteuert abwechselnd an die Reihe kommen. Um dem Hasen den ihm gebührenden Vorteil zu verschaffen, wird der Igel-Thread hin und wieder schlafen gelegt.



Das Anlegen eines Threads geschieht über das Instanzieren eines Thread-Objekts der Threading-Klasse. Dabei wird dem Objekt über den AddressOf-Operator die Adresse einer Prozedur übergeben. Die Start-Methode des Thread-Objekts startet den Thread, der nun solange ausgeführt wird, bis die Prozedur abgearbeitet ist oder er über die Abort-Methode abgebrochen wird. Innerhalb der Prozedur wird lediglich eine Variable, die für die Position des jeweiligen Kontrahenten steht, inkrementiert.



Über einen SyncLock-/End SyncLock-Block wird die notwendige Synchronisation durchgeführt, die sicherstellen soll, dass ein anderer Thread nicht die Ausführung eines Befehlsblocks unterbrechen kann. In diesem Fall geht es um die Variablen PositionHase und PositionIgel, deren Inkrementierung nicht durch den Konkurrenz-Thread unterbrochen werden soll.



Das Aktualisieren des Schiebereglers ist allerdings nicht innerhalb eines Threads möglich, da das Windows-Forms-Modell mit seinen Steuerelementen nicht Thread-sicher ist. Statt dessen kümmert sich ein Timer darum, den Wert der jeweiligen Variablen abzufragen. Hier wird auch geprüft, ob eine der beiden Variablen den Wert 100 erreicht hat und der Thread über seine Stop-Methode angehalten werden muss.



Es ist sehr wichtig zu verstehen, dass die IDE das Debugging von Multithread-Anwendungen unterstützt. Es ist also möglich, Haltepunkte zu setzen und einen Thread schrittweise zu debuggen. Dennoch lösen sich nicht alle Probleme in Wohlgefallen aus. Nicht nur, dass der Programmierer für das Lösen von Synchronisationsproblemen zuständig ist, auch muss er stets daran denken, dass ein Ignorieren dieser Problematik zu subtilen Programmfehlern führen kann, die unter Umständen erst "Jahre später" auftreten können.



Weder Windows, noch das Windows-Forms-Modell ist Thread-sicher, so dass zum Beispiel der Zugriff auf Steuerelemente nur von jenem Thread aus möglich ist, der das Steuerelement erstellt hat.




Ausblick

Visual Basic.Net wird viele Änderungen mit sich bringen - die meisten resultieren aus dem Umstand, dass mit .Net eine komplett neue Programmierumgebung zur Verfügung steht. .Net ist keine Option und kein Aufsatz von Windows, der lediglich die Programmierung vereinfachen, ansonsten aber erfolgreich ignoriert werden kann.



VB.Net ist nicht mehr und nicht weniger als die nächste Generation der Microsoft-Plattform, die in den nächsten Jahren entstehen wird, und bei der die enge Verzahnung mit dem Internet, in erster Linie über Webdienste, eine ganz wichtige Rolle spielen wird.




Da Microsoft die Beta 2 in grossem Stile zur Verfügung stellt, können sich Visual-Basic-Programmierer in Ruhe mit der Zukunft beschäftigen. Wer die Beta 2 noch nicht als Beilage einer Zeitschrift gefunden hat, kann sie auf der Microsoft-Webseite kostenlos bestellen.



Die wichtigste Massnahme besteht darin, sich gründlich mit dem .Net-Framework zu beschäftigen, denn die Möglichkeiten von VB.Net werden 1:1 durch die darunterliegende Umgebung definiert. Viele Eigenheiten von VB.Net werden erst verständlich, wenn man den Mechanismus bei .Net kennt.



Der zweitbeste Tip ist es, möglichst viele kleine Beispiele auszuprobieren, bestehende kleine VB-6.0-Projekte mit dem Aktualisierungsassistenten zu laden und anschliessend den konvertierten Quelltext mit seinen zahlreichen Kommentaren zu studieren.



Dies gilt insbesondere, wenn die Kompatibilitätsklassen im Spiel sind. Die Beta 2 ist nahezu Feature-komplett, auch wenn Microsoft noch ein paar kleinere Änderungen bis zur endgültigen Version in Aussicht gestellt hat.



Artikel kommentieren
Kommentare werden vor der Freischaltung durch die Redaktion geprüft.

Anti-Spam-Frage: Vor wem mussten die sieben Geisslein aufpassen?
GOLD SPONSOREN
SPONSOREN & PARTNER