WebAssembly
===========

WebAssembly es un nuevo tipo de código que puede ser ejecutado en navegadores modernos — es un lenguaje de bajo nivel, similar al lenguaje ensamblador, con un formato binario compacto que se ejecuta con rendimiento casi nativo y provee un objetivo de compilación para lenguajes como C/C++ y Rust que les permite correr en la web. También está diseñado para correr a la par de JavaScript, permitiendo que ambos trabajen juntos.

En pocas palabras
-----------------

WebAssembly tiene grandes implicaciones para la plataforma web — provee una forma de correr código escrito en múltiples lenguajes en la web a una velocidad casi nativa, con aplicaciones cliente corriendo en la web que anteriormente no podrían haberlo hecho.

WebAssembly esta diseñado para complementar y correr a la par de JavaScript — usando las APIs WebAssembly de JavaScript, puedes cargar módulos de WebAssembly en una aplicación JavaScript y compartir funcionalidad entre ambos. Esto te permite aprovechar el rendimiento y poder de WebAssembly y la expresividad y flexibilidad de JavaScript en las mismas aplicaciones, incluso si no sabes cómo escribir código WebAssembly.

Y lo mejor es que está siendo desarrollado como un estándar web a través del grupo de trabajo de WebAssembly del W3C y su grupo comunitario con las participación activa de todos los principales fabricantes de navegadores.

Guías
-----

Conceptos de WebAssembly

Empieza leyendo los conceptos de alto nivel detrás de WebAssembly — qué es, por qué es tan útil, cómo encaja en la plataforma web (y más allá), y cómo usarlo.

Compilar un nuevo módulo de C/C++ a WebAssembly (en-US)

Al escribir código en C/C++, puedes compilarlo a .wasm usando una herramienta como Emscripten. Veamos cómo funciona.

Compilar un módulo existente de C a WebAssembly (en-US)

Uno de los principales casos de uso para WebAssembly es tomar las librerías existentes del ecosistema de C y permitir que los desarrolladores los usen en la web.

Compilar de Rust a WebAssembly (en-US)

Si has escrito algo en Rust, ¡puedes compilarlo a WebAssembly! Este tutorial te enseña todo lo que necesitas saber para compilar un proyecto de Rust a wasm y usarlo en una aplicación web existente.

Cargar y ejecutar código WebAssembly

Una vez que tengas un .wasm, este artículo cubre cómo recuperarlo, compilarlo e instanciarlo, combinando la API de WebAssembly de JavaScript con las APIs Fetch o XHR.

Usar la API WebAssembly de JavaScript (en-US)

Una vez cargado el módulo .wasm, querrás usarlo. En este artículo te mostramos cómo usar WebAssembly mediante la API WebAssembly de JavaScript.

Funciones exportadas de WebAssembly (en-US)

Las funciones exportadas de WebAssembly son el reflejo en JavaScript de las funciones de WebAssembly que te permiten llamar código WebAssembly desde JavaScript. Este artículo las describe.

Entendiendo el formato de texto WebAssembly (en-US)

Este artículo explica el formato de texto wasm. Esta es la representación textual de bajo nivel de un módulo .wasm, mostrada en las herramientas de desarrollador del navegador al depurar.

Convertir el formato de texto WebAssembly a wasm (en-US)

Este artículo provee una guía para convertir un módulo de WebAssembly escrito en su formato de texto a un binario .wasm.

Referencia de la API
--------------------

`WebAssembly`

Este objeto sirve como espacio de nombres para toda funcionalidad relacionada a WebAssembly.

`WebAssembly.Global()` (en-US)

El objeto `WebAssembly.Global` representa una instancia variable global, accesible desde JavaScript e importable/exportable a través de una o más instancias de `WebAssembly.Module` (en-US). Esto permite el enlace dinámico de varios módulos.

`WebAssembly.Module()` (en-US)

El objeto `WebAssembly.Module` contiene código WebAssembly sin estado que ha sido ya compilado por el navegador y puede ser compartido con workers (en-US) e instanciado varias veces.

`WebAssembly.Instance()` (en-US)

Un objeto `WebAssembly.Instance` es una instancia ejecutable y con estado de un `Module`. Los objetos `Instance` contienen todas las funciones exportadas de WebAssembly (en-US) que permiten llamar a código WebAssembly desde JavaScript.

`WebAssembly.instantiateStreaming()` (en-US)

La función `WebAssembly.instantiateStreaming()` es la principal API para compilar e instanciar código WebAssembly, retornando tanto un `Module` como su primera `Instance`.

`WebAssembly.Memory()` (en-US)

Un objeto `WebAssembly.Memory` es un `ArrayBuffer` redimensionable que contiene los bytes de memoria accedidos por una `Instance`.

`WebAssembly.Table()` (en-US)

Un objeto `WebAssembly.Table` es un arreglo tipado redimensionable de valores opacos, como referencias a funciones, que son accedidos por una `Instance`.

`WebAssembly.CompileError()` (en-US)

Crea un nuevo objeto `CompileError` de WebAssembly.

`WebAssembly.LinkError()` (en-US)

Crea un nuevo objeto `LinkError` de WebAssembly.

`WebAssembly.RuntimeError()` (en-US)

Crea un nuevo objeto `RuntimeError` de WebAssembly.

Ejemplos
--------

* WASMSobel
* Consulta nuestro repositorio webassembly-examples para ver otros ejemplos.
Especificaciones
----------------

| Specification |
| --- |
| WebAssembly JavaScript Interface  |

Compatibilidad con navegadores
------------------------------

{{Compat}}Ver también
-----------

* WebAssembly en Mozilla Research
* webassembly.org
* Artículos de WebAssembly en el blog Mozilla Hacks
* Grupo comunitario de WebAssembly del W3C
* Cabecera HTTP Large-Allocation (en-US)
* Compilar una librería de C a Wasm