| Overview |
| -------- |
| |
| .. index:: concepts, value, instruction, trap, function, table, memory, linear memory, module, ! embedder, integer, floating-point, IEEE 754, Boolean, two's complement |
| .. _concepts: |
| |
| Concepts |
| ~~~~~~~~ |
| |
| WebAssembly encodes a low-level, assembly-like programming language. |
| This language is structured around the following concepts. |
| |
| .. _value: |
| |
| **Values** |
| WebAssembly provides only four basic *value types*. |
| These are integers and |IEEE754|_ numbers, |
| each in 32 and 64 bit width. |
| 32 bit integers also serve as Booleans and as memory addresses. |
| The usual operations on these types are available, |
| including the full matrix of conversions between them. |
| There is no distinction between signed and unsigned integer types. |
| Instead, integers are interpreted by respective operations |
| as either unsigned or signed in two’s complement representation. |
| |
| .. _instruction: |
| |
| **Instructions** |
| The computational model of WebAssembly is based on a *stack machine*. |
| Code consists of sequences of *instructions* that are executed in order. |
| Instructions manipulate values on an implicit *operand stack* [#stackmachine]_ |
| and fall into two main categories. |
| *Simple* instructions perform basic operations on data. |
| They pop arguments from the operand stack and push results back to it. |
| *Control* instructions alter control flow. |
| Control flow is *structured*, meaning it is expressed with well-nested constructs such as blocks, loops, and conditionals. |
| Branches can only target such constructs. |
| |
| .. _trap: |
| |
| **Traps** |
| Under some conditions, certain instructions may produce a *trap*, |
| which immediately aborts execution. |
| Traps cannot be handled by WebAssembly code, |
| but are reported to the outside environment, |
| where they typically can be caught. |
| |
| .. _function: |
| |
| **Functions** |
| Code is organized into separate *functions*. |
| Each function takes a sequence of values as parameters |
| and returns a sequence of values as results. [#arity]_ |
| Functions can call each other, including recursively, |
| resulting in an implicit call stack that cannot be accessed directly. |
| Functions may also declare mutable *local variables* that are usable as virtual registers. |
| |
| .. _table: |
| |
| **Tables** |
| A *table* is an array of opaque values of a particular *element type*. |
| It allows programs to select such values indirectly through a dynamic index operand. |
| Currently, the only available element type is an untyped function reference. |
| Thereby, a program can call functions indirectly through a dynamic index into a table. |
| For example, this allows emulating function pointers by way of table indices. |
| |
| .. _memory: |
| |
| **Linear Memory** |
| A *linear memory* is a contiguous, mutable array of raw bytes. |
| Such a memory is created with an initial size but can be grown dynamically. |
| A program can load and store values from/to a linear memory at any byte address (including unaligned). |
| Integer loads and stores can specify a *storage size* which is smaller than the size of the respective value type. |
| A trap occurs if an access is not within the bounds of the current memory size. |
| |
| .. _module: |
| |
| **Modules** |
| A WebAssembly binary takes the form of a *module* |
| that contains definitions for functions, tables, and linear memories, |
| as well as mutable or immutable *global variables*. |
| Definitions can also be *imported*, specifying a module/name pair and a suitable type. |
| Each definition can optionally be *exported* under one or more names. |
| In addition to definitions, modules can define initialization data for their memories or tables |
| that takes the form of *segments* copied to given offsets. |
| They can also define a *start function* that is automatically executed. |
| |
| .. _embedder: |
| |
| **Embedder** |
| A WebAssembly implementation will typically be *embedded* into a *host* environment. |
| This environment defines how loading of modules is initiated, |
| how imports are provided (including host-side definitions), and how exports can be accessed. |
| However, the details of any particular embedding are beyond the scope of this specification, and will instead be provided by complementary, environment-specific API definitions. |
| |
| |
| .. [#stackmachine] In practice, implementations need not maintain an actual operand stack. Instead, the stack can be viewed as a set of anonymous registers that are implicitly referenced by instructions. The :ref:`type system <validation>` ensures that the stack height, and thus any referenced register, is always known statically. |
| |
| .. [#arity] In the current version of WebAssembly, there may be at most one result value. |
| |
| |
| .. index:: phases, decoding, validation, execution, instantiation, invocation |
| |
| Semantic Phases |
| ~~~~~~~~~~~~~~~ |
| |
| Conceptually, the semantics of WebAssembly is divided into three phases. |
| For each part of the language, the specification specifies each of them. |
| |
| .. _decoding: |
| |
| **Decoding** |
| WebAssembly modules are distributed in a *binary format*. |
| *Decoding* processes that format and converts it into an internal representation of a module. |
| In this specification, this representation is modelled by *abstract syntax*, but a real implementation could compile directly to machine code instead. |
| |
| .. _validation: |
| |
| **Validation** |
| A decoded module has to be *valid*. |
| Validation checks a number of well-formedness conditions to guarantee that the module is meaningful and safe. |
| In particular, it performs *type checking* of functions and the instruction sequences in their bodies, ensuring for example that the operand stack is used consistently. |
| |
| .. _execution: |
| .. _instantiation: |
| .. _invocation: |
| |
| **Execution** |
| Finally, a valid module can be *executed*. |
| Execution can be further divided into two phases: |
| |
| **Instantiation**. |
| A module *instance* is the dynamic representation of a module, |
| complete with its own state and execution stack. |
| Instantiation executes the module body itself, given definitions for all its imports. |
| It initializes globals, memories and tables and invokes the module's start function if defined. |
| It returns the instances of the module's exports. |
| |
| **Invocation**. |
| Once instantiated, further WebAssembly computations can be initiated by *invoking* an exported function on a module instance. |
| Given the required arguments, that executes the respective function and returns its results. |
| |
| Instantiation and invocation are operations within the embedding environment. |