Io
A small, pure object-oriented language built on a Self-style prototype model where everything is an object and every action is a message.
Created by Steve Dekorte
Io is a small, pure object-oriented programming language created by Steve Dekorte in 2002. It pushes a handful of ideas to their logical conclusion: everything is an object, every operation is a message sent to an object, and objects are created by cloning other objects rather than by instantiating classes. The result is a language with an exceptionally tiny conceptual core — you can hold nearly all of its semantics in your head — yet enough expressive power to support concurrency, reflection, and metaprogramming.
History & Origins
Io began in March 2002, almost by accident. Steve Dekorte had been trying to help his friend Dru Nelson with a language called Cel and realized, in the process, that he didn’t actually understand how programming languages worked under the hood. So he set out to write a tiny language of his own as a way to learn. He released the first version in April 2002.
That origin shaped everything about Io. Because it was meant to be understood rather than to compete commercially, Dekorte kept the language deliberately small and prioritized conceptual clarity over raw performance. Io draws openly from a lineage of elegant, minimal languages:
- Smalltalk — everything is an object, and computation happens by passing messages
- Self and NewtonScript — prototype-based inheritance with no class/instance distinction; objects clone from other objects (differential inheritance)
- Lisp — code is data, represented as a runtime-inspectable tree of messages (homoiconicity)
- Lua — a small, embeddable footprint and minimal syntax
- Act1 — actors and futures as the basis for concurrency
Io has always remained a small, mostly hobbyist project. Its profile rose notably in 2010 when Bruce Tate included it in Seven Languages in Seven Weeks, where it represented the prototype-based, message-passing branch of language design.
Design Philosophy
Io’s guiding principle is conceptual unification: rather than offering many special-cased features, it provides a few simple rules that compose consistently. There is no distinction between statements and expressions, between operators and methods, or between classes and instances. Once you understand that everything is a message send to a receiver, the rest of the language follows.
This minimalism is intentional. Io favors simplicity and flexibility over speed, making it ideal for learning, embedding, and experimentation rather than for performance-critical production systems.
Key Features
Prototypes, Not Classes
Io has no classes. New objects are made by cloning existing ones, and inheritance is differential — a clone stores only what differs from its prototype and delegates everything else.
| |
Everything Is a Message
Even arithmetic and control flow are messages sent to objects. 1 + 2 is the message + with argument 2 sent to the object 1.
| |
Code as Data (Homoiconicity)
An Io program is parsed into a tree of message objects that the program can inspect and manipulate at runtime, much like Lisp’s s-expressions.
| |
Concurrency with Coroutines, Actors, and Futures
Io’s concurrency model is built on lightweight, cooperative coroutines rather than OS threads, so a program can run many thousands of concurrent activities cheaply. Any object can be turned into an actor by sending it an asynchronous message, and futures stand in transparently for results not yet computed.
| |
Futures are transparent — they behave as the eventual result — and the runtime can detect deadlocks among waiting coroutines automatically.
Reflection and Metaprogramming
Because slots, methods, and messages are all first-class objects, Io programs can inspect and rewrite themselves at runtime. This makes operator overloading, DSL construction, and behavior injection straightforward.
| |
The Virtual Machine
Io runs on a small, portable virtual machine written in C, with an incremental garbage collector that supports weak references. The VM was designed to be embeddable, exposing a clean C interface so that Io can be dropped into host applications as a scripting language. The interpreter is small enough to build and study in an afternoon — a deliberate consequence of the language’s educational origins.
Evolution
Io has never aimed for rapid feature growth. After its 2002 debut it accumulated a standard library (collections, networking, regular expressions, a foreign function interface, and more) while keeping its core semantics stable. Later releases adopted date-based version numbers, such as 2017.09.06. Development quieted for a stretch but reportedly revived in 2026 with a port targeting WebAssembly (WASM/WASI), the 2026.04.20 native-final release marking the last native build before the WASM merge.
The language’s ideas, however, propagated. Ioke, created by Ola Bini in 2008, brought an Io-inspired prototype model to the JVM, blending it with Lisp and Ruby influences. Potion, created by _why the lucky stiff around the same time, built an Io-style message-passing object system atop a Lua-like VM and reused Dekorte’s coroutine and garbage-collection libraries.
Current Relevance
Io is best understood today as a beautifully compact case study in language design rather than as a production workhorse. It rewards study for several reasons:
- Clarity of model — few languages express the “everything is an object and a message” idea as purely
- Prototype-based OOP — alongside JavaScript and Self, Io is a canonical example of classless inheritance
- Cooperative concurrency — its actor-and-future model demonstrates concurrency without threads in a digestible form
- Embeddability — its small C VM remains a reference point for embedded scripting design
Community activity is modest, and newcomers should expect a smaller ecosystem than mainstream languages offer. Interest in Io’s design persists: there is reportedly a separate community reimplementation in Go, and the original project itself saw renewed activity in 2026 with a WebAssembly port.
Why It Matters
Io demonstrates how much expressive power can come from how little machinery — a single uniform rule about messages and prototypes, applied consistently. By stripping away the distinctions between classes and instances, operators and methods, and code and data, it makes the deep structure of object-oriented and dynamic languages unusually visible. For anyone wanting to understand how interpreters, prototype inheritance, or actor-based concurrency actually work, Io remains one of the clearest teachers available — which is exactly what its creator set out to build.
Timeline
Notable Uses & Legacy
Language Design Education
Io was born as a learning exercise and remains a favorite teaching language for studying prototype-based object models, message passing, and interpreter internals.
Embedded Scripting
Its small, portable virtual machine and clean C API were designed so Io can be embedded into host applications as a scripting layer.
Seven Languages in Seven Weeks
Io serves as one of the seven languages in Bruce Tate's influential book, chosen to illustrate prototype-based, message-oriented programming.
Concurrency Experiments
Io's coroutine-based actors and transparent futures make it a compact platform for exploring cooperative concurrency without OS threads.
Language Prototyping
Its homoiconic, code-as-a-message-tree design and tiny core make Io well suited to experimenting with new language ideas and embedded DSLs.