Eine Warnung vorab: Dart ist im Moment eine Technologie-Preview. Vieles fehlt noch und vieles kann und wird sich ändern. Das ist auch eine Chance: Dart ist jetzt herausgekommen, um das Feedback der Community in Dart einzubauen. Feedback können Sie an die Entwickler von Dart weitergeben, zum Beispiel durch die Dart User Discussion Group oder das Einstellen von Fehlern in den Issue Tracker.
Google Dart auf der W-JAX
Die Nerven der Google-Programmierer waren gespannt wie Dart-Seile, als sie ihre Sprache der Welt vorstellten. Immerhin wurde Dart entwickelt, um JavaScript den Garaus zu machen. Seitdem hagelt es skeptische und höhnische Bemerkungen. Gleichzeitig gibt es aber schon gewisse Leute, die bereits Dart-Dienstleistungen anbieten. Und das, obwohl eigentlich noch gar nicht alles funktioniert. Wie ist also der Stand der Dinge? Und - werden wir Java-Entwickler Dart hassen oder lieben? Dieser Talk auf der W-JAX von Christian Grobmeier gibt eine recht subjektive Einschätzung, aufgepeppt mit eine paar Folien.
Hinter Dart steht ein Team bei Google. Zu diesem Team gehört Lars Bak. Er hatte zuvor wesentlichen Anteil an der HotSpot Java VM und arbeitet nun an der V8 JavaScript VM, die in Google Chrome genutzt wird und das Rennen um höhere JavaScript-Performance eröffnet hat. Ein weiteres wichtiges Mitglied des Teams ist Gilad Bracha. Er hatte zuvor unter anderem an der Java Language Specification und an der Java Virtual Machine Specification gearbeitet.
Warum Dart?
Für das Dart-Projekt gibt es verschiedene Gründe: Immer mehr Anwendungen lassen Logik im Browser ausführen. Dieses Modell wird in Zukunft durch HTML5 sogar noch wichtiger werden. Allerdings hieß es bei der Einführung von Dart auf der Goto Konferenz, dass Dart keine Konkurrenz zu JavaScript sein soll, sondern es um den fragmentierten mobilen Markt geht. Eine mögliche Interpretation dieser Aussage ist, das durch Dart HTML5-Oberflächen noch wichtiger für mobile Endgeräte werden sollen, so dass alle Plattformen mit einer einheitlichen Code-Basis bedient werden können. Eine andere Interpretation ist, dass Dart langfristig auf der Android-Plattform Java verdrängen soll. Vor allem wegen der gerichtlichen Auseinandersetzung zwischen Google und Oracle wegen Java ist es sicher gut für Google, dazu noch eine Alternative zu haben.
Interessant ist Dart auch, weil die Sprache explizit darauf ausgelegt ist, für Entwickler möglichst leicht erlernbar und nutzbar zu sein. Dazu sind einige sehr interessante Entscheidungen getroffen worden.
Als Ablaufumgebung kann Dart JavaScript nutzen. Dazu wird der Dart-Code in JavaScript übersetzt. Diesen Ansatz hatte Google mit GWT (Google Web Toolkit) schon für Java implementiert. So kann Dart auf jedem Browser laufen. Zur Zeit werden Chrome, Safari und Firefox unterstützt. Die Kompilierung in JavaScript-Code ist im Moment noch nicht besonders effizient – weder in Bezug auf die Größe des generierten Codes noch in Bezug auf die Laufzeiteffizienz. Laut Lars Bak soll die Performance aber schon vergleichbar sind mit der JavaScript-Performance der ersten Versionen der V8-JavaScript-VM. In diesem Bereich wird sicher noch einiges optimiert.
Einfache Beispiele
Wer Dart ausprobieren will, sollte sich die Dart-Web-Site anschauen. Dort gibt es einige Beispiele, die direkt im Browser laufen können. Dabei wird der Dart-Code mit Hilfe eines Server in JavaScript kompiliert, der auf der Google App Engine läuft, und dann ausgeführt. Schon ein Blick auf das Hello World (Listing 1) zeigt, dass Dart sich in die Tradition der C-Sprachen einreiht, zu denen ja auch Java und JavaScript gehören. Entwickler, die Sprachen aus dieser Familie beherrschen, finden sich recht schnell zurecht.
main() {print('Hello, Dart!');}
Listing 1 Hello World
Das etwas komplexere Beispiel in Listing 2 zeigt in der main-Methode eine abkürzende Schreibweise mit => für einzeilige Funktionsdefinitionen. Außerdem zeigt es Funktionen und typisierte Variablen sowie Templates für die Ausgabe.
int fib(int n) {if (n <= 1) return n;return fib(n - 1) + fib(n - 2);}main() => print('fib(20) = ${fib(20)}');
Listing 2 Fibonacci-Zahlen
Objekt-Orientierung mit Dart
Listing 3 zeigt ein Beispiel für Objekte-Orientierung. Es wird eine Klasse Person mit den beiden Instanz-Variablen name und firstname definiert. Der Konstruktor Person(this.name) ist eine kompakte Schreibweise dafür, dass der erste Parameter des Konstruktors der Instanz-Variable name zugewiesen werden soll. Methoden wie auch Konstruktoren können nicht überladen werden. Es ist also nicht möglich, zwei Methoden mit demselben Namen und unterschiedlichen Parametern zu definieren. Daher gibt es einen zweiten Konstruktor mit einem anderen Namen.
class Person {String name;String firstname;Person(this.name);Person.withFirstname(this.firstname,this.name);}main() {Person p = new Person.withFirstname('Gilad','Bracha');print('Hi ${p.firstname} ${p.name}');}
Listing 3 Objekt-Orientierung in Dart
Neben Konstruktoren können Objekt auch mit Hilfe von Factories erzeugt werden. Verschiedene Factory-Ansätze gehörten schon zu den ersten dokumentierten Design Patterns. Aber in Dart wird dieser Ansatz direkt in der Sprache unterstützt. Ebenfalls gibt es eine Unterstützung für Interfaces. Listing 4 zeigt ein Beispiel: Es wird ein Interface Person mit der Factory PersonFactory definiert. Abhängig von dem Konstruktor-Parameter wird eine konkrete Klasse instanziiert. In der Benutzung unterscheidet sich eine Factory nicht von einem Konstruktor-Aufruf. Es scheint also so, als ob ein Interface instanziiert wird. Der Factory-Ansatz wird auch für Klassen unterstützt. Mit Factories ist die Instanziierung von Objekte praktisch beliebige änderbar –Singletons, Caches und andere Trick können für den Nutzer der Klassen transparent implementiert werden.




