Est. 2002 Intermediate

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

Paradigm Prototype-based, Object-Oriented
Typing Dynamic, Strong
First Appeared 2002
Latest Version Io 2026.04.20 (native-final, April 2026)

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Dog := Object clone
Dog bark := method("Woof!" println)
Dog sound := "generic"

fido := Dog clone
fido bark        // prints: Woof!

// Override just one slot; the rest is delegated
Puppy := Dog clone
Puppy bark := method("Yip!" println)
Puppy bark       // prints: Yip!

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.

1
2
3
4
5
6
1 + 2 println          // 3
"Hello" reverse println // olleH

// Control flow is just messages too
x := 10
if(x > 5, "big" println, "small" println)

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.

1
2
3
m := message(foo bar baz)
m name println          // foo
m next name println     // bar

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.

1
2
3
4
5
6
7
// asyncSend returns immediately; the work runs in its own coroutine
obj := Object clone
obj longTask := method(wait(1); "done")
future := obj futureSend(longTask)

// The future transparently becomes its value when accessed
future println   // blocks only if the result isn't ready yet

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.

1
2
3
4
Object myMethods := method(self slotNames sort)
account := Object clone
account balance := 100
account slotNames println   // list including "balance"

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:

  1. Clarity of model — few languages express the “everything is an object and a message” idea as purely
  2. Prototype-based OOP — alongside JavaScript and Self, Io is a canonical example of classless inheritance
  3. Cooperative concurrency — its actor-and-future model demonstrates concurrency without threads in a digestible form
  4. 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

2002
Steve Dekorte begins writing Io in March 2002 as a self-education project to understand how language interpreters work, releasing the first version in April
2008
Ola Bini releases Ioke, a JVM language whose name and design draw directly on Io's prototype model
2008
Potion, a small dynamic language by _why the lucky stiff, adopts an Io-style message-passing object model and uses Dekorte's libcoroutine and libgarbagecollector
2010
Io is featured as one of the seven languages in Bruce Tate's book Seven Languages in Seven Weeks, raising its profile among developers
2017
Version 2017.09.06 is released; date-based versioning continues, though development quiets for a time
2026
Development revives with a port targeting WebAssembly (WASM/WASI); the 2026.04.20 'native-final' release marks the last native build before the WASM merge

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.

Language Influence

Influenced By

Smalltalk Self NewtonScript Lisp Lua Act1

Influenced

Ioke Potion

Running Today

Run examples using the official Docker image:

docker pull
Last updated: