{"id":713,"date":"2025-02-23T21:42:47","date_gmt":"2025-02-23T21:42:47","guid":{"rendered":"https:\/\/cloudlab.urv.cat\/catedracloud\/?p=713"},"modified":"2025-02-26T07:43:50","modified_gmt":"2025-02-26T07:43:50","slug":"webassembly-portabilidad-sin-sacrificar-rendimiento","status":"publish","type":"post","link":"https:\/\/cloudlab.urv.cat\/catedracloud\/2025\/02\/23\/webassembly-portabilidad-sin-sacrificar-rendimiento\/","title":{"rendered":"WebAssembly: portabilidad sin sacrificar rendimiento"},"content":{"rendered":"\n<figure class=\"wp-block-pullquote has-text-align-left\"><blockquote><p>WebAssembly es un formato binario portable que promete aislamiento, rendimiento cercano al nativo y alta portabilidad con un entorno de ejecuci\u00f3n con bajos requerimientos de recursos. <a href=\"https:\/\/x.com\/solomonstre\/status\/1111004913222324225?lang=en\" data-type=\"link\" data-id=\"https:\/\/x.com\/solomonstre\/status\/1111004913222324225?lang=en\">En palabras del propio creador de Docker<\/a>, WebAssembly podr\u00eda venir a reemplazar las tecnolog\u00edas de containerizaci\u00f3n cl\u00e1sicas con m\u00e1quinas virtuales mucho m\u00e1s ligeras y f\u00e1ciles de desplegar.  A simple vista portabilidad y rendimiento parecen incompatibles. \u00bfC\u00f3mo ha logrado WebAssembly conseguir las dos?<\/p><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Contexto<\/h2>\n\n\n\n<p>WebAssembly es una tecnolog\u00eda que permite ejecutar c\u00f3digo de alto rendimiento en navegadores y entornos fuera de la web. Fue introducido en 2015 por el W3C como una respuesta a la necesidad de ejecutar aplicaciones complejas con la eficiencia cercana al c\u00f3digo nativo sin depender exclusivamente de JavaScript. <\/p>\n\n\n\n<p>Dise\u00f1ado como un formato binario compacto y seguro, WebAssembly permite compilar c\u00f3digo escrito en lenguajes como C, C++, Rust y otros, para ejecutarse en una m\u00e1quina virtual. Por ello, se podr\u00eda decir que WebAssembly es una tecnolog\u00eda de virtualizaci\u00f3n. Sus principales caracter\u00edsticas incluyen portabilidad, rendimiento cercano al nativo, seguridad mediante un entorno de ejecuci\u00f3n aislado (sandboxing) y compatibilidad con la gran mayor\u00eda de navegadores actuales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La portabilidad en WebAssembly<\/h2>\n\n\n\n<p>El software que se ejecuta en las m\u00e1quinas se escribe habitualmente en un<strong> lenguaje de alto nivel<\/strong> (C, C++, Rust, etc.), que es compilado a un <strong>archivo binario<\/strong>. Este archivo binario contiene las <strong>instrucciones que se dar\u00e1n al procesador<\/strong> para ejecutar ese c\u00f3digo. Los binarios son espec\u00edficos de una <strong>determinada plataforma<\/strong> (tipo de procesador y sistema operativo), lo que limita su portabilidad a la hora de distribuirlos en m\u00e1quinas de distintas caracter\u00edsticas. Existen algunas soluciones como los <strong>lenguajes interpretado<\/strong>s como Python, cuyo c\u00f3digo es transformado en instrucciones binarias en tiempo de ejecuci\u00f3n, o los lenguajes como Java, que se compilan a un formato binario que no es espec\u00edfico de una determianda plataforma y se ejecuta en su propia <strong>m\u00e1quina virtual<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.researchgate.net\/figure\/WebAssembly-data-flow-architecture_fig1_373229823\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"486\" src=\"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/image-2.png\" alt=\"\" class=\"wp-image-1044\" srcset=\"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/image-2.png 711w, https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/image-2-300x205.png 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/a><\/figure>\n\n\n\n<p>WebAssembly se encuentra en esta segunda categor\u00eda. El c\u00f3digo a ejecutar en WebAssembly es compilado a un formato binario que es interpretado por la m\u00e1quina virtual de WebAssembly. Lo que hace verdaderamente portable a WebAssembly respecto a otros formatos binarios con su m\u00e1quina virtual es el <strong>amplio cat\u00e1logo de lenguajes de programaci\u00f3n soportados<\/strong> y la introducci\u00f3n de la WebAssembly System Interface (WASI), una interfaz unificada que permite al c\u00f3digo WebAssembly interactuar con el sistema anfitri\u00f3n de la m\u00e1quina virtual independientemente de su arquitectura y sistema operativo. Adicionalmente, la m\u00e1quina virtual encargada de ejecutar los binarios de WebAssembly est\u00e1 estandarizada, por lo que cualquier binario de WebAssembly es compatible con cualquier implementaci\u00f3n de la m\u00e1quina virtual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rendimiento cercano al nativo<\/h2>\n\n\n\n<p>El alto rendimiento de WebAssembly respecto a otras tecnolog\u00edas similares y su proximidad al rendimiento nativo son gracias a tres caracter\u00edsticas: la compilaci\u00f3n <em>ahead of time<\/em> (AoT), un modelo de memoria simplificado y la generaci\u00f3n de binarios ligeros.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Compilaci\u00f3n AoT<\/strong>. El c\u00f3digo en lenguaje de alto nivel es compilado primero a WebAssembly antes de la ejecucion. El c\u00f3digo WebAssembly resultante es <strong>compilado de nuevo antes de la ejecuci\u00f3n,<\/strong> esta vez al <strong>formato binario nativo<\/strong> de la plataforma en la que ser\u00e1 ejecutado. Esto resulta en un rendimiento similar al nativo.<\/li>\n\n\n\n<li><strong>Modelo de memoria simplificado<\/strong>. El modelo de memoria de WebAssembly es la <strong>memoria lineal<\/strong>, un vector de bytes contiguo que solamente puede crecer hasta los 4 GB. WebAssembly no implementa colectores de basura ni otros mecanismos complejos de gesti\u00f3n de memoria, lo que mejora notablemente el rendimiento del c\u00f3digo compilado a WebAssembly.<\/li>\n\n\n\n<li><strong>Binarios<\/strong> <strong>ligeros<\/strong>. A diferencia de los contenedores, cuyas im\u00e1genes incluyen un gran n\u00famero de dependencias, los binarios de <strong>WebAssembly solamente incluyen lo imprescindible<\/strong>: el c\u00f3digo a ejecutar y las librer\u00edas necesarias, todo compilado a WebAssembly. Esto facilita y acelera el despliegue y la ejecuci\u00f3n de las aplicaciones.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">WebAssembly m\u00e1s all\u00e1 de la web<\/h2>\n\n\n\n<p>Aunque WebAssembly se dise\u00f1\u00f3 inicialmente para ejecutarse en navegadores, su adopci\u00f3n se ha extendido a <strong>entornos de servidor<\/strong>, <strong>dispositivos m\u00f3viles<\/strong> y <strong>sistemas embebidos<\/strong>. Proyectos como <strong><a href=\"https:\/\/wasmtime.dev\">Wasmtime<\/a><\/strong> o <strong><a href=\"https:\/\/github.com\/bytecodealliance\/wasm-micro-runtime\">WAMR<\/a><\/strong> (WebAssembly Micro Runtime) permiten ejecutar binarios WebAssembly en entornos<strong> fuera del navegado<\/strong>r. Estos proyectos son implementaciones de la m\u00e1quina virtual de WebAssembly que utilizan WASI para proporcionar al c\u00f3digo compilado a WebAssembly un mecanismo para interactuar de manera segura con recursos fuera del entorno aislado. La aparici\u00f3n de estas m\u00e1quinas virtuales ha facilitado la adopci\u00f3n de WebAssembly en contextos como la <strong>computaci\u00f3n en el borde<\/strong> (edge computing), <strong>la nube<\/strong> y <strong>el internet de las cosas<\/strong> (IoT).<\/p>\n\n\n\n<p>Espec\u00edficamente en <strong>entornos de servidor<\/strong>, WebAssembly ofrece una alternativa ligera y segura a los contenedores tradicionales, permitiendo la ejecuci\u00f3n de microservicios con un menor consumo de recursos y tiempos de arranque m\u00e1s r\u00e1pidos. Adem\u00e1s, su modelo de seguridad garantiza la ejecuci\u00f3n aislada, protegiendo el sistema anfitri\u00f3n de c\u00f3digo malicioso. Estas caracter\u00edsticas han hecho de WebAssembly una tecnolog\u00eda atractiva, y algunos proveedores de la nube como Azure<a href=\"https:\/\/learn.microsoft.com\/es-es\/azure\/aks\/use-wasi-node-pools\"> <strong>ya<\/strong> <strong>permiten la ejecuci\u00f3n de microservicios en WebAssembly<\/strong><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desventajas<\/h2>\n\n\n\n<p>Pese a las claras ventajas que WebAssembly ofrece en t\u00e9rminos de rendimiento y portabilidad, todav\u00eda existen <strong>limitaciones significativas<\/strong>. La m\u00e1s importante es la <strong>falta de algunas funcionalidades debido a que WASI todav\u00eda no implementa las llamadas al sistema requeridas<\/strong> para ofrecerlas. Es el caso de la memoria compartida o la ejecuci\u00f3n de m\u00faltiples hilos (estos \u00faltimos ya han sido portados a WebAssembly, aunque todav\u00eda con limitaciones).. Por otro lado, existen aplicaciones que tienen <strong>dependencias que son espec\u00edficas de una determinada plataforma<\/strong>. WebAssembly requiere que esas dependencias puedan ser ejecutadas en la m\u00e1quina virtual, lo cual es imposible, puesto que se trata de binarios espec\u00edficos para esa plataforma. Debido a estos problemas, todav\u00eda existe un gran n\u00famero de aplicaciones que no pueden ser compiladas a WebAssembly sin adaptarlas previamente, lo cual a veces supone un proceso tortuoso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>WebAssembly es una tecnolog\u00eda que se est\u00e1 abriendo paso en el mundo de la virtualizaci\u00f3n y los microservicios. Gracias a su portabilidad, aislamiento ligero, alto rendimiento y bajo consumo de los recursos, las aplicaciones en la nube y el edge se est\u00e1n viendo beneficiadas, reduciendo sus tiempos de ejecuci\u00f3n y de despliegue. <\/p>\n\n\n\n<p>Aunque a\u00fan enfrenta limitaciones, WebAssembly est\u00e1 en constante evoluci\u00f3n y existen todo tipo de propuestas para implementar nuevas funcionalidades que todav\u00eda no est\u00e1n disponibles, aumentando el cat\u00e1logo de aplicaciones compatibles. <\/p>\n\n\n\n<p>Por todas sus caracter\u00edsticas, WebAssembly se perfila como una tecnolog\u00eda clave para el desarrollo de aplicaciones multiplataforma en un futuro cercano.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>WebAssembly es un formato binario portable que promete aislamiento, rendimiento cercano al nativo y alta portabilidad con un entorno de ejecuci\u00f3n con bajos requerimientos de recursos. En palabras del propio creador de Docker, WebAssembly podr\u00eda venir a reemplazar las tecnolog\u00edas de containerizaci\u00f3n cl\u00e1sicas con m\u00e1quinas virtuales mucho m\u00e1s ligeras y f\u00e1ciles de desplegar. A simple [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":1042,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","_swt_meta_header_display":false,"_swt_meta_footer_display":false,"_swt_meta_site_title_display":false,"_swt_meta_sticky_header":false,"_swt_meta_transparent_header":false,"footnotes":""},"categories":[33],"tags":[],"class_list":["post-713","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-webassembly"],"jetpack_featured_media_url":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic.png","uagb_featured_image_src":{"full":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic.png",1920,1080,false],"thumbnail":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic-150x150.png",150,150,true],"medium":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic-300x169.png",300,169,true],"medium_large":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic-768x432.png",768,432,true],"large":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic-1024x576.png",1024,576,true],"1536x1536":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic-1536x864.png",1536,864,true],"2048x2048":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/webassembly-pic.png",1920,1080,false]},"uagb_author_info":{"display_name":"Pablo Gimeno Sarroca","author_link":"https:\/\/cloudlab.urv.cat\/catedracloud\/author\/pgimeno\/"},"uagb_comment_info":6,"uagb_excerpt":"WebAssembly es un formato binario portable que promete aislamiento, rendimiento cercano al nativo y alta portabilidad con un entorno de ejecuci\u00f3n con bajos requerimientos de recursos. En palabras del propio creador de Docker, WebAssembly podr\u00eda venir a reemplazar las tecnolog\u00edas de containerizaci\u00f3n cl\u00e1sicas con m\u00e1quinas virtuales mucho m\u00e1s ligeras y f\u00e1ciles de desplegar. A simple&hellip;","_links":{"self":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/comments?post=713"}],"version-history":[{"count":5,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/713\/revisions"}],"predecessor-version":[{"id":1046,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/713\/revisions\/1046"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/media\/1042"}],"wp:attachment":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/media?parent=713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/categories?post=713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/tags?post=713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}