Si hablamos de ergonomía, estoy bastante seguro de que está claro que WebAssembly tiene una ergonomía mucho mejor. El código es mucho más corto y el ejemplo de enlace que te mostré prácticamente no requiere nada para convertir la función nativa de Rust en WebAssembly. Es capaz de convertir tipos básicos como enteros y flotantes. Neon, por otro lado, necesita una capa de enlace para convertir tu código de Rust y JavaScript en Rust. Por lo tanto, la ergonomía sufre un poco en el ejemplo nativo en comparación con el de WebAssembly.
Si hablamos de stdlib, que es todo, la red del sistema, si quieres acceder al sistema operativo, entonces tu única opción es usar módulos nativos de Rust. Porque WebAssembly no puede acceder a las bibliotecas estándar, por lo que no puedes acceder al sistema de archivos, no puedes acceder a la red, a menos que estés dispuesto a esperar una interfaz de sistema de WebAssembly, que aún está en desarrollo, pero están trabajando en hacerla accesible también para WebAssembly.
En cuanto a la portabilidad, funciona en mi máquina, así que siempre debes recordar que el código nativo depende de la máquina, por lo que si lo compilas en macOS, no podrás ejecutarlo en Windows. Entonces, si estás desarrollando en macOS y tu entorno de producción es Linux sin contenedores, debes compilarlo para Linux sin contenedores, por lo que puedes usar Docker para eso. Por otro lado, si compilo mi código en WebAssembly y te doy el ejecutable, podrás ejecutarlo en tu navegador siempre que sea compatible con WebAssembly, lo cual no es cierto para los modelos nativos que compilo en mi máquina. Es muy probable que no puedas hacerlo si tu máquina es diferente. Por ejemplo, si tienes una Mac con procesador Intel y yo tengo una Mac con procesador ARM, entonces necesita ser recompilado, especialmente si tienes una máquina con Windows o Linux, también necesita ser compilado.
Y si hablamos de la barrera de entrada para nuevos desarrolladores, creo que WebAssembly es más fácil. Si quieres introducir código de rendimiento en tu ecosistema de Node.js, te sugiero que uses WebAssembly porque los modelos nativos solo se pueden escribir en C, C++ o Rust. Esos son lenguajes bastante complejos de entender para principiantes, para personas junior. No digo que sea imposible, pero la inversión será bastante grande si solo quieres reescribir una o dos funciones en código nativo de rendimiento. WebAssembly, aunque se puede compilar desde C, C++ o Rust, también tiene soporte parcial para Python, Ruby y Go. Además, existe un lenguaje especializado llamado AssemblyScript que está dedicado a WebAssembly, por lo que siempre puedes comenzar con AssemblyScript y obtener tu versión de WebAssembly, y si necesitas exprimir hasta el último ápice de rendimiento, siempre puedes introducir Rust.
Si pensamos en Node.js o en el navegador, aunque aquí nos centramos más en Node.js, JavaScript sigue siendo el rey en el navegador, y a veces necesitamos ejecutar cosas en el navegador. También debemos recordar que los modelos nativos no se pueden usar en los navegadores, porque JavaScript no tiene soporte para la interfaz de funciones externas. Por lo tanto, los modelos nativos solo se pueden usar en Node.js pero no en el navegador. Por otro lado, WebAssembly se puede utilizar en cualquier lugar donde haya una máquina virtual de WebAssembly disponible. Esto incluye todas las versiones de Node.js, además de todos los navegadores, excepto Internet Explorer. Lamento si necesitas trabajar con Internet Explorer, pero aparte de Internet Explorer, el soporte de WebAssembly abarca toda la pila, incluidos los navegadores móviles. Entonces, si tienes un código que compartes entre el backend y el frontend, tu solución es usar WebAssembly. Si quieres exprimir el rendimiento solo de tu código backend, puedes considerar los modelos nativos de Rust.
Aquí tenemos el resumen, te dejo que lo leas, y solo quiero resaltar dos puntos principales. En mi opinión, los modelos nativos están destinados a extender Node.js con código de rendimiento. Entonces, si quieres mejorar el rendimiento en tu ecosistema de Node.js, los modelos nativos son la forma de hacerlo. Y WebAssembly, en mi opinión, es una forma de reemplazar piezas de código JavaScript que no son eficientes. Entonces, si tienes una función que no es eficiente, te sugiero que intentes reescribirla en WebAssembly, ya sea a través de Rust que se compila a WebAssembly o mediante el uso de AssemblyScript. Y si quieres agregar código de rendimiento a tu Node.js, si quieres ampliar tu ecosistema de Node.js, entonces puedes considerar los modelos nativos con Rust, por ejemplo. Muchas gracias. Puedes encontrarme en Twitter, GitHub, LinkedIn y puedes escanear el código QR para ir a mi blog. Puedes encontrar enlaces a dos artículos en los que se basa esta charla. En mi GitHub, puedes encontrar un enlace a los repositorios de GitHub tanto para las versiones de Rust como para las de WebAssembly, que puedes clonar, ejecutar, jugar con ellos, experimentar. Gracias por escuchar. Espero que hayas aprendido algo nuevo. Puede ser eficiente, no por sí mismo, sino con la ayuda de Rust. Espero que encuentres utilidad para tus nuevos conocimientos. Gracias.
Comments