Io é uma linguagem de programação puramente orientada a objetos inspirada por Smalltalk, Self, Lua, Lisp, Act1, e NewtonScript[2]. Io tem um modelo de objetos baseada em protótipos similar aos de Self e NewtonScript, eliminando a distinção entre instância e classe. Como em Smalltalk, tudo é um objeto, e usa tipagem dinâmica. Como Lisp, os programas são só uma árvore de dados. Io usa atores para concorrência, uma técnica raramente utilizada em linguagem de programação modernas.
Características marcantes de Io são seu pequeno tamanho e abertura para usar recursos externos. [carece de fontes?] Io é executada por uma pequena, máquina virtual portátil.
A linguagem foi criada por Steve Dekorte por volta de 7 Março de 2002, depois de tentar ajudar um amigo, Dru Nelson, com sua linguagem, Cel. Ele descobriu que não sabia muita coisa sobre como as linguagens funcionavam, e começou a escrever uma pequena linguagem para entender melhor o problema.
O objetivo de Io é explorar a unificação conceitual e linguagens dinâmicas, para que o os tradeoffs tendam em favorecer simplicidade e flexibilidade ao invés de performance.
A sintaxe de Io e quase não existente. Em sua forma mais simples, ela é composta de um único identificador:
doStuff
Assumindo que acima doStuff é um método, ele é chamado com zero argumentos e como resultado parêntesis explícitos não são necessários.
Se doStuff tivesse argumentos, se pareceria com isso:
doStuff(42)
Io é uma linguagem de troca de mensagens, e já que tudo em Io é uma mensagem (excluindo comentários), cada mensagem é enviada para um destinatário. O exemplo acima demonstra isso bem, mas não em completo. Para descrever esse ponto melhor, vamos olhar o próximo exemplo:
System version
O exemplo acima demonstra a troca de mensagens em Io a mensagem "version" é enviada para o objeto "System".
Operadores são um caso especial onde a sintaxe não é tão simples como no exemplo acima. O parser de Io intercepta um conjunto de operadores definidos pelo interpretador, e os traduz para chamadas de método. Por exemplo, o seguinte:
1 + 5 * 8 + 1
é traduzido para:
1 +(5 *(8)) +(1)
Como você pode ver, há também um pouco de ordem de operações acontecendo aqui, e os níveis de precedência são os mesmos que dos níveis de precedência de C.
Os operadores também foram transformados em chamadas de métodos. De fato, todos os operadores em Io são métodos, o fato de que eles não requerem um parêntesis explicito é uma conveniência.