| Nach diesen eher allgemein gehaltenen Aussagen gehe ich nun noch auf zwei häufig anzutreffende Spezialfälle beim Konvertieren und ihre Problematiken ein. VB .NET <-> C# Die .NET-Sprachen bilden zum oben genannten eine sehr interessante Ausnahme - sie bauen auf fast identischer Technologie mit fast identischen Sprachmitteln und Aufgabenbereichen auf. Wenn man VB und C# einmal im Vergleich betrachtet, sieht man, dass die Unterschiede überwiegend syntaktischer Natur sind. In folgendem Beispiel ist jede Zeile 1:1 übertragbar. | VB.NET | C# | Imports System
Class Fibonacci
Public Shared Sub Main()
Dim a As Integer = 0
Dim b As Integer = 1
For i As Integer = 1 To 12
b += a
a = b - a
Console.WriteLine("{0}. Fibonacci-Zahl: {1}", i, a)
Next
Console.ReadKey()
End Sub
End Class Listing 1 | using System;
class Fibonacci {
public static void Main() {
int a = 0;
int b = 1;
for (int i = 1; i <= 12; i++) {
b += a;
a = b - a;
Console.WriteLine("{0}. Fibonacci-Zahl: {1}", i, a);
}
Console.ReadKey();
}
} Listing 2 | Quellcode zwischen den einzelnen .NET-Sprachen hin- und herzuübersetzen ist gewolltermaßen ohne Weiteres auch maschinell möglich (F# bildet hier eine Ausnahme). Man kann zunächst den .NET-Reflector benutzen, um analysierten Quellcode in verschiedensten Sprachen anzeigen zu lassen. Es existieren aber auch zahllose Online-Konverter, in die man unkompliziert den Ausgangscode eingibt und gleich die fertige Übersetzung herausbekommt. Als Beispiel sei hier dieser Converter von DeveloperFusion genannt. Der Unterschied zwischen beiden Verfahren ist, dass der Reflector aus bereits kompiliertem Code durch eingehende Analyse auf die Darstellung in den einzelnen Sprachen schließt, während die Online-Tools lediglich die eine Syntax in die nächste überführen. Vorteil hierbei ist, dass auch nicht kompilierfähige Schnipsel konvertiert werden können. Die Ausgabe beider Tools stimmt dabei zum Großteil. Nichtsdestotrotz gilt es beim Konvertieren Folgendes zu beachten. - VB und C# haben trotz allem noch Unterschiede, Sprachfeatures, die in der jeweils anderen Sprache nicht existieren. Je nachdem, wie tiefgreifend diese sind, kann ein Übersetzer hier erhebliche Probleme haben. Aus einer Forendiskussion bezüglich einer möglichst vollständigen Liste der Unterschiede ist diese freie Online-Tabelle entstanden, die sie gerne auch um neue Punkte erweitern dürfen.
Ein Auszug wichtiger Unterschiede: | Nur VB | Nur C# | | WithEvents-Deklarationen | Generatorfunktionen per yield return | | Integrierte XML-Schreibweise | Aufzählungs-Initialisierer | | Der My-Namespace | Automatisch generierte Properties | | Option Explicit/Strict Off | Mehrzeilige anonyme Funktionen | | Benennung von Schnittstellenmethoden | Anonyme Prozeduren | | With-Blöcke | Unchecked-Blöcke | | Statische lokale Variablen | Zeiger / Unsicherer Code | - Für Tools, die den Code nicht kompilieren, existieren uneindeutige Fälle, die aus rein syntaktischer Betrachtung nicht entscheidbar sind. Beispiele:
| Aufruf | Uneindeutigkeit | _ | | VB: xyz(42) | C#: Array-Zugriff? | xyz[42]; | | _ | C: Funktionsaufruf? | xyz(42); | | C#: xyz(Name); | VB: Variable? | xyz(Name) | | _ | VB: Funktionszeiger? | xyz(AddressOf Name) | VB Classic (VB 5/6 oder früher) <-> VB .NET Bei VB Classic und VB .NET verhält sich die Situation genau umgekehrt. Das einzige, was beide Sprachen noch verbindet, ist die ähnliche, oft gleiche Syntax – Vom ganzen Konzept, Aufbau, ihren Programmiermitteln und ihrer Mächtigkeit sind beide Sprachen aber grundverschieden. Dies macht es ungleich schwieriger, ja fast unmöglich macht, ganze Projekte schnell oder sogar automatisiert zu übertragen. In klassisches VB zu übersetzen ist schwierig, da ein Großteil der mächtigereren Sprachmerkmale von VB .NET dort nicht existieren – Objektorientierung, Vererbung, Reflexion, Delegaten ... Und was noch viel wichtiger ist: Man hat das gesamte .NET-Framework nicht zur Verfügung, auf das VB .NET so sehr aufbaut. In die andere Richtung ist eine Konvertierung noch eher möglich, allerdings erhält man keinen Code, wie man ihn in .NET schreiben würde. Außerdem wird in VBC maschinennäher und extrem API-orientiert programmiert, Dinge, die in .NET entweder unnötig, unschön oder gar verboten wären. Die Überlegung, die man anstrengen müsste, bevor man Quellcode tatsächlich konvertiert, wäre, ob sich ein komplettes Neuschreiben nicht eher lohnt. Auch besteht noch die Möglichkeit, beide Sprachen unabhängig miteinander interagieren zu lassen. .NET-Typen können als zu VBC kompatible COM-Typen exportiert werden (siehe COM-Komponenten mit .NET schreiben [.NET-Tipp 0007]), während existierende DLL's oder Steuerelemente in .NET-Anwendungen ebenfalls weiter unterstützt werden. |