
Dart ist eine objektorientierte Programmiersprache mit funktionalen Elementen und einem optionalen Typsystem, die 2011 das erste Mal vorgestellt worden ist. Die Sprache wurde bei Google von Lars Bak, Gilad Bracha und Kasper Verdich Lund designed und erschien 2013 in der Version 1.0. 2018 erschien Dart 2 und im Jahr 2023 die Version Dart 3. Seit 2014 ist Dart ECMA-standardisiert.
Alleinstellungsmerkmale
Dart war ursprünglich als moderne Alternative zu JavaScript konzipiert, um für dessen Schwächen eine bessere Lösung anzubieten. Aktuell, im Jahr 2023, wird Dart überwiegend in Kombination mit dem 2017 erstmals veröffentlichten Framework Flutter eingesetzt, welches Multiplattform-Entwicklung für Web- und Mobile-Apps ermöglicht und dabei sowohl iOS, MacOS, Android, Linux und Windows unterstützt.
Einsatzbereiche
Dart wird hauptsächlich in der Web- bzw. Mobile-App-Entwicklung mit dem Framework Flutter eingesetzt, unter anderem bei Alibaba, BMW, ByteDance, Ebay, in den Apps Google Ads und Google Pay, bei iRobot, Tencent und Toyota.
Pros
Dart ist eine sehr leicht zu erlernende Sprache mit einer C-ähnlichen Syntax, die Entwickern vieler moderner Sprachen wie C#, Java oder JavaScript einen sehr leichten Einstieg ermöglicht. Dart hat eine gute Dokumentation (inklusive Style-Guide!) und eine umfangreiche Standardbibliothek, die eine hohe Produktivität ermöglicht. Dart ist nach dem Vorbild JavaScript auf non-blocking ausgelegt, bietet aber z.B. neben File.exists()
und stdin.readLine()
, die man nur mit async
und await
synchron verwenden kann, auch die synchronen Alternativen File.existsSync()
und stdin.readLineSync()
. Um eine Fließkommazahl aus einem String zu extrahieren, kann man double.parse()
verwenden und die Exception selbst behandeln, oder double.tryParse()
benutzen und statt einer Exception im Fehlerfall einfach null
zurückbekommen.
Syntaktisch unterstützt Dart den Optional Chaining Operator ?.
und Null Coalescing Operator ??
. Strings können interpoliert und mehrzeilig geschrieben werden. Dart unterstützt Method Cascades und Arrow Functions. Ein Objekt wird wie in Kotlin ohne vorangestelltes new instanziert. Für Klassenfelder, die über einen Konstruktor gesetzt werden, gibt es eine verkürzte Notation, bei der auf einen Body verzichtet werden kann. Dart unterstützt Higher Order Functions und damit z.B. auch Closures und Currying.
// Syntaktischer Zucker in Dart:
// Zahl aus Text lesen und
// im Fehlerfall 0 zurückgeben
final amount = double.tryParse(amountStr) ?? 0;
/*
- legt drei Tabellen an (Method Cascade)
- aber nur wenn db nicht null ist
- Strings können in " oder ' oder...
...mehrzeilig in """ bzw ''' verpackt werden
- mit $ werden Variablen in einen String eingebettet
- und mit ${} ganze Ausdrücke
*/
db?
..execute('CREATE TABLE b (c TEXT, d TEXT)');
..execute("CREATE TABLE c (d TEXT, e TEXT)");
..execute('''
CREATE TABLE a (
$b TEXT,
${c.toString()} TEXT)''');
// Konstruktoren können ohne Body geschrieben...
class Foo {
final Bar bar;
Foo(this.bar);
}
// ...und ohne new instanziert werden
final foo = Foo(bar);
Dart unterstützt seit Version 2.12 sound null safety und macht diese seit Version 3 verpflichtend. Wie in Kotlin werden Typen durch ein nachgestelltes Fragezeichen null
-fähig gemacht: Ein String?
kann null
sein, ein String
hingegen nicht.
Dart unterstützt die gängigen Konzepte der Objektorientierung, darunter (Mehrfach-)Vererbung, abstrakte Klassen, Generics und Mixins.
Dart ist eine verhältnismäßig performante Sprache, mit Stand 2021 etwa doppelt so schnell wie JavaScript, wobei sich dies nicht pauschal behaupten lässt und sich bei vielen Sprachen die Performance mit Erscheinen neuer Versionen geändert bzw. verbessert hat. Dart kann Ahead-of-Time oder Just-in-Time kompiliert werden. Dart kann für die Laufzeitumgebung DartVM kompiliert oder in ein selbstausführbares in sich geschlossenes Kompilat übersetzt werden. Dart-Code kann ebenfalls in JavaScript-Code transpiliert werden.
Dart ist speichersicher und kommt mit einer automatischen Speicherbereinigung.
Cons
Dart hat eine große Schwäche: Es ist nicht besonders weit verbreitet. Zwar hat Google Dart sehr vorbildlich dokumentiert, aber im Vergleich zu JavaScript und dem NPM-Ökosystem findet man für Dart verhältnismäßig wenig Beispiele, Hilfe und Bibliotheken online. Dart wird zurzeit hauptsächlich wegen Flutter genutzt und zeigt damit Parallelen zur Sprache Ruby, die von vielen Leuten primär wegen des Full-Stack-Frameworks Ruby on Rails verwendet wird.
Dart hat in der Vergangenheit mit den Major-Versionen 2 und 3 ein paar Breaking Changes eingeführt, darunter insbesondere am Typsystem, aber auch am Tooling. In Anbetracht des eher kleinen Ökosystems kann das schnell dazu führen, dass eingesetzte Bibliotheken mit der neuesten Version von Dart nicht mehr kompatibel sind bzw. verzögert aktualisiert werden.
Zwei Designentscheidungen von Dart gefallen mir nicht so sehr: Während man z.B. in JavaScript und Kotlin auf das Semikolon am Ende eines Befehls verzichten kann, ist dieses in Dart obligatorisch. Es gibt keine Zugriffsmodifikatoren wie private
und public
für Variablen, Methoden und Klassen. Stattdessen kennzeichnet ähnlich wie in Python ein vorangestellter Unterstrich ein privates Feld. Dart kennt übrigens keine Character-Klasse, stattdessen muss man auf einen String zurückgreifen. Da dies in der Regel nicht weh tut und man sich bei Bedarf seine eigene Klasse schreiben kann, finde ich das verschmerzbar.
Datenblatt
Name | Dart |
Webseite | https://dart.dev/ |
Erscheinungsjahr | 2011 |
Aktuellste Version (Stand 16. Juli 2023) | Version 3.0.5 vom 13. Juli 2022 |
Typisierung | optional |
Paradigmen | objektorientiert, funktional, aspektorientiert |
Pros | Cons |
---|---|
leicht zu erlernen, bewährte Syntax | nicht so verbreitet |
gute Dokumentation | verhältnismäßig kleine Community und Ökosystem |
umfangreiche Standardbibliothek | gelegentliche Breaking Changes |
viel syntaktischer Zucker für hohe Produktivtät | Syntax: verpflichtendes Semikolon zum Befehlsabschluss, keine Zugriffsmodifikatoren als Schlüsselwörter |
Guter Umgang mit Null | |
Objektorientierung | |
gute Performance und Speichersicherheit | |
Ausführung als self-contained executable, mit Laufzeitumgebung oder als JavaScript-Code |
virtuallet
virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Dart-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.
- Dart 2 migration guide - Dart 3 migration guide