Dart ist eine ECMA-standardisierte[4]Programmiersprache, die hauptsächlich vom Unternehmen Google entwickelt wird. Die Sprache wurde als generelle Vielzweck-Programmiersprache entworfen,[5] die insbesondere eine moderne Alternative zu JavaScript zur Verwendung in Webbrowsern darstellen soll.[6] Dabei soll Dart einige grundsätzliche Probleme von JavaScript überwinden,[7] die sich nach Ansicht der Entwickler von Dart nicht durch eine Weiterentwicklung von JavaScript beheben ließen.
Die Entwicklung von Dart begann im Jahr 2010 in einem kleinen Team rund um Lars Bak, Gilad Bracha und Kasper Verdich Lund in Aarhus. Dart wurde erstmals auf der GOTO-Konferenz am 10. Oktober 2011 in Aarhus vorgestellt.[8]
Die Veröffentlichung der ersten stabilen Version 1.0 erfolgte am 14. November 2013.[9] Am 25. Juni 2014 beschloss die Generalversammlung der ECMA mit Dokument „ECMA-408“ die Standardisierung der Sprachspezifikation.[4]
Laufzeitumgebung
Dart-Programme können im Browser, aber auch auf dem Server ausgeführt werden. Für Browser ist der Transcompiler Dart2js vorgesehen, der Dartcode nach JavaScript übersetzt. Die „js Library“ ermöglicht die direkte Verwendung von JavaScript-Code in Dart.[10] Seit der Dart-Version M4 ist der maschinengeschriebene JavaScript-Code im DeltaBlue-Benchmark ebenso schnell wie von der V8-JavaScript-Engine ausgeführter, handoptimierter JavaScript-Code. Direkt in der DartVM ausgeführter Dart-Code ist deutlich schneller als vergleichbarer JavaScript-Code.[11][12] Bemerkenswert daran ist, dass der dafür verwendete Dart-nach-JavaScript-Compiler selbst in Dart geschrieben ist, und der JavaScript-Output beliebigen gültigen Dartcode in optimiertes JavaScript übersetzt. Ein Beispiel für diesen Compiler findet sich auf der Seite try.dartlang.org, die damit auch offline in allen modernen Browsern funktioniert.[13][14]
Dart-Anwendungen werden mit einem eigenen Mimetype ausgeliefert, nämlich „application/vnd.dart“.[15]
Das Dart-SDK legt derzeit den Schwerpunkt auf clientseitige Entwicklung. Serverseitige Entwicklung wird beispielsweise mit Bibliotheken wie dart:io unterstützt.[16]
Eine Dart-VM im Browser ist weder in Chrome noch in irgendeinem anderen Browser vorgesehen. Eine eigenständige Dart-VM wird für Mobile Apps, serverseitige Programme und als Tool zur Unterstützung der Programmierer weiterentwickelt. Der Fokus der Weiterentwicklung wird auf eine möglichst hohe Produktivität für Programmierer gelegt.[17]
Entwicklungsziele
Die Entwicklung von Dart wird von folgenden Zielen geleitet:[18]
Entwicklung einer strukturierten, aber auch flexiblen Programmiersprache für das Web.
Entwicklung einer leicht erlernbaren, da auf für Programmierer vertrauten Syntax und Techniken beruhenden, Programmiersprache.
Sicherstellung, dass alle Sprachkonstrukte eine hohe Leistung und einen schnellen Programmstart ermöglichen
Dart sollte vor allem für Geräte geeignet sein, die mit dem Web kommunizieren, wie Telefone, Tablets, Laptops und auch Server.
Unterstützung durch Tools, mit deren Hilfe Dart auf allen gängigen Webbrowsern lauffähig ist.
Dart Plattformen
Die flexible Kompilierungstechnologie von Dart gibt Entwicklern die Möglichkeit, Dart Code je nach Verwendungszweck auf verschiedene Art und Weisen zu kompilieren.
Dart Native
Dart Native verwendet sowohl JIT (Just-in-time-Kompilierung) als auch AOT (Ahead-of-time-Kompilierung), um Maschinencode für Zielgeräte wie Smartphones, Desktops oder Server zu entwickeln und auf diesen bereitzustellen.
Dart Web
Bei Dart Web kann ein jeweils eigener Compiler während der Entwicklung (dartdevc) und für die schlussendliche Website (dart2js) verwendet werden. Wie der Name bereits vermuten lässt, ist Dart Web für die Entwicklung von Web-Applikationen vorgesehen.[19]
Typisierung
Dart ist optional typisiert. Das bedeutet, dass Dart zwei Runtime-Modi kennt:
Im Produktionsmodus sucht sich der Compiler selbständig die jeweils beste Variante und ignoriert sowohl Typisierungsanweisungen als auch Typisierungsfehler. Dieser Modus ist für möglichst effiziente Programmausführung optimiert.
Im Checked-Modus werden die Typanweisungen strikt beachtet und bei Typisierungsfehlern werden Exceptions geworfen. Zudem folgt eine Prüfung auf Assertions. Die aufwendige Codeanalyse macht diesen Modus langsamer als den Produktionsmodus.
Die Vorteile der Typisierungs-Annotationen liegen in der besseren Lesbarkeit für den Menschen und in der deutlich besseren Unterstützung der Programmierer durch Integrierte Entwicklungsumgebungen oder Editoren wie beispielsweise Codevervollständigung, Navigation und frühzeitige Fehlererkennung. Programmierer, die keinerlei Typisierung einsetzen wollen, können ohne Nachteile für den Produktionsmodus darauf verzichten. Nur der JavaScript-Output ist gelegentlich nicht so gut optimierbar wie dies mit Typisierungsanweisungen möglich wäre.[20]
Werkzeuge
Dart wird zusammen mit einer Reihe von Werkzeugen ausgeliefert. Die Basis bildet das Dart SDK. Dieses enthält die Standalone-VM DartVM[21] und einen Dart nach JavaScript-Transcompiler namens dart2js.[12] Für die Quellcodeanalyse und Quellcodeformatierung sind die Befehlszeilewerkzeugedartanalyzer und dartfmt enthalten. Ab der Version 1.2 des SDK ist mit docgen ein Software-Dokumentationswerkzeug enthalten. Dartanwendungen basieren auf Packages und stellen selbst Packages dar, sobald mindestens eine Programmbibliothek verwendet wird. Zur Verwaltung der Dart-Anwendungen wird das PaketverwaltungsystemPub mitgeliefert.[22]
Ab der Version 1.4 wird auch das Analysewerkzeug Observatory für die Einsicht in die Abläufe innerhalb der DartVM bereitgestellt.[23]
Beispiele
Hallo Wikipedia
main(){// Ausgabe einer Textzeileprint('Hallo, Wikipedia!');}
Objektorientierte Programmierung
// Mathematik-Bibliothek für die Wurzel-Funktion einbindenimport'dart:math'asmath;// eine Klasse definierenclassPoint{// einen Konstruktor über eine syntaktische Besonderheit definierenPoint(numthis.x,numthis.y);// eine MethodedoubledistanceTo(Pointother){methodCalls++;numdx=x-other.x;numdy=y-other.y;returnmath.sqrt(dx*dx+dy*dy);}// Member-Variablennumx,y;// statische VariablestaticintmethodCalls=0;}// eine Unterklasse definieren, die von "Point" erbtclassColorPointextendsPoint{ColorPoint(x,y,this.color):super(x,y);varcolor;}main(){Pointp=Point(2,3);Pointq=ColorPoint(3,4,'rot');print('Abstand von p nach q = ${p.distanceTo(q)}');print('Methoden-Aufrufe = ${Point.methodCalls}');}// Ausgabe: Abstand von p nach q = 1.41421356237; Methoden-Aufrufe = 1