Biblioteca de conversión de tipo de datos de ensamblaje web

Si bien estoy muy entusiasmado con el concepto de WebAssembly y poder codificar para el navegador en C, me decepciona que solo admita tipos de datos numéricos simples.

Por ejemplo, vea la respuesta a esta pregunta , que dice

WebAssembly no admite de forma nativa un tipo de cadena, sino que admite tipos de valor i32/i64/f32/f64 , así como i8/i16 para almacenamiento.

Obviamente, habrá requisitos para pasar listas/matrices/objetos de JavaScript y devolver, entre otros, cadenas C, matrices y estructuras.

Dado que estos se pueden representar como una matriz de bytes, no debería haber problemas para convertirlos.

Sin embargo, antes de desarrollar la rueda mawg, pensé que sería mejor preguntar si alguien ya ha lanzado alguna biblioteca para hacerlo.

Actualmente estoy codificando Angular Js v1.X, por lo que JS directo debería manejar eso bien. Sin embargo, también planeo pasarme a Angular 4 (o el número que le hayan dado este mes) y no estoy tan seguro acerca de Type Script.

Codificaré mi Web Assembly en C, haciendo que el soporte de C sea "imprescindible", mientras que el soporte de C++ sería "bueno tenerlo".

Si está actualizando a Angular moderno, use TypeScript . Angular utiliza las características de TS para brindarle mejores herramientas y demás.
Gracias. Ya me había dado cuenta de eso, pero todavía estoy en medio de dos proyectos 1.X. Tenía miedo de mudarme hasta que se portaron algunas bibliotecas que uso, pero parece que eso se ha hecho ahora. Terminaré con esos dos y aprenderé (suspiro) otro lenguaje de programación más. El tuyo fue un buen comentario, para otros que lean esto (+1)
FWIW, TypeScript es muy fácil de iniciar, ya que proviene de JavaScript. Puede comenzar simplemente escribiendo JavaScript en un .tsarchivo y agregar maquinaria de tipo de forma incremental en la parte superior como desee.
Y, veamos cuánto de eso puedo reemplazar con WebAssembly. :-) El desarrollo web es solo un pasatiempo o un trabajo secundario. Mi sostén diario es la codificación de sistemas integrados, principalmente en C o C++.

Respuestas (3)

Si ya está utilizando Emscripten (o incluso si no lo está), su preámbulo ofrece algunas extensiones convenientes WebAssembly.Moduleen el lado de JavaScript para facilitar la interacción con las funciones compatibles con C FFI. A saber (abreviado, ver enlaces para más información):

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

Llame a una función C compilada desde JavaScript. La función ejecuta una función C compilada desde JavaScript y devuelve el resultado.

returnTypey argTypesle permite especificar los tipos de parámetros y el valor de retorno. Los tipos posibles son "number", "string"o "array", que corresponden a los tipos de JavaScript apropiados. Utilícelo "number"para cualquier tipo numérico o puntero C, "string"para C char*que representan cadenas y "array"para matrices de JavaScript y matrices con tipo; para arreglos tipados, debe ser a Uint8Arrayo Int8Array.

cwrap( ident, returnType, argTypes )

Devuelve un contenedor de JavaScript nativo para una función de C. Esto es similar a ccall(), pero devuelve una función de JavaScript que se puede reutilizar tantas veces como sea necesario.

En particular, el uso del "string"valor de argumento/retorno maneja la conversión entre cadenas JavaScript y cadenas C char*(para apilar espacio).

Actualmente, no creo que haya bibliotecas preexistentes para manejar FFI para tipos más grandes. node-ffiexiste como una biblioteca para manejar FFI entre el tiempo de ejecución de NodeJS y las bibliotecas dinámicas, y parte de su maquinaria puede ser reutilizable para interactuar con un tiempo de ejecución de WASM.

Sin embargo, creo que puede haber entendido mal el propósito de WebAssembly. WebAssembly no reemplaza a JavaScript .

¿WebAssembly está tratando de reemplazar JavaScript?

¡No! WebAssembly está diseñado para ser un complemento, no un reemplazo, de JavaScript. Si bien WebAssembly permitirá, con el tiempo, que muchos idiomas se compilen en la Web, JavaScript tiene un impulso increíble y seguirá siendo el único y privilegiado (como se describe anteriormente) idioma dinámico de la Web. Además, se espera que JavaScript y WebAssembly se utilicen juntos en varias configuraciones:

  • Aplicaciones de C++ completas y compiladas que aprovechan JavaScript para unir las cosas.
  • Interfaz de usuario de HTML/CSS/JavaScript en torno a un lienzo central principal controlado por WebAssembly, lo que permite a los desarrolladores aprovechar el poder de los marcos web para crear experiencias accesibles y nativas de la web.
  • Principalmente aplicación HTML/CSS/JavaScript con algunos módulos WebAssembly de alto rendimiento (por ejemplo, gráficos, simulación, procesamiento de imagen/sonido/video, visualización, animación, compresión, etc., ejemplos que ya podemos ver en asm.js hoy) lo que permite a los desarrolladores reutilizar bibliotecas populares de WebAssembly al igual que las bibliotecas de JavaScript actuales.
  • Cuando WebAssembly obtenga la capacidad de acceder a los objetos recolectados en la basura 🦄 , esos objetos se compartirán con JavaScript y no vivirán en un mundo amurallado propio.

Incluso dicho esto, todas las bibliotecas de JavaScript se basan en la expresividad del lenguaje JavaScript y no se traducirán bien a otros idiomas. Bibliotecas como React, Angular y Vue utilizan la escritura dinámica de JavaScript para habilitar partes clave de su funcionalidad.

Aún así, estoy abierto a ver qué es posible. WASM es todavía una bestia joven y en crecimiento, y lo que hoy es un sueño imposible puede ser posible en los próximos años. Si haces algo genial, ¡asegúrate de compartirlo!

Mi respuesta anterior a la nota al margen de Alternative to JavaScript sobre WASM puede haber tergiversado su alcance. En ese momento, agregué una segunda respuesta desde otro punto de vista que aclara un poco WASM y responde esa pregunta original de manera separada de mi primera respuesta también.

¡Ahora hay una biblioteca que hace mucho de esto (para Rust)!

estándar web: https://github.com/koute/stdweb

objetivos de diseño

  • Exponga un conjunto completo de API web tal como lo exponen los navegadores web.

  • Trate de seguir las convenciones y la estructura de JavaScript original tanto como sea posible, excepto en los casos en que hacer lo contrario resulte en un diseño claramente superior.

  • Ser un bloque de construcción a partir del cual se puedan construir marcos y bibliotecas de nivel superior.

  • Haga que sea conveniente y fácil incrustar código JavaScript directamente en Rust y ordenar datos entre los dos.

  • Integre con el ecosistema Rust más amplio, por ejemplo, admita la clasificación de estructuras que implementan Serializable de serde.

  • Ponga a Rust en el asiento del conductor donde se puede escribir una aplicación web no trivial sin tocar JavaScript en absoluto.

  • Permita que Rust participe en la próxima revolución de WebAssembly.

  • Haga posible la creación trivial de bibliotecas independientes a las que se pueda llamar fácilmente desde JavaScript.

Siguiendo la respuesta de @ CAD97 , wasm-bindgen ya está disponible. Hace todo lo posible para exponer toda la funcionalidad de JavaScript a las aplicaciones de Rust compiladas en WebAssembly.

Aquí se documenta un ejemplo del uso de una macro serde para codificar y decodificar automáticamente estructuras a/desde objetos javascript.