¿Qué es WebAssembly?
- WebAssembly es un conjunto de instrucciones estandarizado y un formato de bytecode diseñado para ejecutar código del lado del cliente no confiable en navegadores web a velocidades casi nativas.
- Evolucionó a partir de Emscripten, un compilador de C/C++ a JavaScript, que en sus inicios convertía LLVM IR a JavaScript para permitir la ejecución de código C y C++ en la web.
- Con el tiempo, los desarrolladores de navegadores colaboraron con el proyecto Emscripten para crear un subconjunto simple de JavaScript orientado a la optimización de rendimiento, que se estandarizó como asm.js.
- Después, para evitar la sobrecarga de JavaScript, se diseñó un formato de bytecode independiente, y ese fue Wasm.
- Recientemente, WebAssembly también ha ganado popularidad fuera del navegador, y Fastly y Shopify han construido productos de Edge Compute y Functions basados en motores de WebAssembly.
- WebAssembly es una plataforma atractiva para construir ecosistemas de plugins gracias a su capacidad de ser objetivo de varios lenguajes fuente.
¿Por qué un intérprete de WebAssembly?
- Como muchos ingenieros de software, había caído en el patrón de empezar un nuevo proyecto paralelo y perder el interés unas semanas después.
- Necesitaba un proyecto grande en el que pudiera invertir esfuerzo durante un período sostenido, y que además me expusiera a capas más bajas del stack de computación.
- Empecé a interesarme por el hype alrededor de WebAssembly y me pareció una herramienta atractiva de ingeniería de plataformas con la que se pueden diseñar llamadas al sistema personalizadas.
Semblance
- Decidí escribir un intérprete de WebAssembly para familiarizarme con la WebAssembly Core Specification.
- Como el objetivo del proyecto era aprender, no planeaba implementar todos los opcodes ni pasar el core test suite completo.
- Me daría por satisfecho si lograba ejecutar un simple "Hello, World!".
Resultado
- El proyecto se considera un gran éxito. La cobertura de opcodes no es completa, pero puede ejecutar un programa simple de "Hello, World!".
- El código es desordenado, lento, tiene fugas de memoria y podría ser vulnerable a módulos maliciosos, pero funciona.
- Aprendí mucho sobre la especificación central de WebAssembly y pude salir de mi zona de confort como ingeniero.
- Ahora siento que he adquirido suficiente conocimiento sobre WebAssembly como para contribuir a runtimes industriales como Wasmtime.
1 comentarios
Comentarios en Hacker News
Tengo experiencia escribiendo un intérprete de Wasm en Scheme, así que me alegra ver a otras personas hacerlo por su cuenta. Wasm es menos difícil de lo que parece, y recomendaría intentarlo aunque sea lo suficiente como para divertirse, sin necesidad de implementar todas las instrucciones
spec-testincluye formas complejas de wasm en texto, pero si usas el convertidorwast2json, puedes obtener una descripción JSON más simple y archivos wasm binarios comunesPregunta de principiante:
Encontré un artículo interesante sobre interpretar WASM directamente
Es un enfoque interesante y un gran trabajo
Creo que habría sido una buena idea adoptar la Wasm-C-API como interfaz estándar
Punto debatible:
Recomiendo revisar Orca. Sería una buena oportunidad para contribuir: https://orca-app.dev
Es realmente genial ver el proceso de explorar WebAssembly a fondo y construir un intérprete desde cero
Gran artículo; me motiva a volver a la implementación de WASM
Un trabajo realmente genial