Dart 3.3 cible WebAssembly

Par:
fredericmazue

mer, 21/02/2024 - 12:11

Google a annoncé la disponibilité d'une nouvelle version de son langage maison : Dart 3.3. Il s'agit d'une version majeure en raison des nouveautés quelle apporte. Une des caractéristiques de Dart est que la compilation de code source pouvait à la base cibler JavaScript ou du code natif. Une des nouveautés principales de Dart 3.3 est que la compilation peut cibler WebAssembly. Cette possibilié est toutefois au stade expérimental avec dart 3.3.

Types d'extension

Dart 3.3 apporte aussi les types d'extention.  Ceux-ci introduisent des wrappers sans surcoût de performances pour les types. Ils peuvent être utilisés pour optimiser le code sensible aux performances, en particulier lors de l'interopérabilité avec les plates-formes hôtes. Les types d'extension offrent la commodité des types personnalisés avec des membres spécifiques tout en éliminant la surcharge typique d'allocation de wrapper.

extension type Wrapper(int i) {
  void showValue() {
    print('my value is $i');
  }
}

void main() {
  final wrapper = Wrapper(42);
  wrapper.showValue(); // Prints 'my value is 42'
}

L'exemple ci-dessus définit Wrapper comme un type d'extension, mais l'utilise comme un type Dart trivial. Vous pouvez l'instancier et appeler des fonctions. La principale différence est que Dart le compile comme un int Dart. Les types d’extension permettent de créer facilement un type avec des membres uniques sans le coût indirect lié à l’allocation d’un type wrapper typique.

Evolution de l'interopérabilité JavaScript

Dart 3.3 introduit un nouveau modèle d'interopérabilité avec les bibliothèques JavaScript et le Web. Cela commence par un nouvel ensemble d'API pour interagir avec JavaScript : la bibliothèque dart:js_interop. Les développeurs Dart ont désormais accès à une API typée pour interagir avec JavaScript. Cette API définit clairement la frontière entre les deux langages avec une application statique. Cela élimine toute une classe de problèmes avant la compilation. En plus des nouvelles API permettant d'accéder au code JavaScript, Dart inclut désormais un nouveau modèle pour représenter les types JavaScript dans Dart à l'aide de types d'extension.

import 'dart:js_interop';

/// Represents the `console` browser API.
extension type MyConsole(JSObject _) implements JSObject {
  external void log(JSAny? value);
  external void debug(JSAny? value);
  external void info(JSAny? value);
  external void warn(JSAny? value);
}

La syntaxe, basée sur les types d'extension, permet plus d'expression et de solidité que les membres d'extension. Cela simplifie l'exploitation des API JavaScript de Dart.