Ir al contenido principal

WebAssembly con Rust

 

WebAssembly es un lenguaje de bajo nivel, similar a ensamblador, diseñado para ser rápido de cargar y ejecutar en navegadores modernos. Su objetivo es permitir que aplicaciones escritas en distintos lenguajes se ejecuten en la web con velocidad casi nativa.

Los formatos que soporta son:

  • .wasm: un formato binario ejecutable. 
  • .wat: un formato formato de texto legible.

Se complementa con JavaScript; permite invocar funciones WASM desde JS y viceversa.

Como hemos visto en este blog:

  • Si quieres usar WebAssembly con C/C++ tendrás que usar Emscripten
  • Si quieres usar WebAssembly con Python puedes usar Pyodide.

También puedes optar por usar un lenguaje como Grain cuya compilación es directa a WASM.

¿Cuál es el objetivo de WebAssembly?

El objetivo de WebAssembly es compilar código escrito en lenguajes como Rust, C o C++ (entre otros) y transformarlo en un módulo .wasm que puede ejecutarse en navegadores o en entornos como Node.js con rendimiento cercano al nativo.

Flujo típico de trabajo con WebAssembly

Los pasos son los siguientes:

  1. Escribimos nuestro código en un lenguaje soportado (ej. Rust, C, C++, Go, AssemblyScript). 
  2. Compilamos ese código a WebAssembly y se generará un archivo.wasm
  3. Cargamos el módulo en tu aplicación web usando JavaScript (ver el ejemplo de abajo).
  4. Ejecutamos las funciones exportadas desde el módulo .wasm (ver el ejemplo de abajo) como si fueran algo nativo.

Imaginemos que he creado un programa en C con una función denominada ``miFuncion`` que recibe dos parámetros tipo int y devuelve su suma. Usaría la herramienta Emscripten para generar un código WASM. Este código .wasm podía usarlo desde una página web con  JS de esta manera:

const wasmModule = await WebAssembly.instantiateStreaming(fetch("modulo.wasm"));
console.log(wasmModule.instance.exports.miFuncion(5, 7));

Empezando con Rust y WebAssembly

Crearemos una aplicación que determine si un número entero es o no mayor a 100. Posteriormente compilaremos ese código a código .wasm para que se ejecute en una página web.

1. Instalando lo necesario para trabajar con WASM:

$ cargo install wasm-pack

wasm-pack es la herramienta oficial para compilar proyectos Rust a WebAssembly y generar el puente con JavaScript.

2. Crear el proyecto Rust con Cargo:

$ cargo new --lib numero_wasm
$ cd numero_wasm

3. Editamos el archivo ``Cargo.toml``

[package]
name = "numero_wasm"
version = "0.1.0"
edition = "2024"

[dependencies]
wasm-bindgen = "0.2"

[lib]
crate-type = ["cdylib", "rlib"]

Con esto hemos agregado la dependencia wasm-bindgen, que permite exponer funciones Rust a JavaScript.

4.Creamos el código de la función para evaluar si el número entero es o no mayor a cero.

src/lib.rs

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn comparar_numero(n: i32) -> String {
    if n > 100 {
        format!("{} es mayor que 100", n)
    } else if n < 100 {
        format!("{} es menor que 100", n)
    } else {
        format!("{} es igual a 100", n)
    }
}

5. Compilamos el código a WebAssembly:

$ wasm-pack build --target web

Esto nos generará un directorio ``pkg/`` que contendrá los siguientes archivos:

  • numero_wasm_bg.wasm : el binario WebAssembly
  • numero_wasm.js: el "puente" para usarlo en JavaScript.

6. Creamos una página HTML para probar el código .wasm generado en la compilación:

index.html

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Prueba WebAssembly</title>
</head>
<body>
  <h1>Comparar número con 100</h1>
  <input type="number" id="numero" placeholder="Ingresa un número">
  <button onclick="comparar()">Comparar</button>
  <p id="resultado"></p>

  <script type="module">
    import init, { comparar_numero } from "./pkg/numero_wasm.js";

    async function run() {
      await init();
    }

    run();

    window.comparar = () => {
      const valor = parseInt(document.getElementById("numero").value);
      const resultado = comparar_numero(valor);
      document.getElementById("resultado").textContent = resultado;
    };
  </script>
</body>
</html>

7. Ejecutamos la página web:

$ python -m http.server 8000

En este caso usamos Python para hacerlo, pero podríamos usar http-server de Node.

Abrimos un navegado en la ruta: http://localhost:8000

¡Hemos creado nuestra primera aplicación WebAssembly con Rust!

Continuaremos con este tema en próximas entregas.

Enlaces:

https://webassembly.org/
https://codemonkeyjunior.blogspot.com/2026/04/grain-un-lenguaje-para-webassembly.html

Comentarios

Entradas populares de este blog

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...

TIOBE index 2024

El índice TIOBE (o índice de la comunidad de programación TIOBE) mide la popularidad de los lenguajes de programación. Su índice no se basa en qué lenguaje de programación es mejor, si tiene mejor perfomance, si posee escalabilidad, si es más sencillo de aprender, de usar, de implementar, etc. Sólo se basa en la popularidad. En el número de referencias ya sea en blogs, foros de consulta, etc. No necesariamente si las empresas lo están usando en alguno de sus desarrollos. Este índice es útil para darse una idea qué lenguaje está cobrando más popularidad y prestigio. Enseguida una tabla con los primeros 5 lenguajes más populares. Índice de Noviembre 2024   Nov 2024  Nov 2023  Change  Programming Language  Ratings  Change  1  1    Python  22.85%  +8.69%  2  3  +  C++  10.64%  +0.29%  3  4  +  Java  9.60%  +1.26%  4 ...

Programación Windows Batch (CMD)

En esta serie de post aprenderemos cómo crear nuestros propios archivos Windows Batch. 1. ¿Por qué aprender Batch en Windows? Una de las razones es que, queramos o no, algún día tendremos que trabajar usando sistemas operativos Windows. Crear scripts nos puede servir para realizar tareas que parecen sencillas en un principio, pero que pueden llegar a ser tediosas (ej. crear múltiples carpetas, comprobar la existencia de un archivo, realizar respaldos, etc.). 2. ¿Cómo puedo crear un archivo Batch en Windows? Los archivos batch en Windows pueden ser escritos con las extensiones *.bat o *.cmd. Pueden contener una serie de comandos y secuencias de instrucciones para realizar diversas tareas. Ejemplo 1. Conocer  el nombre del usuario. usuario.bat @ echo off echo Hola %USERNAME% pause GOTO Comentario -- esto es un comentario multi línea que no se interpretará en MS-DOS -- :Comentario En el anterior ejemplo podemos ver que la variable USERNAME conti...