Konvertierungsbibliothek für Webassembly-Datentypen

Obwohl ich sehr begeistert von dem Konzept von WebAssembly bin und in der Lage bin, für den Browser in C zu programmieren, bin ich enttäuscht, dass es nur einfache numerische Datentypen unterstützt.

Siehe zum Beispiel die Antwort auf diese Frage , die besagt

WebAssembly unterstützt nativ keinen Zeichenfolgentyp, sondern unterstützt i32 / i64 / f32 / f64- Werttypen sowie i8 / i16 für die Speicherung.

Offensichtlich wird es Anforderungen geben, JavaScript-Listen/Arrays/Objekte zu übergeben und unter anderem C-Strings, Arrays und Strukturen zurückzugeben.

Da diese als Array von Bytes dargestellt werden können, sollte es wenig Probleme geben, sie zu konvertieren.

Bibliothek dafür veröffentlicht hat .

Ich codiere derzeit Angular Js v1.X, also sollte Straight JS damit gut umgehen können. Ich plane jedoch auch, zu Angular 4 zu wechseln (oder welche Nummer sie ihm diesen Monat gegeben haben) und bin mir bei Type Script nicht so sicher.

Ich werde meine Web-Assembly in C programmieren, was die C-Unterstützung zu einem "must have" macht, während die C++-Unterstützung "nice to have" wäre.

Wenn Sie auf das moderne Angular upgraden, verwenden Sie TypeScript . Angular nutzt die Funktionen von TS, um Ihnen bessere Werkzeuge und dergleichen zur Verfügung zu stellen.
Danke. Ich hatte das irgendwie herausgefunden, bin aber immer noch mitten in zwei 1.X-Projekten. Ich hatte Angst, umzuziehen, bis einige Bibliotheken, die ich verwende, portiert wurden, aber das scheint jetzt geschehen zu sein. Ich werde diese beiden erledigen und noch eine weitere Programmiersprache lernen (seufz). Dein Kommentar war gut, für andere, die dies lesen (+1)
FWIW, TypeScript ist sehr einfach zu starten, da es aus JavaScript stammt. Sie können damit beginnen, einfach JavaScript in eine .tsDatei zu schreiben, und nach Belieben schrittweise Typmaschinen hinzufügen.
Und mal sehen, wie viel davon ich durch WebAssembly ersetzen kann? :-) Webentwicklung ist nur ein Hobby/Nebenjob. Mein Hauptverdiener ist das Programmieren eingebetteter Systeme, hauptsächlich in C oder C++.

Antworten (3)

Wenn Sie Emscripten bereits verwenden (oder auch nicht), bietet die Präambel auf der JavaScript-Seite einige praktische Erweiterungen, WebAssembly.Moduleum die Interaktion mit C FFI-kompatiblen Funktionen zu vereinfachen. Nämlich (abgekürzt, siehe Links für weitere Informationen):

ccall( ident, returnType, argTypes, args, opts )

Rufen Sie eine kompilierte C-Funktion aus JavaScript auf. Die Funktion führt eine kompilierte C-Funktion aus JavaScript aus und gibt das Ergebnis zurück.

returnTypeund argTypeslassen Sie die Parametertypen und den Rückgabewert angeben. Die möglichen Typen sind "number", "string"oder "array", die den entsprechenden JavaScript-Typen entsprechen. Verwenden Sie "number"für jeden numerischen Typ oder C-Zeiger, "string"für C char*, das Zeichenfolgen darstellt, und "array"für JavaScript-Arrays und typisierte Arrays; für typisierte Arrays muss es ein Uint8Arrayoder sein Int8Array.

cwrap( ident, returnType, argTypes )

Gibt einen nativen JavaScript-Wrapper für eine C-Funktion zurück. Dies ist ähnlich wie ccall(), gibt aber eine JavaScript-Funktion zurück, die so oft wie nötig wiederverwendet werden kann.

Insbesondere die Verwendung des "string"Arguments/Rückgabewerts handhabt die Konvertierung zwischen JavaScript-Strings und C- char*Strings (zum Stapeln von Speicherplatz).

Derzeit glaube ich nicht, dass es bereits vorhandene Bibliotheken für die Handhabung von FFI für größere Typen gibt. node-ffiexistiert als Bibliothek für die Handhabung von FFI zwischen der NodeJS-Laufzeit und dynamischen Bibliotheken, und einige ihrer Mechanismen können für die Verbindung mit einer WASM-Laufzeit wiederverwendet werden.

Ich denke jedoch, dass Sie den Zweck von WebAssembly möglicherweise missverstanden haben. WebAssembly ersetzt JavaScript nicht .

Versucht WebAssembly, JavaScript zu ersetzen?

NEIN! WebAssembly ist als Ergänzung, nicht als Ersatz für JavaScript konzipiert. Während WebAssembly im Laufe der Zeit die Kompilierung vieler Sprachen für das Web ermöglichen wird, hat JavaScript eine unglaubliche Dynamik und wird die einzige, privilegierte (wie oben beschrieben) dynamische Sprache des Webs bleiben. Darüber hinaus wird erwartet, dass JavaScript und WebAssembly in einer Reihe von Konfigurationen zusammen verwendet werden:

  • Ganze, kompilierte C++-Apps, die JavaScript nutzen, um Dinge zusammenzufügen.
  • HTML/CSS/JavaScript-Benutzeroberfläche um einen von WebAssembly gesteuerten Hauptbereich herum, der es Entwicklern ermöglicht, die Leistungsfähigkeit von Web-Frameworks zu nutzen, um zugängliche, webnative Erfahrungen zu erstellen.
  • Größtenteils HTML/CSS/JavaScript-App mit einigen leistungsstarken WebAssembly-Modulen (z. B. Grafik, Simulation, Bild-/Ton-/Videoverarbeitung, Visualisierung, Animation, Komprimierung usw., Beispiele, die wir heute bereits in asm.js sehen) Dadurch können Entwickler beliebte WebAssembly-Bibliotheken genauso wiederverwenden wie heute JavaScript-Bibliotheken.
  • Wenn WebAssembly die Möglichkeit erhält, auf Objekte aus der Garbage Collection zuzugreifen 🦄 , werden diese Objekte mit JavaScript geteilt und leben nicht in einer eigenen, abgeschlossenen Welt.

Trotzdem sind alle JavaScript-Bibliotheken um die Ausdruckskraft der JavaScript-Sprache herum aufgebaut und lassen sich nicht gut in andere Sprachen übersetzen. Bibliotheken wie React, Angular und Vue verwenden die dynamische Typisierung von JavaScript, um wichtige Teile ihrer Funktionalität zu aktivieren.

Trotzdem bin ich offen dafür, was möglich ist. WASM ist noch ein junges, wachsendes Tier, und was heute noch ein Wunschtraum ist, könnte in den kommenden Jahren möglich sein. Wenn du etwas Cooles machst, teile es unbedingt!

Meine frühere Antwort auf die Randnotiz von Alternative to JavaScript zu WASM hat möglicherweise den Umfang falsch dargestellt. Zu diesem Punkt habe ich eine zweite Antwort aus einem anderen Blickwinkel hinzugefügt, die WASM ein wenig verdeutlicht und diese ursprüngliche Frage auch getrennt von meiner ersten Antwort beantwortet.

Es gibt jetzt eine Bibliothek, die vieles davon erledigt (für Rust)!

stdweb: https://github.com/koute/stdweb

Designziele

  • Stellen Sie eine vollständige Suite von Web-APIs bereit, wie sie von Webbrowsern bereitgestellt werden.

  • Versuchen Sie, den ursprünglichen JavaScript-Konventionen und -Strukturen so weit wie möglich zu folgen, außer in Fällen, in denen eine andere Vorgehensweise zu einem deutlich besseren Design führt.

  • Seien Sie ein Baustein, aus dem Frameworks und Bibliotheken auf höherer Ebene erstellt werden können.

  • Machen Sie es bequem und einfach, JavaScript-Code direkt in Rust einzubetten und Daten zwischen den beiden zu marshallieren.

  • Integrieren Sie sich in das breitere Rust-Ökosystem, z. B. Unterstützung des Marshallings von Strukturen, die Serdes Serializable implementieren.

  • Setzen Sie Rust auf den Fahrersitz, wo eine nicht-triviale Webanwendung geschrieben werden kann, ohne JavaScript überhaupt zu berühren.

  • Lassen Sie Rust an der bevorstehenden WebAssembly (Re)volution teilhaben.

  • Ermöglicht es, auf einfache Weise eigenständige Bibliotheken zu erstellen, die einfach von JavaScript aus aufgerufen werden können.

Nach der Antwort von @ CAD97 ist wasm-bindgen jetzt verfügbar. Es tut sein Bestes, um alle Javascript-Funktionen für Rust-Anwendungen verfügbar zu machen, die für WebAssembly kompiliert wurden.

Hier ist ein Beispiel für die Verwendung eines serde-Makros dokumentiert , um Strukturen automatisch in/aus Javascript-Objekten zu codieren und zu decodieren.