Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
29 lines (29 loc) · 31.3 KB
/
Copy pathindex.html
File metadata and controls
29 lines (29 loc) · 31.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<link rel="stylesheet" href="./colvmn/style.css">
<title>Io</title>
<link rel="alternate" type="text/plain" title="llms.txt" href="/llms.txt">
<meta name="description" content="A small, prototype-based programming language — now targeting WASM/WASI.">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Io">
<meta property="og:title" content="Io">
<meta property="og:description" content="A small, prototype-based programming language — now targeting WASM/WASI.">
<meta property="og:url" content="https://iolanguage.org/">
<meta property="og:image" content="https://iolanguage.org/images/og-card.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Io">
<meta name="twitter:description" content="A small, prototype-based programming language — now targeting WASM/WASI.">
<meta name="twitter:image" content="https://iolanguage.org/images/og-card.png">
</head>
<body>
<div class="page loaded"><div class="header"><div class="brand">Io</div></div><div class="intro"><p>A small, prototype-based programming language — now targeting WASM/WASI.</p></div><h2 id="about">About</h2><div class="section"><div class="section-body"><p>Io is a dynamic, prototype-based language built on a few simple ideas taken from Smalltalk (all values are objects), Self (prototypes, not classes), NewtonScript (differential inheritance), Act1 (actors and futures for concurrency), Lisp (code is a runtime-inspectable message tree), and Lua (small and embeddable).</p><p>Its guiding design principle is simplicity and power through conceptual unification — a handful of primitives stand in for features most languages keep separate:</p><table><thead><tr><th>concept</th><th>unifies</th></tr></thead><tbody><tr><td>scopable blocks</td><td>functions, methods, closures</td></tr><tr><td>prototypes</td><td>objects, classes, namespaces, locals</td></tr><tr><td>messages</td><td>operators, calls, assigns, var access</td></tr></tbody></table><p>The VM is written in portable C and now targets WebAssembly (WASI) by default. The same binary runs under wasmtime, Node.js, or directly in the browser via a bidirectional Io↔JavaScript bridge.</p></div></div><h2 id="key-features">Key Features</h2><div class="section"><div class="section-body"><ul><li><strong>Minimal Syntax</strong> — Expressions only. No keywords, no statements, no special forms. Every expression is a message send, including assignment, operators, and control flow.</li><li><strong>Prototype-Based Objects</strong> — No classes. New objects are clones of existing ones, slots are created on write, and any object can be used as a prototype for any other.</li><li><strong>Differential Inheritance</strong> — Clones inherit by reference until a slot is assigned, so most objects carry only the deltas that distinguish them from their parents.</li><li><strong>Multiple Inheritance</strong> — Every object has a list of protos; lookup is depth-first with runtime loop detection.</li><li><strong>Messages as Code</strong> — Messages form trees that can be inspected and rewritten at runtime. Argument evaluation can be deferred, so <code>if</code>, <code>while</code>, and <code>for</code> are implementable in Io itself.</li><li><strong>Runtime Introspection</strong> — Slots, protos, message trees, and block source code are all inspectable and modifiable at runtime.</li><li><strong>Actors and Futures</strong> — Any object can receive <code>asyncSend</code> or <code>futureSend</code> messages and run its own coroutine. Futures are transparent (they become their result) and detect deadlocks automatically.</li><li><strong>Coroutines Everywhere</strong> — Concurrency uses cooperative user-level coroutines rather than OS threads, scaling to thousands of active tasks without thread-level overhead.</li><li><strong>First-Class Continuations</strong> — the VM is callcc-capable: the current computation can be captured as a first-class value and later resumed, stored, or serialized.</li><li><strong>Unified Sequences</strong> — Strings, buffers, and numeric vectors share one <code>Sequence</code> primitive, with multiple item types, text encodings, and SIMD acceleration on float vectors.</li><li><strong>WASM/WASI Target</strong> — The default build produces a single WebAssembly module that runs under wasmtime, Node.js, or in browsers, with full access to the DOM when hosted in a page.</li><li><strong>Io↔JS Bridge</strong> — Host integration on the browser target is bidirectional: Io can call JavaScript functions and JavaScript can call Io methods, replacing the native-addon model of earlier Io releases.</li><li><strong>Embeddable Core</strong> — The VM ships as a single WebAssembly module under a BSD license, embeddable in any WASM host — browsers, Node.js, or native apps via wasmtime or wasmer.</li></ul></div></div><div class="card-grid cols-2"><a class="card" href="repl/index.html"><h3>Live Interpreter</h3><p>Try Io right now — the full VM compiled to WebAssembly, running in your browser.</p><span class="arrow">View →</span></a><a class="card" href="docs/index.html"><h3>Documentation</h3><p>Guides, tutorial, language reference, and design notes.</p><span class="arrow">View →</span></a><a class="card" href="FAQ/index.html"><h3>FAQ</h3><p>Common questions about Io — its origins, philosophy, and practical use.</p><span class="arrow">View →</span></a><a class="card" href="Links/index.html"><h3>Links</h3><p>Books, tutorials, articles, papers, tools, and community resources.</p><span class="arrow">View →</span></a><a class="card" href="Timeline/index.html"><h3>Timeline</h3><p>Milestones in Io's history, from 2002 to today.</p><span class="arrow">View →</span></a><a class="card" href="Release%20Notes/index.html"><h3>Release Notes</h3><p>Notable changes in Io over the past twelve months.</p><span class="arrow">View →</span></a><a class="card" href="bench/index.html"><h3>Performance</h3><p>Benchmark results tracked over time — interpreter ops, shootout programs, and SIMD throughput.</p><span class="arrow">View →</span></a><a class="card" href="https://github.com/IoLanguage/io"><h3>GitHub Repository</h3><p>Source code, issues, and contributions.</p><span class="arrow">View →</span></a></div><div class="section"><div class="section-body"><p>For AI agents: <a href="llms.txt">llms.txt</a> (curated index) and <a href="llms-full.txt">llms-full.txt</a> (full content).</p></div></div></div>
<script src="./colvmn/layout/bundle.js" defer></script>
<script type="application/json" id="colvmn-prefetch">{"./_index.json":{"ok":true,"status":200,"content":"{\n \"title\": \"\",\n \"subtitle\": \"A small, prototype-based programming language — now targeting WASM/WASI.\",\n \"topTitle\": \"Io\",\n \"content\": [\n {\n \"type\": \"ContentText\",\n \"title\": \"About\",\n \"body\": \"\u003cp>Io is a dynamic, prototype-based language built on a few simple ideas taken from Smalltalk (all values are objects), Self (prototypes, not classes), NewtonScript (differential inheritance), Act1 (actors and futures for concurrency), Lisp (code is a runtime-inspectable message tree), and Lua (small and embeddable).\u003c/p>\u003cp>Its guiding design principle is simplicity and power through conceptual unification — a handful of primitives stand in for features most languages keep separate:\u003c/p>\u003ctable>\u003cthead>\u003ctr>\u003cth>concept\u003c/th>\u003cth>unifies\u003c/th>\u003c/tr>\u003c/thead>\u003ctbody>\u003ctr>\u003ctd>scopable blocks\u003c/td>\u003ctd>functions, methods, closures\u003c/td>\u003c/tr>\u003ctr>\u003ctd>prototypes\u003c/td>\u003ctd>objects, classes, namespaces, locals\u003c/td>\u003c/tr>\u003ctr>\u003ctd>messages\u003c/td>\u003ctd>operators, calls, assigns, var access\u003c/td>\u003c/tr>\u003c/tbody>\u003c/table>\u003cp>The VM is written in portable C and now targets WebAssembly (WASI) by default. The same binary runs under wasmtime, Node.js, or directly in the browser via a bidirectional Io↔JavaScript bridge.\u003c/p>\"\n },\n {\n \"type\": \"ContentText\",\n \"title\": \"Key Features\",\n \"body\": \"\u003cul>\u003cli>\u003cstrong>Minimal Syntax\u003c/strong> — Expressions only. No keywords, no statements, no special forms. Every expression is a message send, including assignment, operators, and control flow.\u003c/li>\u003cli>\u003cstrong>Prototype-Based Objects\u003c/strong> — No classes. New objects are clones of existing ones, slots are created on write, and any object can be used as a prototype for any other.\u003c/li>\u003cli>\u003cstrong>Differential Inheritance\u003c/strong> — Clones inherit by reference until a slot is assigned, so most objects carry only the deltas that distinguish them from their parents.\u003c/li>\u003cli>\u003cstrong>Multiple Inheritance\u003c/strong> — Every object has a list of protos; lookup is depth-first with runtime loop detection.\u003c/li>\u003cli>\u003cstrong>Messages as Code\u003c/strong> — Messages form trees that can be inspected and rewritten at runtime. Argument evaluation can be deferred, so \u003ccode>if\u003c/code>, \u003ccode>while\u003c/code>, and \u003ccode>for\u003c/code> are implementable in Io itself.\u003c/li>\u003cli>\u003cstrong>Runtime Introspection\u003c/strong> — Slots, protos, message trees, and block source code are all inspectable and modifiable at runtime.\u003c/li>\u003cli>\u003cstrong>Actors and Futures\u003c/strong> — Any object can receive \u003ccode>asyncSend\u003c/code> or \u003ccode>futureSend\u003c/code> messages and run its own coroutine. Futures are transparent (they become their result) and detect deadlocks automatically.\u003c/li>\u003cli>\u003cstrong>Coroutines Everywhere\u003c/strong> — Concurrency uses cooperative user-level coroutines rather than OS threads, scaling to thousands of active tasks without thread-level overhead.\u003c/li>\u003cli>\u003cstrong>First-Class Continuations\u003c/strong> — the VM is callcc-capable: the current computation can be captured as a first-class value and later resumed, stored, or serialized.\u003c/li>\u003cli>\u003cstrong>Unified Sequences\u003c/strong> — Strings, buffers, and numeric vectors share one \u003ccode>Sequence\u003c/code> primitive, with multiple item types, text encodings, and SIMD acceleration on float vectors.\u003c/li>\u003cli>\u003cstrong>WASM/WASI Target\u003c/strong> — The default build produces a single WebAssembly module that runs under wasmtime, Node.js, or in browsers, with full access to the DOM when hosted in a page.\u003c/li>\u003cli>\u003cstrong>Io↔JS Bridge\u003c/strong> — Host integration on the browser target is bidirectional: Io can call JavaScript functions and JavaScript can call Io methods, replacing the native-addon model of earlier Io releases.\u003c/li>\u003cli>\u003cstrong>Embeddable Core\u003c/strong> — The VM ships as a single WebAssembly module under a BSD license, embeddable in any WASM host — browsers, Node.js, or native apps via wasmtime or wasmer.\u003c/li>\u003c/ul>\"\n },\n {\n \"type\": \"ContentCards\",\n \"columns\": 2,\n \"items\": [\n {\n \"title\": \"Live Interpreter\",\n \"href\": \"repl/index.html\",\n \"subtitle\": \"Try Io right now — the full VM compiled to WebAssembly, running in your browser.\"\n },\n {\n \"title\": \"Documentation\",\n \"href\": \"docs/index.html\",\n \"subtitle\": \"Guides, tutorial, language reference, and design notes.\"\n },\n \"FAQ\",\n {\n \"title\": \"Links\",\n \"href\": \"Links/index.html\",\n \"subtitle\": \"Books, tutorials, articles, papers, tools, and community resources.\"\n },\n \"Timeline\",\n \"Release Notes\",\n {\n \"title\": \"Performance\",\n \"href\": \"bench/index.html\",\n \"subtitle\": \"Benchmark results tracked over time — interpreter ops, shootout programs, and SIMD throughput.\"\n },\n {\n \"title\": \"GitHub Repository\",\n \"href\": \"https://github.com/IoLanguage/io\",\n \"subtitle\": \"Source code, issues, and contributions.\"\n }\n ]\n },\n {\n \"type\": \"ContentText\",\n \"body\": \"\u003cp>For AI agents: \u003ca href=\\\"llms.txt\\\">llms.txt\u003c/a> (curated index) and \u003ca href=\\\"llms-full.txt\\\">llms-full.txt\u003c/a> (full content).\u003c/p>\"\n }\n ]\n}\n"},"FAQ/_index.json":{"ok":false,"status":404},"Timeline/_index.json":{"ok":true,"status":200,"content":"{\n \"title\": \"Timeline\",\n \"subtitle\": \"Milestones in Io's history, from 2002 to today.\",\n \"pageLayout\": \"timeline\",\n \"content\": [\n {\n \"type\": \"ContentTimeline\",\n \"items\": [\n { \"date\": \"2002-03\", \"title\": \"Io created\", \"subtitle\": \"Steve Dekorte begins work on Io as a minimal prototype-based language.\" },\n { \"date\": \"2002-04\", \"title\": \"Mailing list\", \"subtitle\": \"The \u003ccode>iolanguage\u003c/code> Yahoo! Group becomes the gathering place for early users and patch exchanges.\" },\n { \"date\": \"2002-04\", \"title\": \"First public release\", \"subtitle\": \"The earliest public Io releases and programming guide appear, distributed through the mailing list.\" },\n { \"date\": \"2002-08\", \"title\": \"Actors and coroutines\", \"subtitle\": \"Actors (object-oriented threads) arrive, built on coroutines and cooperative \u003ccode>yield\u003c/code>.\" },\n { \"date\": \"2002-08\", \"title\": \"Addon system\", \"subtitle\": \"First addon libraries land: Directory, XML (expat), MD5, Blowfish, regex, and OpenGL/GLUT — establishing the addon model that grows rapidly over the next year.\" },\n { \"date\": \"2002-09\", \"title\": \"Networking\", \"subtitle\": \"Sockets addon adds TCP servers and clients; UDP follows a week later. Async DNS arrives in November, and IoServer becomes a dedicated build target.\" },\n { \"date\": \"2002-10\", \"title\": \"Incremental GC\", \"subtitle\": \"Mark-and-sweep is replaced with an incremental tri-color collector with write barrier — trading a small throughput hit for far better real-time pause behavior.\" },\n { \"date\": \"2002-12\", \"title\": \"Weak links\", \"subtitle\": \"A \u003ccode>WeakLink\u003c/code> primitive is added, letting objects reference each other without preventing collection — useful for caches and back-pointers.\" },\n { \"date\": \"2003-02\", \"title\": \"Addon explosion\", \"subtitle\": \"Rapid expansion: curses, JPEG/TIFF, zlib, Perl5 regex, Objective-C bridge, SGML, SQLite, and more — Io becomes usable for real-world scripting and embedding.\" },\n { \"date\": \"2003-04\", \"title\": \"Futures\", \"subtitle\": \"\u003ccode>@\u003c/code> returns a transparent future that becomes its result when touched; \u003ccode>@@\u003c/code> fires and forgets. Deadlocks are detected by walking the future graph.\" },\n { \"date\": \"2004-07\", \"title\": \"Vector primitive (SIMD)\", \"subtitle\": \"A numeric \u003ccode>Vector\u003c/code> type with AltiVec acceleration lands. Strings, buffers, and numeric vectors unify under \u003ccode>Sequence\u003c/code>.\" },\n { \"date\": \"2005-07\", \"title\": \"Lua Workshop talk\", \"subtitle\": \"Steve presents Io at the Lua Workshop, contrasting message-tree semantics with Lua’s table-based model.\" },\n { \"date\": \"2005-10\", \"title\": \"OOPSLA / DLS\", \"subtitle\": \"Io is presented at the ACM Dynamic Languages Symposium, co-located with OOPSLA’05 in San Diego, bringing the language to a wider research audience.\" },\n { \"date\": \"2005-12\", \"title\": \"Public DARCS repository\", \"subtitle\": \"A public source repository hosted at iolanguage.com/darcs/Io replaces the email-patch workflow.\" },\n { \"date\": \"2007-03\", \"title\": \"Migration to git\", \"subtitle\": \"Source history moves from DARCS to git, hosted on iolanguage.com.\" },\n { \"date\": \"2008-02\", \"title\": \"Published on GitHub\", \"subtitle\": \"The Io repository appears at \u003ca href=\\\"https://github.com/IoLanguage/io\\\">github.com/IoLanguage/io\u003c/a>, making issues and pull requests the primary contribution channel.\" },\n { \"date\": \"2009-10\", \"title\": \"Portable ucontext\", \"subtitle\": \"Russ Cox’s portable ucontext replaces platform-specific coroutine code, enabling cross-platform support including 64-bit macOS.\" },\n { \"date\": \"2010-05\", \"title\": \"CMake build system\", \"subtitle\": \"The build moves from hand-written Makefiles to CMake, simplifying ports and addon builds.\" },\n { \"date\": \"2012-01\", \"title\": \"Io Book on Apple iBooks\", \"subtitle\": \"Steve Dekorte publishes \u003cem>Io\u003c/em> on the Apple iBooks Store on 2012-01-23 — a compact introduction to the language, prototypes, messages, and concurrency.\" },\n { \"date\": \"2017-11\", \"title\": \"Eerie package manager\", \"subtitle\": \"Josip Lisec’s \u003ccode>Eerie\u003c/code> package manager is rewritten by Ales Tsurko under the IoLanguage org, with heavy activity through 2021.\" },\n { \"date\": \"2025-07\", \"title\": \"ARM64 coroutines\", \"subtitle\": \"Native ARM64 coroutine support lands for Apple Silicon and modern Linux.\" },\n { \"date\": \"2026-02\", \"title\": \"Stackless evaluator\", \"subtitle\": \"The recursive C-stack evaluator is replaced with a heap-allocated frame state machine — enabling TCO, robust exception unwinding, and first-class continuations.\", \"href\": \"../docs/Technical%20Notes/Stackless/index.html\" },\n { \"date\": \"2026-03\", \"title\": \"Resumable exceptions\", \"subtitle\": \"Common Lisp–style \u003ccode>signal\u003c/code> / \u003ccode>withHandler\u003c/code>: handlers can resume, fall through, or unwind — made practical by the stackless evaluator.\" },\n { \"date\": \"2026-03\", \"title\": \"WASM/WASI port\", \"subtitle\": \"Io cross-compiles to WebAssembly. A bidirectional Io↔JavaScript bridge replaces the native addon model.\", \"href\": \"../docs/Technical%20Notes/WASM/index.html\" },\n { \"date\": \"2026-03\", \"title\": \"Async/await bridge\", \"subtitle\": \"Io futures tie into JavaScript Promises: \u003ccode>asyncSend\u003c/code> and future touches \u003ccode>yield\u003c/code> the eval loop across the JS boundary, and unrecognized messages on a future implicitly await the result.\" },\n { \"date\": \"2026-03\", \"title\": \"BigInt support\", \"subtitle\": \"A \u003ccode>BigInt\u003c/code> primitive arrives with arbitrary-precision arithmetic and transparent round-tripping across the Io↔JS bridge, aligning Io numerics with modern JavaScript.\" },\n { \"date\": \"2026-04\", \"title\": \"SIMD128 Vector backend\", \"subtitle\": \"The \u003ccode>Vector\u003c/code> primitive gains a WebAssembly SIMD128 backend, restoring the AltiVec-era vector acceleration in the browser and on modern hardware via WASM.\" },\n { \"date\": \"2026-04\", \"title\": \"WASM merged to master\", \"subtitle\": \"The WASM branch becomes the default target. Book and site restructured for the new era.\" }\n ]\n }\n ]\n}\n"},"Release%20Notes/_index.json":{"ok":true,"status":200,"content":"{\n \"title\": \"Release Notes\",\n \"subtitle\": \"Notable changes in Io over the past twelve months.\",\n \"content\": [\n {\n \"type\": \"ContentText\",\n \"body\": \"\u003cp>Io uses date-based versioning. This page collects the notable changes of the last twelve months — a period in which the VM was rewritten around a stackless evaluator and re-targeted from native binaries to WebAssembly. Entries marked \u003cem>tagged\u003c/em> correspond to release tags in the \u003ca href=\\\"https://github.com/IoLanguage/io\\\">repository\u003c/a>; the rest are development milestones on the road between them. For the longer arc, see the \u003ca href=\\\"../Timeline/index.html\\\">Timeline\u003c/a>.\u003c/p>\"\n },\n {\n \"type\": \"ContentText\",\n \"title\": \"Unreleased — current master\",\n \"body\": \"\u003cp>Changes on \u003ccode>master\u003c/code> since the WASM merge, not yet part of a tagged release.\u003c/p>\u003cul>\u003cli>\u003cstrong>WASI 0.2 component build\u003c/strong> — \u003ccode>make component\u003c/code> builds the VM as a WebAssembly component (\u003ccode>wasm32-wasip2\u003c/code>) alongside the core WASI module.\u003c/li>\u003cli>\u003cstrong>Cooperative scheduler timer queue\u003c/strong> — \u003ccode>wait\u003c/code> parks the calling coroutine on a timer queue instead of busy-spinning; timed coroutines run concurrently and the VM idles in a single host wait until the next deadline.\u003c/li>\u003cli>\u003cstrong>Live Interpreter\u003c/strong> — an in-browser REPL running the full VM, linked from the home page.\u003c/li>\u003cli>\u003cstrong>Performance tracking\u003c/strong> — a benchmark page recording interpreter, shootout, and SIMD results over time.\u003c/li>\u003cli>\u003cstrong>WASI 0.3 notes\u003c/strong> — design notes on adopting native-async components (\u003ccode>future\u003c/code>/\u003ccode>stream\u003c/code>) once host and toolchain support land.\u003c/li>\u003c/ul>\"\n },\n {\n \"type\": \"ContentText\",\n \"title\": \"2026.04.20 — WASM becomes the default target\",\n \"body\": \"\u003cp>\u003cem>Tagged \u003ccode>2026.04.20-native-final\u003c/code>.\u003c/em> The WASM branch merged to \u003ccode>master\u003c/code> (\u003ca href=\\\"https://github.com/IoLanguage/io/pull/495\\\">#495\u003c/a>); WebAssembly/WASI is now the default and only build target. The final native build — CMake, Eerie, and DynLib — is frozen at this tag, with ongoing native work on the \u003ccode>native\u003c/code> branch.\u003c/p>\u003cul>\u003cli>\u003cstrong>SIMD128 Vector backend\u003c/strong> — the \u003ccode>Vector\u003c/code> primitive gains a WebAssembly SIMD128 backend, restoring AltiVec-era vector acceleration on modern hardware and in the browser.\u003c/li>\u003cli>\u003cstrong>64-bit integer literals\u003c/strong> — integer literals no longer truncate to 32 bits (\u003ca href=\\\"https://github.com/IoLanguage/io/issues/420\\\">#420\u003c/a>).\u003c/li>\u003cli>\u003cstrong>Map equality\u003c/strong> — \u003ccode>Map\u003c/code> implements comparison for equality (\u003ca href=\\\"https://github.com/IoLanguage/io/issues/28\\\">#28\u003c/a>).\u003c/li>\u003cli>\u003cstrong>JSON singletons\u003c/strong> — \u003ccode>asJson\u003c/code> added to \u003ccode>nil\u003c/code>, \u003ccode>true\u003c/code>, and \u003ccode>false\u003c/code> (\u003ca href=\\\"https://github.com/IoLanguage/io/issues/27\\\">#27\u003c/a>).\u003c/li>\u003cli>\u003cstrong>\u003ccode>isKindOf\u003c/code> fix\u003c/strong> — ancestor checks use identity comparison (\u003ca href=\\\"https://github.com/IoLanguage/io/issues/201\\\">#201\u003c/a>).\u003c/li>\u003cli>Site and Book restructured for the WASM era; continuous integration rewritten for the WASM toolchain.\u003c/li>\u003c/ul>\"\n },\n {\n \"type\": \"ContentText\",\n \"title\": \"2026.03.06 — Stackless alpha, WASM port, and the JS bridge\",\n \"body\": \"\u003cp>\u003cem>Tagged \u003ccode>2026.03.06-stackless-alpha\u003c/code>.\u003c/em> The first alpha of the stackless VM, together with the initial WebAssembly port and a new JavaScript integration model.\u003c/p>\u003cul>\u003cli>\u003cstrong>WASM/WASI cross-compilation\u003c/strong> — the VM compiles to a single portable WebAssembly module that runs under wasmtime, Node.js, or the browser.\u003c/li>\u003cli>\u003cstrong>Bidirectional Io↔JavaScript bridge\u003c/strong> — Io can call JavaScript functions and JavaScript can call Io methods, replacing the native addon model. DynLib, AddonLoader, and the Eerie addon infrastructure were removed.\u003c/li>\u003cli>\u003cstrong>Async/await across the bridge\u003c/strong> — futures integrate with JavaScript Promises: the eval loop yields and resumes across the JS boundary, and an unrecognized message sent to a pending future implicitly awaits its result.\u003c/li>\u003cli>\u003cstrong>\u003ccode>BigInt\u003c/code>\u003c/strong> — arbitrary-precision integers with transparent round-tripping across the Io↔JS bridge.\u003c/li>\u003cli>\u003cstrong>Browser REPL\u003c/strong> — an interactive interpreter hosted in a web page, with demos for the bridge, DOM access, async, and callbacks.\u003c/li>\u003cli>Strings default to UTF-8.\u003c/li>\u003c/ul>\"\n },\n {\n \"type\": \"ContentText\",\n \"title\": \"2026.02 — Stackless evaluator\",\n \"body\": \"\u003cp>The recursive, C-stack-based evaluator was replaced with a heap-allocated frame state machine — the foundation the WASM port builds on. With no native C stack to switch, the platform-specific coroutine assembly is no longer needed.\u003c/p>\u003cul>\u003cli>\u003cstrong>Iterative eval loop\u003c/strong> — evaluation runs on a frame state machine instead of C recursion.\u003c/li>\u003cli>\u003cstrong>First-class continuations\u003c/strong> — the current computation can be captured, resumed, stored, or serialized (\u003ccode>callcc\u003c/code>, behind the \u003ccode>IO_CALLCC\u003c/code> build flag).\u003c/li>\u003cli>\u003cstrong>Tail-call optimization\u003c/strong> — including through \u003ccode>if\u003c/code> branches.\u003c/li>\u003cli>\u003cstrong>Robust exception unwinding\u003c/strong> — Io-level exceptions are unwound by the eval loop rather than C \u003ccode>setjmp\u003c/code>/\u003ccode>longjmp\u003c/code>.\u003c/li>\u003cli>\u003cstrong>Resumable exceptions\u003c/strong> — Common Lisp–style \u003ccode>signal\u003c/code> / \u003ccode>withHandler\u003c/code>: a handler can resume at the signal site, fall through, or unwind.\u003c/li>\u003cli>\u003cstrong>GC-managed eval frames\u003c/strong> — frames are pooled, garbage-collected objects; coroutines became frame-based and the old platform-specific coroutine library was removed.\u003c/li>\u003c/ul>\"\n },\n {\n \"type\": \"ContentText\",\n \"title\": \"2025.07 — ARM64 coroutines\",\n \"body\": \"\u003cp>Native ARM64 coroutine support for Apple Silicon and modern Linux (\u003ca href=\\\"https://github.com/IoLanguage/io/pull/476\\\">#476\u003c/a>) — the last major addition to the native-era coroutine implementation before the stackless rewrite made platform-specific coroutine code unnecessary.\u003c/p>\"\n }\n ]\n}\n"},"FAQ/_index.md":{"ok":true,"status":200,"content":"# FAQ\n\nCommon questions about Io — its origins, philosophy, and practical use.\n\n## Who created Io, and when?\n\nIo was created by Steve Dekorte, starting in 2002, as an experiment in seeing how small a language could be while still expressing ideas borrowed from Smalltalk, Self, NewtonScript, Act1, and Lisp.\n\n## What makes Io different from other languages?\n\nIo has no keywords and no statements — only expressions, and every expression is a message send. Assignment, conditionals, and loops are ordinary methods that receive their arguments as unevaluated message trees, which keeps the core tiny and makes control flow and DSLs first-class citizens of the language.\n\nEvery object is a prototype. There are no classes, no distinction between instances and templates, and no hidden machinery for inheritance — any object can be cloned and any clone can be used as a proto for further objects.\n\nConcurrency is built around actors and futures rather than threads. Any object can receive `asyncSend` or `futureSend` messages and run its own coroutine; futures are transparent (they become their result when touched) and the VM detects deadlocks by walking the future graph.\n\nThe evaluator is stackless — execution runs on a heap-allocated frame state machine instead of the C stack — enabling first-class continuations (`callcc`), portable coroutines without platform-specific assembly, and robust exception unwinding without `setjmp`/`longjmp`.\n\n## Is Io production-ready?\n\nThe classic Io VM is small, stable, and has been used in shipping products, embedded devices, and research. It is not trying to compete with JavaScript or Python on ecosystem size — it is a language for people who value expressiveness, simplicity, and runtime flexibility over a large standard library or raw throughput.\n\nThe new WASM target (and the stackless evaluator it is built on) is not yet well tested — treat it as early-access until it has more mileage.\n\n## How is Io different from JavaScript, which is also prototype-based?\n\nJavaScript has classes, `new`, statements, keywords, and a sharp distinction between primitives and objects. Io has none of these. Inheritance is differential — clones share their proto's slots until written — and multiple inheritance falls out naturally because every object carries a list of protos.\n\nControl flow is not built in. In Io, `if`, `while`, and `for` are regular methods written in Io itself, made possible because messages receive their arguments as unevaluated message trees.\n\nConcurrency is coroutine-based rather than callback- or `async`/`await`-based. There is no function coloring — any method can yield, and any object can be sent asynchronously with `@` (futures) or `@@` (fire-and-forget). Code that waits on a future reads like straight-line code; there is no separate async function type or await keyword to propagate through call sites.\n\nThe evaluator is stackless — execution runs on heap-allocated frames rather than the C stack — so Io also has first-class continuations (`callcc`), something JavaScript does not expose at all.\n\n## Why a WASM/WASI target?\n\nWebAssembly gives Io a single portable binary that runs under wasmtime, Node.js, or a browser — without platform-specific build matrices, coroutine assembly, or native addons. Hosting Io in a browser unlocks direct DOM access, and the bidirectional Io↔JavaScript bridge replaces the old native-addon model with something that works the same everywhere the host does.\n\n## Can Io still embed in a C or native application?\n\nYes — a WebAssembly module is an embeddable binary by design. You can run the Io VM inside a browser, inside Node.js, or inside a native application via a WASM runtime like wasmtime or wasmer. The VM is BSD-licensed.\n\n## How does concurrency work?\n\nEvery object can receive async messages (`@@`) or future messages (`@`) that run in their own coroutine. Coroutines are cooperative user-level tasks — not OS threads — so a single Io process can run thousands of them at once. Futures are transparent: the caller keeps running until it tries to use the result, then blocks only if the result isn't ready yet.\n\n## How is Io pronounced?\n\n\"EYE-oh\" (/ˈaɪ.oʊ/) — the same way you'd say the name of Jupiter's moon.\n\n## Where does the name \"Io\" come from?\n\nA combination of searching for short two-letter names, childhood memories of the Voyager photos of Jupiter's moon Io, and the I/O towers from the movie *TRON*.\n\n## How do I contribute?\n\nThe source lives at [github.com/IoLanguage/io](https://github.com/IoLanguage/io). Open issues, send pull requests, or just clone and experiment.\n"}}</script>
</body>
</html>