# Binaryen — WebAssembly Compiler and Optimization Toolchain > A compiler infrastructure and toolchain library for WebAssembly that provides optimization, code generation, and interpretation in a single C++ library. ## Install Save in your project root: # Binaryen — WebAssembly Compiler and Optimization Toolchain ## Quick Use ```bash # Install via package manager # macOS brew install binaryen # Ubuntu/Debian apt install binaryen # Optimize a .wasm file wasm-opt -O3 input.wasm -o output.wasm # Convert WAT text format to binary wasm-as module.wat -o module.wasm ``` ## Introduction Binaryen is a compiler and toolchain infrastructure library for WebAssembly, developed under the official WebAssembly GitHub organization. It provides a C/C++ API for generating, optimizing, and transforming WebAssembly modules. Binaryen powers the optimization pipeline of Emscripten and is used by multiple language compilers targeting WebAssembly. ## What Binaryen Does - Optimizes WebAssembly modules with configurable pass pipelines (wasm-opt) - Converts between WAT (text) and WASM (binary) formats - Provides a C API for building WebAssembly modules programmatically - Includes a WebAssembly interpreter for testing without a browser - Merges, splits, and transforms WebAssembly modules ## Architecture Overview Binaryen represents WebAssembly programs as an AST-based intermediate representation (IR). The optimizer runs a configurable pipeline of passes over this IR, including dead code elimination, inlining, constant folding, and memory optimization. The IR can be lowered to binary WebAssembly or printed as WAT text. A built-in interpreter executes the IR directly for validation and testing. ## Self-Hosting & Configuration - Install via Homebrew, apt, or build from source with CMake - Use wasm-opt as a standalone CLI for optimizing any .wasm file - Integrate the C API (binaryen-c.h) into compiler backends - Configure optimization levels from -O0 (none) to -Oz (size-optimized) - Enable specific passes individually for fine-grained control ## Key Features - Production-grade optimizer that typically reduces wasm binary size by 10-30% - Used by Emscripten, AssemblyScript, Kotlin/Wasm, and other compiler toolchains - Fast parallel compilation and optimization pipeline - Support for all WebAssembly proposals including SIMD, threads, and GC - Fuzzer and validator tools for testing WebAssembly modules ## Comparison with Similar Tools - **wasm-tools (Bytecode Alliance)** — focuses on parsing and validation; Binaryen provides deeper optimization - **Wabt** — a simpler toolkit for format conversion; Binaryen includes a full optimization pipeline - **LLVM WebAssembly backend** — generates wasm from LLVM IR; Binaryen optimizes the output further downstream - **wasm-pack** — Rust-specific build tool; Binaryen is language-agnostic and used as a post-processing step ## FAQ **Q: Should I use wasm-opt on all my WebAssembly output?** A: Generally yes. Running wasm-opt -O3 or -Oz after your compiler typically reduces binary size and improves runtime performance. **Q: Does Binaryen support the WebAssembly GC proposal?** A: Yes. Binaryen tracks WebAssembly proposals and supports GC types, reference types, and other in-progress specifications. **Q: Can I use Binaryen from JavaScript?** A: Yes. Binaryen provides binaryen.js, a compiled-to-JS version of the library that runs in Node.js or the browser. **Q: How does Binaryen relate to Emscripten?** A: Emscripten uses Binaryen as its WebAssembly optimization backend. When you compile C/C++ with Emscripten, wasm-opt runs automatically. ## Sources - https://github.com/WebAssembly/binaryen - https://webassembly.github.io/binaryen --- Source: https://tokrepo.com/en/workflows/asset-cadc6f7a Author: AI Open Source