Dart. TypeScript. JavaScript Supersets / Compiled JavaScript.

compiledjs

Die Popularität von Frameworks wie AngularJS zeigt deutlich, dass Webapplikationen und moderne Webauftritte immer Frontendlastiger werden. Um den Nutzern ein reibungsloseres/flüssigeres Ergebnis zu bieten, wird immer mehr Funktionalität in JavaScript implementiert, welches häufig nur noch via Services zum Backend kommuniziert.
JavaScript kann diese Aufgaben grösstenteils sehr gut erfüllen, jedoch ist es schwierig, den Code so organisiert zu halten und wildwuchs zu vermeiden. Häufig wird versucht, einen objektorientierten Ansatz zu fahren und Features wie Vererbung zu emulieren, was JavaScript als prototypenbasierete Sprache nicht direkt anbietet. Dabei unterstützen können uns JavaScript Supersets, oder alternative Programmiersprachen, welche zu JavaScript kompilieren. Ich möchte in diesem Artikel ein paar der prominentesten Ansätze vorstellen und deren Vorteile gegenüber reinem JavaScript sowie untereinander aufzeigen.

Erwartungen
Es gibt einige Aufgaben, welche eine Sprache dem Entwickler abnehmen oder vereinfachen kann. Ich habe meine wichtigsten Erwartungen an eine Sprache in einer kurzen Liste zusammengefasst:

  • Modularisierbarer Code
  • Vererbung
  • Typisierung
  • Compile-time Errors
  • Vereinfachte Code-Dokumentation
  • Klar strukturierte, aufgeräumte, sprechende Syntax
  • Leichtes Arbeiten mit Libraries/Frameworks
  • Geringe Einarbeitungszeit

Überblick

TypeScript (Microsoft, aktuelle Version: 0.9.5)

Vorteile / Language Features

  • (angereicherte) JavaScript-Syntax
  • Nahe am ECMAScript 6-Standard
  • Einfaches Arbeiten mit JavaScript-Libraries/-Frameworks via Definition Files
  • Klassen/Interfaces & Vererbung
  • Optionale Typisierung
  • Namespaces (“module”)
  • Arrow-Functions

Nachteile

  • Noch kein finaler Release
  • Entwicklung ohne Visual Studio eher mühsam
  • Benötigt Kompilierung

Für das relativ neue Superset gibt es noch keinen finalen Release..
TypeScript’s grössten Vorteil sehe ich darin, dass sich die Syntax nicht von JavaScript unterscheidet, lediglich mit eigenen Language Features anreichert, welche sehr nahe an der ES6-Spezifikation sind (z.B. “module”). Die sogenannten Definition-Files bieten den Vorteil, dass Frameworks und Libraries nicht auf TypeScript portiert werden müssen, um damit zu arbeiten.
Man merkt schnell, dass das ganze aus der Microsoft-Ecke stammt, das Projekt wird auf Codeplex gehostet und es gibt eine gute VisualStudio-Integration, in anderen Entwicklungsumgebungen ist ein problemloses Arbeiten nicht ohne weiteres möglich.
Bei der praktischen Anwendung wurden mir öfter Compiler-Fehler gemeldet, welche nach Language-Spezifikation nicht auftreten sollten. Trotz diesen Fehlern wurde der Code korrekt kompiliert und war auch lauffähig, das ganze machte einfach einen (zurecht) unfertigen Eindruck. Beim Einarbeiten stösst man öfter auf älteren Beispielcode, dessen Syntax in der aktuellen Version nicht mehr funktioniert.
Es lohnt sich wahrscheinlich noch einmal einen Blick darauf zu werfen, wenn 1.0 (Roadmap) released wurde.

Dart (Google, aktuelle Version: 1.1.1)

Vorteile / Language Features

  • Keine Kompilierung während der Entwicklung nötig
  • Einfache Code-Dokumentation mit DartDoc
  • Einfaches Debugging mit automatisch generierter .map
  • Klassen/Interfaces & Vererbung
  • Optionale Typisierung
  • Mixins
  • Arrow Functions
  • Cascade Operator

Nachteile

  • Arbeiten mit JavaScript-Libraries nur bedingt / mit Portierung möglich
  • Entwicklung ausserhalb des Dart-Editors noch holprig

Die Sprache gibt es schon ein wenig länger und unterscheidet sich im Ansatz grundlegend von TypeScript, was das Zitat des Microsoft-JavaScript-Teams sehr gut veranschaulicht:

Some examples, like Dart, portend that JavaScript has fundamental flaws and to support these scenarios requires a ‚clean break‘ from JavaScript in both syntax and runtime. We disagree with this point of view.

Quelle: Evolving ECMAScript

Der Aufbau von Dart erinnert stark an Java, syntaktisch sowie auch im Aufbau von Projektumgebungen. Dart bietet viele spracheigene Packages, beispielsweise das Html-Package, welches das Arbeiten mit dem DOM ähnlich JQuery bietet. Es können aus Dart JavaScript-Schnipsel ausgeführt werden, was sich aber als etwas mühsam gestaltet und im Code sehr unschön aussieht. Um mit JavaScript-Libraries zu arbeiten ist eine Portierung auf Dart deshalb meist sinnvoll/unvermeidlich.
Als grössten Vorteil von Dart sehe ich die Integration der Dart-VM in einen Chromium-Browser. Ich befürworte den Einbau der VM in den offiziellen Chrome-Browser keineswegs, aber es ist sehr angenehm, wenn man den Code während der Entwicklung ohne zu kompilieren im Browser testen kann.
Bei der praktischen Anwendung wirkt Dart um einiges reifer als TypeScript. Trotz der umfangreichen Dokumentation kommt es aber vor, dass man sich beim Einarbeiten öfter Example-Projekte auf Github o.ä. anschauen muss.

CoffeeScript (aktuelle Version: 1.6.3)

Auf CoffeeScript werde ich nicht tiefer eingehen, da ich persönlich noch keine Erfahrungen damit sammeln konnte. Die Sprache scheint sehr viel Syntactic Sugar zu bieten und ist stark an Ruby angelehnt, was für Entwickler aus anderen Welten aber eher hohe Einarbeitungszeit erfordert.
Die Sprache bietet einige der erwarteten Features und scheint ihren Platz bereits gefunden zu haben.

Fazit
Bei der Umsetzung von modernen Webapplikationen mit beispielsweise AngularJs oder Polymer.js (bzw. AngularDart/Polymer.dart) sehe ich klar ein Einsatzgebiet für Dart. Bei der Implementierung vollständiger Applikationen werden Bedürfnisse wie Testbarkeit immer wichtiger: Bedürfnisse, welche von Dart sehr gut abgedeckt werden können.
Es muss jedoch bei Beginn des Projektes abgewogen werden, ob benötigte Libraries nicht für Dart existieren und ob die Eigenentwicklung ein hohes Risiko/einen wesentlich höheren Entwicklungsaufwand bedeutet.

Den Einsatz von TypeScript (und ggf. CoffeeScript) erachte ich in traditionellen Webprojekten als sinnvoll, da auch hier immer mehr clientseitig implementiert wird. Die Technologie liesse sich ausserdem sehr gut mit unseren bisherigen Ansätzen wie z.B. Terrific (siehe TerrificTS) paaren.
Da ECMAScript 6 (Release auf Ende 2014 geplant) viele Features von TypeScript wie die modules oder Klassen bietet, bin ich nicht sicher inwiefern der Einsatz dann noch Sinn machen würde.

Egal welches Superset/welche Sprache eingesetzt wird, man wird bezüglich Entwicklungsumgebung und Projektstruktur Kompromisse eingehen und den Einsatz pro Projekt abwägen müssen. Ich setze Dart bei privaten Projekten ein und bin gespannt, was die Zukunft bringt.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>