WebAssembly
{{Short description|Assembly language and bytecode for web browsers}}
{{Use dmy dates|date=February 2020}}
{{Infobox programming language
| title = WebAssembly
| logo = WebAssembly Logo.svg
| logo caption =
| screenshot =
| screenshot caption =
| paradigm = structured; stack machine{{Cite web|title=WebAssembly/design/Semantics.md|url=https://github.com/WebAssembly/design/blob/376bcc4b9cba79280d79be023d71e30d0b00ba47/Semantics.md|access-date=2021-02-23|website=GitHub|language=en|quote=WebAssembly code can be considered a structured stack machine; a machine where most computations use a stack of values, but control flow is expressed in structured constructs such as blocks, ifs, and loops. In practice, implementations need not maintain an actual value stack, nor actual data structures for control; they need only behave as if they did so.}}
| family =
| released = {{Start date and age|df=yes|2017|3}}
| designer = W3C
| developer = {{Unbulleted list|W3C|Mozilla|Microsoft|Google|Apple}}
| latest release version =
| latest release date =
| typing =
| operating system = Platform independent
| scope =
| implementations =
| dialects =
| license = Apache License 2.0
| programming language =
| file extensions = {{Unbulleted list|{{mono|.wat}} (text format)|{{mono|.wasm}} (binary format)}}
| file format =
| influenced by = {{Hlist|asm.js|PNaCl|Lisp}}
| influenced =
}}
WebAssembly (Wasm) defines a portable binary-code format and a corresponding text format for executable programs{{cite web |author1=Mozilla |title=Understanding WebAssembly text format |url=https://developer.mozilla.org/en-US/docs/WebAssembly/Understanding_the_text_format |access-date=9 December 2019 |website=MDN Web Docs |language=en-US}}
as well as software interfaces for facilitating communication between such programs and their host environment.{{Cite web|
url=https://webassembly.github.io/spec/core/intro/introduction.html|
title=Introduction — WebAssembly 1.0|website=webassembly.github.io|
access-date=18 June 2019|
quote=WebAssembly is an open standard...}}
url=https://webassembly.github.io/spec/core/intro/introduction.html|
title=Introduction — WebAssembly 1.0|website=webassembly.github.io|access-date=18 June 2019|
quote=WebAssembly is a ... code format}}{{Cite web|
url=https://webassembly.github.io/spec/core/syntax/conventions.html|
title=Conventions — WebAssembly 1.0|
website=webassembly.github.io|
access-date=17 May 2019|
quote=WebAssembly is a programming language that has multiple concrete representations (its binary format and the text format). Both map to a common structure.}}{{Cite web|
url=https://webassembly.github.io/spec/core/intro/introduction.html|
title=Introduction — WebAssembly 1.0|website=webassembly.github.io|
access-date=18 June 2019|
quote=... this specification is complemented by additional documents defining interfaces to specific embedding environments such as the Web. These will each define a WebAssembly application programming interface (API) suitable for a given environment.}}
The main goal of WebAssembly is to facilitate high-performance applications on web pages, but it is also designed to be usable in non-web environments.{{Cite web|
title=Introduction — WebAssembly 1.1|
url=https://webassembly.github.io/spec/core/intro/introduction.html|
access-date=2021-02-19|
quote=Its main goal is to enable high performance applications on the Web, but it does not make any Web-specific assumptions or provide Web-specific features, so it can be employed in other environments as well.|
website=webassembly.github.io}}
It is an open standard{{Cite journal|
last1=Haas|first1=Andreas|
last2=Rossberg|first2=Andreas|
last3=Schuff|first3=Derek L.|
last4=Titzer|first4=Ben L.|
last5=Holman|first5=Michael|
last6=Gohman|first6=Dan|
last7=Wagner|first7=Luke|
last8=Zakai|first8=Alon|
last9=Bastien|first9=JF|
date=14 June 2017|
title=Bringing the Web Up to Speed with WebAssembly|
journal=SIGPLAN Notices|volume=52|issue=6|pages=185–200|doi=10.1145/3140587.3062363|issn=0362-1340|
quote=While the Web is the primary motivation for WebAssembly, nothing in its design depends on the Web or a JavaScript environment. It is an open standard specifically designed for embedding in multiple contexts, and we expect that stand-alone implementations will become available in the future.|doi-access=free}}
intended to support any language on any operating system, and in practice many of the most popular languages already have at least some level of support.
Announced in {{Start date|2015}} and first released in {{Start date|2017|3}}, WebAssembly became a World Wide Web Consortium recommendation on 5 December 2019{{cite web |
author1=World Wide Web Consortium |
title=WebAssembly Core Specification |
url=https://www.w3.org/TR/wasm-core-1/ |
website=World Wide Web Consortium (W3) |access-date=9 December 2019}}
last1=Couriol |first1=Bruno |
title=WebAssembly 1.0 Becomes a W3C Recommendation and the Fourth Language to Run Natively in Browsers |
url=https://www.infoq.com/news/2019/12/webassembly-w3c-recommendation/ |
website=infoq.com |access-date=9 December 2019}}
{{Cite web|title=WebAssembly Specification — WebAssembly 1.1|
url=https://webassembly.github.io/spec/core/|
access-date=2021-03-22|website=webassembly.github.io}}
and it received the Programming Languages Software Award from ACM SIGPLAN in 2021.{{Cite web|
url=http://www.sigplan.org/Awards/Software/|
title=Programming Languages Software Award|
website=www.sigplan.org}}
The World Wide Web Consortium (W3C) maintains the standard with contributions from Mozilla, Microsoft, Google, Apple, Fastly, Intel, and Red Hat.
History
The name WebAssembly is intended to suggest bringing assembly language programming to the Web, where it will be executed client-side {{mdash}} by the website-user's computer via the user's web browser. To accomplish this, WebAssembly must be much more hardware-independent than a true assembly language.
WebAssembly was first announced in 2015, and the first demonstration was executing Unity's Angry Bots in Firefox, Google Chrome, and Microsoft Edge [Legacy]. The precursor technologies were asm.js from Mozilla and Google Native Client, and the initial implementation was based on the feature set of asm.js.{{Refn|group=note|The asm.js file already provides near-native code execution speeds: "Even discarding the one score where asm.js did better, it executes at around 70% of the speed (i.e. slower) of native C++ code.{{Cite web|url=https://blog.mozilla.org/javascript/2013/08/01/staring-at-the-sun-dalvik-vs-spidermonkey/|title=Staring at the Sun: Dalvik vs. ASM.js vs. Native|website=blog.mozilla.org|date=August 2013 |access-date=7 December 2019}} and can be considered a viable alternative for browsers that do not support WebAssembly or have it disabled for security reasons.}}
In March 2017, the design of the minimum viable product (MVP) was declared to be finished and the preview phase ended. In late September 2017, Safari 11 was released with support. In February 2018, the WebAssembly Working Group published three public working drafts for the Core Specification, JavaScript Interface, and Web API.
In June 2019, Chrome 75 was released with WebAssembly threads enabled by default.{{Cite web|title=WebAssembly Worker Based Threads - Chrome Platform Status|url=https://chromestatus.com/feature/5724132452859904|access-date=2022-02-19|website=chromestatus.com}}
{{as of|April 2022|since=y|post=,}} WebAssembly 2.0 has been in draft status.{{Cite web |title=WebAssembly Specification — WebAssembly 2.0 (Draft 2022-09-01) |url=https://webassembly.github.io/spec/core/ |access-date=2022-09-09 |website=webassembly.github.io}}{{Cite web |title=WebAssembly 2.0 First Public Working Drafts {{!}} W3C News |date=19 April 2022 |url=https://www.w3.org/blog/news/archives/9509 |access-date=2022-09-09 |language=en-US}} It adds many SIMD-related instructions and a new v128 datatype, with the ability for functions to return multiple values, and mass memory initialize/copy.
Implementations
While WebAssembly was initially designed to permit near-native code execution speed in the web browser, it has been considered valuable outside of such, in more generalized contexts.{{cite web|title=Non-Web Embeddings|url=https://webassembly.org/docs/non-web/|access-date=15 May 2019|work=WebAssembly}}{{cite web|title=Non-Web Embeddings|url=https://github.com/WebAssembly/design/blob/master/NonWeb.md|access-date=15 May 2019|work=GitHub / WebAssembly}} Since WebAssembly's runtime environments (RE) are low-level virtual stack machines (akin to JVM or Flash VM) that may be embedded into host applications, some implementations create standalone runtime environments like {{wdrl|Q119398768}} and {{wdrl|Q105554548}}.{{Cite web|title=Outside the web: standalone WebAssembly binaries using Emscripten · V8|url=https://v8.dev/blog/emscripten-standalone-wasm#running-in-wasm-runtimes|access-date=2020-07-28|website=v8.dev}}{{Cite web|title=Wasmer - The Universal WebAssembly Runtime|url=https://wasmer.io/|quote=Compile everything to WebAssembly. Run it on any OS or embed it into other languages.|access-date=2021-02-19|website=wasmer.io}} WebAssembly runtime environments are embedded in application servers to host "server-side" WebAssembly applications and in other applications to support plug-in-based software extension architectures, e.g., "WebAssembly for Proxies" (Proxy-Wasm) which specifies a WebAssembly-based ABI for extending proxy servers.{{cite web |url=https://konghq.com/blog/engineering/proxy-wasm |last=Freese |first=Danny |date=2023-10-03 |df=mdy |title=Proxy-Wasm: It's WebAssembly for Proxies |department=Blog |website=Kong |access-date=2024-05-06}}{{cite web |url=https://github.com/proxy-wasm/spec |title=proxy-wasm/spec: WebAssembly for Proxies (ABI specification) |website=GitHub |access-date=2024-05-06}}
= Web browsers<span class="anchor" id="Support"></span> =
In November 2017, Mozilla declared support "in all major browsers", after WebAssembly was enabled by default in Edge [Legacy] 16. This support also includes mobile web browsers for iOS and Android. {{As of|2024|3|post=,}} 99% of tracked web browsers support WebAssembly (version 1.0), more than for its predecessor asm.js.{{Cite web |title=asm.js {{!}} Can I use... Support tables for HTML5, CSS3, etc |url=https://caniuse.com/asmjs |access-date=2024-09-29 |website=caniuse.com}} For some extensions, from the 2.0 draft standard, support may be lower, but still more than 90% of web browsers may already support, e.g. the reference types extension.{{Cite web |title=WebAssembly Reference Types {{!}} Can I use... Support tables for HTML5, CSS3, etc |url=https://caniuse.com/wasm-reference-types |access-date=2024-03-03 |website=caniuse.com}}
Compilers
WebAssembly implementations usually use either ahead-of-time (AOT) or just-in-time (JIT) compilation, but may also use an interpreter. While the first implementations were in web browsers, there are also non-browser implementations for general-purpose use, including Wasmer, Wasmtime{{cite web |title=Wasmtime — a small and efficient runtime for WebAssembly & WASI |url=https://wasmtime.dev/ |access-date=2020-12-18 |website=wasmtime.dev}} or WAMR, wasm3, WAVM, and many others.{{cite web |title=Roadmap |url=https://webassembly.org/roadmap/ |access-date=2021-12-07 |website=}}
Because WebAssembly executables are precompiled, it is possible to use a variety of programming languages to make them. This is achieved either through direct compilation to Wasm, or through an implementation of their corresponding virtual machines in Wasm. Some 40 programming languages are reported to support Wasm as a compilation target.
Emscripten compiles C and C++ to Wasm using Clang as a frontend, replacing LLVM as backend and using {{wdrl|Q131308722}} as an optimizer.{{cite tweet |user=kripken |number=1186407352880074752 |title=Emscripten has switched to the upstream LLVM wasm backend by default! / Details:.wasm
files which then may be executed in a web browser.{{cite web |url=https://webassembly.org/getting-started/developers-guide/|title=Developer's Guide - WebAssembly |website=webassembly.org |access-date=10 June 2019}}{{cite web |url=https://developer.mozilla.org/en-US/docs/WebAssembly/C_to_wasm |title=Compiling a New C/C++ Module to WebAssembly |website=MDN Web Docs |language=en |access-date=10 June 2019}}{{cite web |url=https://emscripten.org/docs/compiling/WebAssembly.html |title=Building to WebAssembly — Emscripten 1.38.33 documentation |website=emscripten.org |access-date=10 June 2019}} Even though Emscripten can consume various languages when using Clang, some problems may arise.{{cite web |url=https://developers.google.com/web/updates/2018/03/emscripting-a-c-library |title=Emscripting a C library to Wasm {{!}} Web |website=Google Developers |language=en |access-date=10 June 2019}}}} Emscripten provides bindings for several commonly used environment interfaces like WebGL.
As of version 8, a standalone Clang can compile C and C++ to Wasm.{{cite web |title=LLVM 8.0.0 Release Notes — LLVM 8 documentation |url=https://releases.llvm.org/8.0.0/docs/ReleaseNotes.html#changes-to-the-webassembly-target |access-date=22 October 2019 |website=releases.llvm.org}} Its initial aim was to support compilation from C and C++, though support for other source languages such as Rust, .NET languages{{cite web |title=Frequently asked questions (FAQ) about Blazor |url=https://blazor.net/docs/introduction/faq.html |access-date=18 June 2018 |website=blazor.net}} and AssemblyScript{{cite web |title=AssemblyScript/assemblyscript |date=2020-09-09 |url=https://github.com/AssemblyScript/assemblyscript |publisher=The AssemblyScript Project |access-date=2020-09-09}} (TypeScript-like) is also emerging.
After the MVP release, WebAssembly added support for multithreading and garbage collection (WasmGC, and web browsers including Safari have added support for it),{{cite web |title=WebAssembly Garbage Collection (WasmGC) now enabled by default in Chrome {{!}} Blog |url=https://developer.chrome.com/blog/wasmgc |access-date=2023-12-11 |website=Chrome for Developers |language=en}} which allowed more efficient compilation for garbage-collecting programming languages like C# (supported via Blazor), F# (supported via Bolero{{cite web |url=https://fsbolero.io/ |title=Bolero: F# in WebAssembly |website=fsbolero.io |access-date=25 July 2019}} with help of Blazor) and Python.{{cite web |title=A new way to bring garbage collected programming languages efficiently to WebAssembly · V8 |url=https://v8.dev/blog/wasm-gc-porting#demo-and-status |access-date=2023-12-11 |website=v8.dev}}
A number of other languages have some support, including Haskell,{{cite web |title=Using the GHC WebAssembly backend |url=https://ghc.gitlab.haskell.org/ghc/doc/users_guide/wasm.html |access-date=2025-05-01 |website=GHC User's Guide |language=en-US}} Python,{{cite web |title=Pyodide: Bringing the scientific Python stack to the browser – Mozilla Hacks - the Web developer blog |url=https://hacks.mozilla.org/2019/04/pyodide-bringing-the-scientific-python-stack-to-the-browser |access-date=2020-09-09 |website=Mozilla Hacks – the Web developer blog |language=en-US}} Julia,{{cite web |url=https://nextjournal.com/sdanisch/wasm-julia |title=Julia in the Browser |website=nextjournal.com |access-date=9 April 2019}}{{cite web |url=https://github.com/JuliaPackaging/Yggdrasil/pull/2 |title=WebAssembly platform by tshort · Pull Request #2 · JuliaPackaging/Yggdrasil |website=GitHub |language=en |access-date=9 April 2019}}{{cite web |last=Fischer |first=Keno |title=GitHub - Keno/julia-wasm: Running julia on wasm. |website=GitHub |date=22 July 2019 |url=https://github.com/Keno/julia-wasm |access-date=25 July 2019}} Ruby{{cite web |url=https://ruby.dj/ |title=MRuby in Your Browser |website=ruby.dj |access-date=25 July 2019}} and Ring.{{cite web |url=https://www.infoworld.com/article/3572395/ring-language-upgrade-focuses-on-webassembly.html |title=Ring language upgrade focuses on WebAssembly |author=Paul Krill |date=24 August 2020 |publisher=InfoWorld}}{{cite web |url=https://ring-lang.github.io/web/tryringonline/project.html |title=Ring in web browser |access-date=17 August 2024}}
A number of systems can compile Java and other JVM languages to JavaScript and WebAssembly. These include CheerpJ,{{cite web |access-date=2023-04-27 |title=Java to WebAssembly Compiler - CheerpJ |url=https://leaningtech.com/cheerpj/}} JWebAssembly{{cite web |title=JWebAssembly |url=https://github.com/i-net-software/JWebAssembly |date=27 April 2023 |via=GitHub}} and TeaVM.{{cite web |access-date=2023-04-27 |title=TeaVM — Overview |url=https://www.teavm.org/docs/intro/overview.html |website=www.teavm.org}} Kotlin supports WebAssembly directly.{{cite web |title=Bringing Kotlin to the Web |url=https://developers.googleblog.com/2023/05/bringing-kotlin-to-web.html |access-date=2023-12-11 |language=en}}{{cite web |last=Deleuze |first=Sébastien |date=2023-02-13 |title=The huge potential of Kotlin/Wasm |url=https://seb.deleuze.fr/the-huge-potential-of-kotlin-wasm/ |access-date=2023-12-11 |website=seb.deleuze.fr |language=en}}
Limitations
Web browsers do not permit WebAssembly code to directly manipulate the Document Object Model. Wasm code must defer to JavaScript for this.{{Refn|group=note|For Rust/Wasm development, third-party libraries can provide some of the necessary JavaScript I/O.{{Cite web|url=https://docs.rs/stdweb/*/stdweb/|title=stdweb - Rust|website=docs.rs|access-date=5 June 2019|quote=The goal of this crate is to provide Rust bindings to the Web APIs and to allow a high degree of interoperability between Rust and JavaScript.}}{{Cite web|url=https://docs.rs/web-sys/*/web_sys/|title=web_sys - Rust|website=docs.rs|access-date=5 June 2019|quote=Raw API bindings for Web APIs. This is a procedurally generated crate from browser WebIDL which provides a binding to all APIs that browser provide on the web.}}}}
In an October 2023 survey of developers, less than half of the 303 participants were satisfied with the state of WebAssembly. A large majority cited the need for improvement in four areas: WASI, debugging support, integration with JavaScript and browser APIs, and build tooling.{{cite web |title=The State of WebAssembly 2023 |url=https://blog.scottlogic.com/2023/10/18/the-state-of-webassembly-2023.html |publisher=Scott Logic |date=18 October 2023 |access-date=14 March 2024}}
For memory-intensive allocations in WebAssembly, there are "grave limitations that make many applications infeasible to be reliably deployed on mobile browsers [..] Currently allocating more than ~300MB of memory is not reliable on Chrome on Android without resorting to Chrome-specific workarounds, nor in Safari on iOS."{{Cite web|title=Wasm needs a better memory management story · Issue #1397 · WebAssembly/design|url=https://github.com/WebAssembly/design/issues/1397|access-date=2021-02-15|website=GitHub|language=en}}
All major browsers allow WebAssembly if Content-Security-Policy is not specified, or if "unsafe-eval" is used, but behave differently otherwise.{{Cite web|title=WebAssembly/content-security-policy|url=https://github.com/WebAssembly/content-security-policy|access-date=2021-02-17|website=GitHub|language=en}} Chrome requires "unsafe-eval",{{Cite web|title=948834 - chromium - An open-source project to help move the web forward. - Monorail|url=https://bugs.chromium.org/p/chromium/issues/detail?id=948834&can=1&q=wasm-eval|access-date=2021-02-17|website=bugs.chromium.org}}{{Cite web|title=No way to use WebAssembly on Chrome without 'unsafe-eval' · Issue #7 · WebAssembly/content-security-policy|url=https://github.com/WebAssembly/content-security-policy/issues/7|access-date=2021-02-17|website=GitHub|language=en}} though a worker thread can be a workaround.
Security considerations
In June 2018, a security researcher presented the possibility of using WebAssembly to circumvent browser mitigations for Spectre and Meltdown security vulnerabilities once support for threads with shared memory is added. Due to this concern, WebAssembly developers put the feature on hold.{{cite web |last1=Cimpanu |first1=Catalin |title=Changes in WebAssembly Could Render Meltdown and Spectre Browser Patches Useless |url=https://www.bleepingcomputer.com/news/security/changes-in-webassembly-could-render-meltdown-and-spectre-browser-patches-useless/ |publisher=Bleeping Computer |access-date=8 June 2019 |language=en-us |date=24 June 2018}}{{cite web |last1=Sanders |first1=James |title=How opaque WebAssembly code could increase the risk of Spectre attacks online |url=https://www.techrepublic.com/article/how-opaque-webassembly-code-could-increase-the-risk-of-spectre-attacks-online/ |website=Tech Republic |access-date=9 June 2019 |language=en |date=25 June 2018}} However, in order to explore these future language extensions, Google Chrome added experimental support for the WebAssembly thread proposal in October 2018.{{cite web |last1=R |first1=Bhagyashree |title=Google Chrome 70 now supports WebAssembly threads to build multi-threaded web applications |url=https://hub.packtpub.com/google-chrome-70-now-supports-webassembly-threads-to-build-multi-threaded-web-applications/ |website=Packt Pub |access-date=9 June 2019 |date=30 October 2018}}
WebAssembly has been criticized for allowing greater ease of hiding the evidence for malware writers, scammers and phishing attackers; WebAssembly is present on the user's machine only in its compiled form, which "[makes malware] detection difficult".{{cite web |last1=Lonkar |first1=Aishwarya |last2=Chandrayan |first2=Siddhesh |title=The dark side of WebAssembly |url=https://www.virusbulletin.com/virusbulletin/2018/10/dark-side-webassembly/ |website=Virus Bulletin |access-date=8 June 2019 |date=October 2018}} Speed and the easy ability to conceal in WebAssembly have led to its use in hidden crypto mining within the website visitor's device.{{cite web |last1=Segura |first1=Jérôme |title=Persistent drive-by cryptomining coming to a browser near you |url=https://blog.malwarebytes.com/cybercrime/2017/11/persistent-drive-by-cryptomining-coming-to-a-browser-near-you/ |publisher=Malwarebytes |access-date=8 June 2019 |date=29 November 2017}}{{cite web |last1=Neumann |first1=Robert |last2=Toro |first2=Abel |title=In-browser mining: Coinhive and WebAssembly |url=https://www.forcepoint.com/blog/x-labs/browser-mining-coinhive-and-webassembly |publisher=Forcepoint |access-date=8 June 2019 |language=en |date=19 April 2018}} Coinhive, a now defunct service facilitating cryptocurrency mining in website visitors' browsers, claims their "miner uses WebAssembly and runs with about 65% of the performance of a native Miner." A June 2019 study from the Technische Universität Braunschweig analyzed the usage of WebAssembly in the Alexa top 1 million websites and found the prevalent use was for malicious crypto mining, and that malware accounted for more than half of the WebAssembly-using websites studied.{{Cite web|url=https://www.infoq.com/news/2019/10/WebAssembly-wasm-malicious-usage/|title=Recent Study Estimates That 50% of Websites Using WebAssembly Apply It for Malicious Purposes|website=InfoQ|access-date=3 November 2019}}{{cite book |last1=Musch |first1=Marius |title=Detection of Intrusions and Malware, and Vulnerability Assessment |volume=11543 |pages=23–42 |last2=Wressnegger |first2=Christian |last3=Johns |first3=Martin |last4=Rieck |first4=Konrad |chapter=New Kid on the Web: A Study on the Prevalence of WebAssembly in the Wild |url=https://www.sec.cs.tu-bs.de/pubs/2019a-dimva.pdf |publisher=Detection of Intrusions and Malware, and Vulnerability Assessment |access-date=15 February 2022 |doi=10.1007/978-3-030-22038-9_2 |date=June 2019 |series=Lecture Notes in Computer Science |isbn=978-3-030-22037-2 |s2cid=184482682 |archive-date=26 July 2022 |archive-url=https://web.archive.org/web/20220726131621/https://www.sec.cs.tu-bs.de/pubs/2019a-dimva.pdf |url-status=dead }} [https://www.dimva2019.org/wp-content/uploads/sites/31/2019/06/DIMVA19-slides-2-R.pdf Slides (PDF)] {{Webarchive|url=https://web.archive.org/web/20191103054140/https://www.dimva2019.org/wp-content/uploads/sites/31/2019/06/DIMVA19-slides-2-R.pdf |date=3 November 2019 }} An April 2021 study from Universität Stuttgart found that since then crypto mining has been marginalized, falling to below 1% of all WebAssembly modules gathered from a wide range of sources, also including the Alexa top 1 million websites.Aaron Hilbig, Daniel Lehmann, and Michael Pradel (April 2021). "An Empirical Study of Real-World WebAssembly Binaries: Security, Languages, Use Cases." (Archived April 2021) https://software-lab.org/publications/www2021.pdf
As WebAssembly supports only structured control flow, it is amenable toward security verification techniques including symbolic execution.{{Cite book|last=Watt|first=Conrad|title=Proceedings of the 7th ACM SIGPLAN International Conference on Certified Programs and Proofs |chapter=Mechanising and verifying the WebAssembly specification |date=2018-01-08|chapter-url=https://dl.acm.org/doi/10.1145/3167082|series=CPP 2018|language=en|location=Los Angeles CA USA|publisher=ACM|pages=53–65|doi=10.1145/3167082|isbn=978-1-4503-5586-5|s2cid=9401691|url=https://www.repository.cam.ac.uk/handle/1810/274174 }}
Performance
Benchmark results vary between implementations and between themselves. Performance was benchmarked early to be around 91% (i.e., 10% slower) for running code, not including load/instantiation time{{cite conference |conference=2019 USENIX Annual Technical Conference |location=Renton, WA |last1=Jangda |first1=Abhinav |last2=Powers |first2=Bobby |last3=Berger |first3=Emery |last4=Guha |first4=Arjun |title=Not So Fast: Analyzing the Performance of WebAssembly vs. Native Code |url=https://www.usenix.org/sites/default/files/atc19-full-proceedings.pdf |pages=107–120 |date=2019-05-31 |arxiv=1901.09056v3 |oclc=1106328738 |access-date=2025-03-20 }} or more recently between 100% and 33% of native rates,{{cite web |last1=Denis |first1=Frank |title=Performance of WebAssembly runtimes in 2023 |url=https://00f.net/2023/01/04/webassembly-benchmark-2023/ |website=00f.net |access-date=6 December 2024}} and 120% of JavaScript (i.e. 20% faster).{{cite book |last1=De Macedo |first1=Joao |last2=Abreu |first2=Rui |last3=Pereira |first3=Rui |last4=Saraiva |first4=Joao |chapter=WebAssembly versus JavaScript: Energy and Runtime Performance |title=2022 International Conference on ICT for Sustainability (ICT4S) |date=June 2022 |pages=24–34 |doi=10.1109/ICT4S55073.2022.00014|hdl=1822/90291 |isbn=978-1-6654-8286-8 }}{{refn|group=note|A personal web page of 2024 reported a benchmark of a simple game application on a mobile phone found between 110% and 190% (i.e. faster) of native rates depending on the browser.{{cite web |last1=Turner |first1=Aaron |title=WebAssembly Is Fast: A Real-World Benchmark of WebAssembly vs. ES6 |url=https://medium.com/@torch2424/webassembly-is-fast-a-real-world-benchmark-of-webassembly-vs-es6-d85a23f8e193}}}}
A 2021 study suggested that WebAssembly, in the versions they tested at that time, was much faster than JavaScript in certain cases with some browsers, such as running a complex function on a small file, e.g. processing a graphics file, but that JavaScript had some optimizations available, e.g. JIT, that WebAssembly did not.{{cite book |last1=Yan |first1=Yutian |last2=Tu |first2=Tengfei |last3=Zhao |first3=Lijian |last4=Zhou |first4=Yuchen |last5=Wang |first5=Weihang |title=Proceedings of the 21st ACM Internet Measurement Conference |chapter=Understanding the performance of webassembly applications |date=2 November 2021 |pages=533–549 |doi=10.1145/3487552.3487827 |isbn=978-1-4503-9129-0 |chapter-url=https://weihang-wang.github.io/slides/Yan-IMC21.pptx}}
Benchmarking has revealed several other pain-points for WebAssembly, such as poor performance because of no direct access to the DOM,{{refn|group=note|"WebAssembly provides no access to the surrounding environment other than via the JavaScript API described in the JS API specification."{{cite web |title=WebAssembly Web API |url=https://webassembly.github.io/spec/web-api/index.html#security-considerations |website=webassembly.github.io}}}} a problem which is being addressed.{{cite web |last1=Kambale |first1=Enoch |title=WebAssembly in 2024: Promises, Challenges, and the Road Ahead |url=https://blog.enkambale.com/webassembly-2024-state-of-wasm/ |website=blog.enkambale.com |access-date=6 December 2024 |language=en}}
== WASI ==
{{anchor|WASI}}WebAssembly System Interface (WASI) is a simple interface (ABI and API) designed by Mozilla, which is intended to be portable to any platform.{{cite web |url=https://github.com/WebAssembly/WASI |title=WebAssembly System Interface Repo |work=GitHub / WebAssembly|date=10 February 2020 }} It provides POSIX-like features like file I/O constrained by capability-based security.{{cite web |title=Additional background on Capabilities |url=https://github.com/bytecodealliance/wasmtime/blob/master/docs/WASI-capabilities.md |website=GitHub |date=4 March 2022 |publisher=bytecodealliance |language=en}}{{cite web |title=Standardizing WASI: A system interface to run WebAssembly outside the web – Mozilla Hacks - the Web developer blog |url=https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/ |website=Mozilla Hacks – the Web developer blog}} There are additional proposed ABI/APIs.{{cite web |url=https://github.com/WebAssembly/reference-sysroot |title=reference-sysroot Repo |work=GitHub / WebAssembly|date=12 January 2020 }}{{cite web |url=https://github.com/WebAssembly/wasm-c-api |title=wasm-c-api Repo |work=GitHub / WebAssembly|date=3 February 2020 }}
WASI is influenced by CloudABI and Capsicum.{{Citation |title=NuxiNL/cloudlibc |date=2024-12-06 |url=https://github.com/NuxiNL/cloudlibc |access-date=2025-04-01 |publisher=Nuxi}}
{{interlanguage link|Solomon Hykes|fr}}, a co-founder of Docker, wrote in 2019, "If WASM+WASI existed in 2008, we wouldn't have needed to create Docker. That's how important it is. WebAssembly on the server is the future of computing."{{Cite web |last=Hykes |first=Solomon |date=March 27, 2019 |title=Solomon Hykes on X |url=https://x.com/solomonstre/status/1111004913222324225 |access-date=September 29, 2024 |website=Twitter}}
Specification<span class="anchor" id="Features"></span>
= Host environment =
= Virtual machine =
Wasm code (binary code, i.e. bytecode) is intended to be run on a portable virtual stack machine (VM). The VM is designed to be faster to parse and execute than JavaScript and to have compact code representation. Any external functionality (like syscalls) that may be expected by Wasm binary code is not stipulated by the standard. It rather provides a way to deliver interfacing via modules by the host environment that the VM runs in.{{Cite web|title=Portability - WebAssembly|url=https://webassembly.org/docs/portability/#assumptions-for-efficient-execution|access-date=2020-07-28|website=webassembly.org}}
= Wasm program =
A Wasm program is designed as a separate module containing collections of various Wasm-defined values and program type definitions. These are provided in either binary or textual format (see below) that have a common structure.{{Cite web|url=https://webassembly.github.io/spec/core/syntax/conventions.html|title=Conventions — WebAssembly 1.0|website=webassembly.github.io|access-date=12 November 2019}} Such a module may provide a start function that is executed upon instantiation of a wasm binary.
== Instruction set ==
The core standard for the binary format of a Wasm program defines an instruction set architecture (ISA) consisting of specific binary encodings of types of operations which are executed by the VM (without specifying how exactly they must be executed).{{Cite web|url=https://webassembly.github.io/spec/core/intro/introduction.html?highlight=isa#scope|title=Introduction — WebAssembly 1.0|website=webassembly.github.io|access-date=17 May 2019}} The list of instructions includes standard memory load/store instructions, numeric, parametric, control of flow instruction types and Wasm-specific variable instructions.{{Cite web|url=https://webassembly.github.io/spec/core/syntax/instructions.html|title=Instructions — WebAssembly 1.0|website=webassembly.github.io|access-date=12 November 2019}}
The number of opcodes used in the original standard (MVP) was a bit fewer than 200 of the 256 possible opcodes. Subsequent versions of WebAssembly pushed the number of opcodes a bit over 200. The WebAssembly SIMD proposal (for parallel processing) introduces an alternate opcode prefix (0xfd) for 128-bit SIMD. The concatenation of the SIMD prefix, plus an opcode that is valid after the SIMD prefix, forms a SIMD opcode. The SIMD opcodes bring an additional 236 instructions for the "minimum viable product" (MVP) SIMD capability (for a total of around 436 instructions).
{{
Cite web
| url=https://github.com/WebAssembly/simd/pull/452
| title=Final opcodes by tlively · Pull Request #452 · WebAssembly/simd · GitHub
| last=Lively
| first=Thomas
| date=2021-02-19
| orig-date=Pull Request opened on 2021-02-05
| publisher=Bytecode Alliance
| via=GitHub
| access-date=2021-05-12
}}
{{
Cite web
| url=https://github.com/bytecodealliance/wasm-tools/blob/b5c3d98e40590512a3b12470ef358d5c7b983b15/crates/wast/src/ast/expr.rs
| title=File wasm-tools/expr.rs at b5c3d98e40590512a3b12470ef358d5c7b983b15 · bytecodealliance/wasm-tools · GitHub
| last=Delendik
| first=Yury
| date=2021-02-19
| orig-date=SIMD changes committed on 2021-02-19
| publisher=Bytecode Alliance
| via=GitHub
| access-date=2021-05-12
}}
Those instructions, the "finalized opcodes"{{Cite web|title=Update interpreter and text with finalized opcodes by ngzhian · Pull Request #486 · WebAssembly/simd|url=https://github.com/WebAssembly/simd/pull/486|access-date=2021-05-14|website=GitHub|language=en}} are enabled by default across Google's V8 (in Google Chrome), the SpiderMonkey engine in Mozilla Firefox, and the JavaScriptCore engine in Apple's Safari{{Cite web|title=WebAssembly/simd|url=https://github.com/WebAssembly/simd|access-date=2021-05-14|website=GitHub|language=en}} and there are also some additional proposal for instructions for later "post SIMD MVP", and there is also a separate "relaxed-simd" proposal on the table.{{Citation|title=WebAssembly/relaxed-simd|date=2021-05-03|url=https://github.com/WebAssembly/relaxed-simd|publisher=WebAssembly|access-date=2021-05-14}}
These SIMD opcodes are also portable and translate to native instruction sets like x64 and ARM. In contrast, neither Java's JVM nor CIL support SIMD, at their opcode level, i.e. in the standard; both do have some parallel APIs which provide SIMD speedup. There is an extension for Java adding intrinsics for x64 SIMD,{{Cite web|title=How we made the JVM 40x faster|url=https://astojanov.github.io/blog/2017/12/20/scala-simd.html|access-date=2021-02-17|website=astojanov.github.io}} that isn't portable, i.e. not usable on ARM or smartphones. Smartphones can support SIMD by calling assembly code with SIMD, and C# has similar support.
== Code representation ==
In March 2017, the WebAssembly Community Group reached consensus on the initial (MVP) binary format, JavaScript API, and reference interpreter. It defines a WebAssembly binary format ({{code|.wasm}}), which is not designed to be used by humans, as well as a human-readable WebAssembly text format ({{code|.wat}}) that resembles a cross between S-expressions and traditional assembly languages.
The table below shows an example of a factorial function written in C and its corresponding WebAssembly code after compilation, shown both in {{mono|.wat}} text format (a human-readable textual representation of WebAssembly) and in {{mono|.wasm}} binary format (the raw bytecode, expressed below in hexadecimal), that is executed by a Web browser or run-time environment that supports WebAssembly.
class="wikitable"
|+C source code and corresponding WebAssembly | ||
scope="col"|C source code
!scope="col"|WebAssembly {{mono|.wat}} text format !scope="col"|WebAssembly {{mono|.wasm}} binary format | ||
---|---|---|
style="vertical-align:top"
| int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); } | (func (param i64) (result i64) local.get 0 i64.eqz if (result i64) i64.const 1 else local.get 0 local.get 0 i64.const 1 i64.sub call 0 i64.mul end) | 00 61 73 6D 01 00 00 00 01 06 01 60 01 7E 01 7E 03 02 01 00 0A 17 01 15 00 20 00 50 04 7E 42 01 05 20 00 20 00 42 01 7D 10 00 7E 0B 0B |
All integer constants are encoded using a space-efficient, variable-length LEB128 encoding.{{cite web
| url = https://webassembly.github.io/spec/core/binary/values.html#integers
| title = WebAssembly Specification Release 1.0
| access-date = 13 January 2020
| author = WebAssembly Community Group
|date=January 2020
}}
The WebAssembly text format is more canonically written in a folded format using S-expressions. For instructions and expressions, this format is purely syntactic sugar and has no behavioral differences with the linear format. Through {{code|wasm2wat}}, the code above decompiles to:
(module
(type $t0 (func (param i64) (result i64)))
(func $f0 (type $t0) (param $p0 i64) (result i64)
(if $I0 (result i64) ;; $I0 is an unused label name
(i64.eqz
(local.get $p0)) ;; the name $p0 is the same as 0 here
(then
(i64.const 1))
(else
(i64.mul
(local.get $p0)
(call $f0 ;; the name $f0 is the same as 0 here
(i64.sub
(local.get $p0)
(i64.const 1))))))))
A module is implicitly generated by the compiler. The function is referenced by an entry of the type table in the binary, hence a type section and the {{code|type}} emitted by the decompiler.{{cite web |title=Modules (Binary) |url=https://webassembly.github.io/spec/core/syntax/modules.html |website=WebAssembly 1.0}} The compiler and decompiler can be accessed online.{{cite web |title=WebAssembly Binary Toolkit (wabt) demos |url=https://webassembly.github.io/wabt/demo/ |website=webassembly.github.io}}
See also
Notes
{{reflist|group=note}}
References
{{reflist|30em|refs=
{{cite web |first=Peter |last=Bright |url=https://arstechnica.com/information-technology/2015/06/the-web-is-getting-its-bytecode-webassembly/|title=The Web is getting its bytecode: WebAssembly|work=Ars Technica |publisher=Condé Nast |date=18 June 2015}}
{{cite web |url=https://github.com/appcypher/awesome-wasm-langs |title=Awesome WebAssembly Languages |website=GitHub |date=26 June 2018 |access-date=15 February 2022}}
{{cite web|url=https://github.com/WebAssembly/design/blob/main/Rationale.md#why-a-stack-machine|title=Design Rationale|date=1 October 2016|work=GitHub / WebAssembly / design}}
{{cite web|url=https://github.com/WebAssembly/design/blob/main/HighLevelGoals.md|title=WebAssembly High-Level Goals|date=11 December 2015|work=GitHub / WebAssembly / design}}
{{Cite web|url=https://github.com/WebAssembly/design/issues/150|title=Launch bug|date=11 June 2015|website=GitHub / WebAssembly / design}}
{{cite web|url=https://webassembly.github.io/spec/core/text/instructions.html#folded-instructions|title=Folded instructions|work=GitHub}} / WebAssembly / spec
}}
{{Free-content attribution|
|title= Text Format
|author = jfbastien; rossberg-chromium; kripken; titzer; s3ththompson; sunfishcode; lukewagner; flagxor; enricobacis; c3d; binji; andrewosh
|publisher = GitHub
|source= WebAssembly/design
|documentURL= https://github.com/WebAssembly/design/blob/main/TextFormat.md
|license statement URL= https://github.com/WebAssembly/design/blob/main/LICENSE
|license= Apache License 2.0
}}
External links
{{sisterlinks|d=Q20155677|c=Category:WebAssembly|n=no|b=no|s=no|wikt=no|species=no|q=no|v=no|voy=no|m=no|mw=no}}
- {{Official website}}
- [https://www.w3.org/community/webassembly/ W3C Community Group]
- [https://webassembly.github.io/spec/core/ WebAssembly Specification]
- [https://github.com/WebAssembly/design WebAssembly Design Documents]
- {{Citation|url=https://developer.mozilla.org/en-US/docs/WebAssembly|title=WebAssembly|website=MDN Web Docs|date=16 April 2024 |language=en-US}}{{snd}} with info on browser compatibility and specifications (WebAssembly JavaScript API)
{{W3C Standards}}
{{Web browsers|fsp}}
{{Web interfaces}}
{{JavaScript}}
Category:Internet properties established in 2015