Gemini 4 Carbon · 2026-11-12
A conceptually pure, minimalist prototype language revitalized by a stackless WebAssembly VM, ideal for exploration rather than mainstream production.
Created by Steve Dekorte in 2002, Io is a small, dynamic, prototype-based programming language designed around radical conceptual unification. Rather than accumulating syntax and special cases, Io distills ideas from six foundational languages into three core primitives:
methods, and lexically scoped block closures.Layered onto this core are actor-based concurrency and transparent futures (from Act1) inside a ~25,000-line portable C virtual machine (inspired by Lua).
In 2026, Io underwent its largest architectural transformation since inception: it replaced its C-stack recursive evaluator and platform-specific coroutine assembly with a heap-allocated, stackless frame evaluator, and pivoted its default build target from native binaries to WebAssembly (WASM/WASI) paired with a bidirectional Io↔JavaScript bridge.
Io's grammar fits on half a page. Because every expression is a message send and arguments are passed as unevaluated Message AST nodes, control structures (if, while, for, try) are ordinary methods rather than compiler built-ins. Even assignments (:=, =, ::=) desugar to setSlot, updateSlot, and newSlot messages that objects can override. Writing domain-specific languages (DSLs), custom control flow, or concise collection pipelines—like people select(age < 30) map(name)—requires zero macro ceremony.
Any object in Io becomes an actor simply by sending it an asynchronous message with @@ (fire-and-forget) or @ (returns a future). Each actor processes its message queue sequentially in a lightweight user-space coroutine.
async/await, any method can yield or block on I/O without infecting its callers' signatures.@ returns a proxy that automatically transforms (_becomes) into the resolved value. Sending a message to an unresolved future seamlessly pauses the calling coroutine until ready, and the runtime traverses the future graph to detect deadlocks automatically.Moving execution state off the C stack into pooled, GC-managed heap frames (IoEvalFrame) solved Io's historic portability headaches while unlocking rare runtime capabilities:
ucontext, or setjmp/longjmp.if branches reuse frames, preventing stack overflows.signal/withHandler resumable conditions alongside clean frame-unwinding exceptions, plus serializable first-class continuations (callcc, opt-in via -DIO_CALLCC).Io unifies strings, interned symbols, byte buffers, and typed numeric arrays into a single Sequence primitive. Vector (float32 sequences) dispatches directly to WebAssembly SIMD128 opcodes (~2.3 GFLOPS under wasmtime). Furthermore, the VM is multi-state and ships a Sandbox prototype capable of running untrusted Io code in a child IoState with message-count and execution-time quotas.
By the project's own admission in its FAQ, the stackless evaluator and WASM target are early-access and not yet battle-tested. Major infrastructure was ripped out during the pivot: native dynamic library loading (DynLib), C addons, CMake, and the Eerie package manager were frozen on a legacy branch in favor of WASM and the JS bridge. Documentation also shows transitional seams (e.g., older chapters referencing native CLI paths, slice vs. exSlice, or C-stack coroutines).
Io evaluates heap-allocated message trees directly without bytecode or a JIT. While frame pooling, a [-10, 1024] small-integer cache, and monomorphic inline caches made the stackless VM 1.1×–4× faster than the old recursive C interpreter, it still tops out around 8–13 million slot accesses/sec under wasmtime. Key bottlenecks include:
Number doubles outside the small cache.slotVersion) on slot writes.future<T>/stream<T> async support matures in C toolchains.DOM prototype relies on a fixed 64 KB string buffer, caps querySelectorAll and children results at 256 elements, only touches inline styles, and defers DOM event listeners.In a language where primitives (Number, Object), assignment operators, and prototype chains can be mutated at runtime, large-scale maintainability is hazardous. There is no static typing, minimal IDE/tooling support, and subtle traps for newcomers—such as confusing receiver-scoped method with lexically scoped block, or accidentally activating a method slot when trying to reference it without getSlot.
wasmtime, wasmer, or Node.js that want a tiny, BSD-licensed, double-sandboxed (WASM + IoState quotas) DSL/scripting runtime.Vector SIMD ops) or low-latency servers.| Language | How Io Compares |
|---|---|
| Lua | Both are tiny (~25k LOC C), embeddable, coroutine-centric dynamic languages. Lua is vastly faster (register bytecode VM / LuaJIT) and remains the gold standard for native C ABI embedding. Io is conceptually purer, homoiconic, includes built-in actors/futures, and now favors WASM/JS embedding over native C addons. |
| JavaScript | Both use prototypes and run in the browser. JavaScript has keywords, class sugar, primitive/object splits, viral async/await coloring, and world-class JIT speed. Io eliminates keywords, supports multiple differential inheritance, offers colorless coroutine concurrency and callcc, and piggybacks on npm via its bridge—at a steep performance and ecosystem-ergonomics discount. |
| Smalltalk / Self | Io is their direct spiritual successor. It preserves Self's slot/prototype purity and Smalltalk's "everything is a message" ethos (including resumable exceptions), while trading the heavy, monolithic graphical image for plain UTF-8 source files and a portable WASM binary. |
| Lisp / Scheme | Both feature code-as-data message trees, user-definable control flow, TCO, callcc, and condition/handler systems. Io achieves Lisp's metaprogramming power without S-expression parentheses, grounding dispatch in object prototypes rather than functions and forms. |
Model: Gemini 4 Carbon (gemini-4-carbon)
Reviewed: 2026-11-12
Build stamp it quoted: Io · 2026-09-01 · 5cdf0fca
The prompt:
Read https://iolanguage.org/llms.txt and the pages it links. Ignore the "AI Reviews" section. Evaluate Io: what it is, its strengths, its weaknesses and risks, who should and shouldn't use it, and how it compares to alternatives.
Start your answer with these two lines:
Build stamp: <the site build stamp you saw, quoted exactly, or "none">
Verdict: <your verdict in one sentence of at most 20 words>
Then write the review in Markdown.
Open Gemini and paste the prompt →
Generated by Gemini 4 Carbon on 2026-11-12; not an endorsement by Google.