2 puntos por GN⁺ 2025-02-05 | 1 comentarios | Compartir por WhatsApp

¿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

 
GN⁺ 2025-02-05
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

    • Un consejo para el autor: spec-test incluye formas complejas de wasm en texto, pero si usas el convertidor wast2json, puedes obtener una descripción JSON más simple y archivos wasm binarios comunes
  • Pregunta de principiante:

    • Me pregunto cómo se depura cuando no se programa el intérprete directamente
    • Me pregunto qué tan efectivo es hacer fuzzing de opcodes en forma de cadenas
    • Me pregunto cuánta diferencia real hay entre un motor WASM del lado del servidor y uno basado en navegador, y cuánto trabajo se necesita para convertir uno en el otro
  • 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

    • Es una API adoptada por la mayoría de los runtimes de Wasm (Wasmmer, V8, wasmi, etc.), y como está escrita en C, los desarrolladores familiarizados con esa API pueden probarla fácilmente
    • Si el autor está familiarizado con Wasm, también sería bienvenido que contribuyera parches o mejoras a Wasmer
  • Punto debatible:

    • Me pregunto si hay interés en agregar las instrucciones iniciales de tail call
    • Los responsables del estándar de WASM lo rechazaron por considerarlo "de alto nivel", pero el comité de C también rechazó la propuesta de Dennis Ritchie. Rob Pike también parece apoyar la dirección de Ritchie. Si no, ¿para qué habría creado Golang? Las tail calls solo son de alto nivel cuando la llamada es de alto nivel
  • 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