**Io** on puhdas olio-ohjelmointikieli, joka on saanut vaikutteita Smalltalk-, Self-, Lua-, Lisp-, Act1- ja NewtonScript-ohjelmointikielistä. Io käyttää prototyyppipohjaista oliomallia Self- ja NewtonScript-kielten tavoin poistaen näin eron olioinstanssien ja luokkien välillä. Kaikki ovat olioita, kuten Smalltalkissa, ja tyypitys on dynaaminen. Kielessä ei ole lauseita, vaan kontrollivuon hallinta tehdään funktioilla, ja ohjelmat ovat vain datapuita. Io käyttää aktorimallia, nykykielissä harvinaista tekniikkaa, rinnakkaisuuden toteuttamiseen.

Huomattavia ominaisuuksia Io:ssa ovat tehokkuus, minimaalinen koko ja avoimuus ulkoisia resursseja käyttämällä. Io:a suoritetaan pienessä, siirrettävässä virtuaalikoneessa.

Historia
--------

Steve Dekorte loi kielen maaliskuun 7. 2002 yritettyään auttaa ystävää tämän tekemän kielen optimoinnissa. Hän huomasi, ettei tiennyt juurikaan ohjelmointikielten toiminnasta, ja kirjoitti uuden pienen kielen ymmärtääkseen paremmin aiheeseen liittyviä ongelmia.

Filosofia
---------

Io:n tavoite on tutkiskella konseptien yhdistämistä ja dynaamisia kieliä, joten kieli tapaa suosia yksinkertaisuutta ja joustavuutta tehokkuuden kustannuksella.

Ominaisuuksia
-------------

* puhdas oliomalli, joka perustuu prototyyppipohjaiseen ohjelmointiin
* poikkeusten käsittely
* Perl-tyyliset säännölliset lausekkeet
* inkrementaalinen roskienkerääjä, joka tukee heikkoja viittauksia
* korkea siirrettävyys
* tuki dynaamisesti linkitetyille kirjastoille lähes joka alustalla
* itsehavainnointi, reflektio ja metaohjelmointi
* aktorimalli
* näennäisrinnakkaiset korutiinit
* pieni virtuaalikone
* korkeamman asteen funktiot

Syntaksi
--------

Io:n syntaksi on hyvin läpinäkyvä. Yksinkertaisimmassa muodossa se koostuu yksittäisestä tunnuksesta:

```
 teeJotain

```

Jos oletetaan, että teeJotain on metodi, yllä
oleva on metodikutsu ilman argumentteja, jolloin argumentteja erottavia sulkuja tarvita.

Jos teeJotain:n kutsu sisältää argumentteja, se näyttää tältä:

```
 teeJotain(42)

```

Io on viestinvälitystä käyttävä kieli ja koska kaikki paitsi kommentit ovat Io:ssa viestejä, jokainen viesti lähetetään vastaanottajalle. Ylläolevaa kuvaa tätä tilannetta, mutta asia käy paremmin ilmi seuraavasta:

```
 System version

```

Tämä esimerkki näyttää, kuinka viestinvälitys toimii Io:ssa; "version"-viesti lähetetään "System"-oliolle. Aiemmissa esimerkeissä vastaanottaja riippuu kontekstista.

Operaattorit ovat Io:n syntaksissa erikoistapaus, eivätkä toimi suoraan yllä esitetyllä tavalla. Io:n jäsennin poimii kielen tulkin määrittelemät operaattorit ja muuntaa ne tavallisiksi metodikutsuiksi. Esimerkiksi:

```
 1 + 5 \* 8 + 1

```

muunnetaan muotoon:

```
 1 +(5 \*(8)) +(1)

```

Esimerkki näyttää, kuinka operaattorien sitovuus on erilainen (kertolasku sitoo enemmän kuin yhteenlasku). Io:n sitovuustasot ovat vastaavat kuin C-kielessä.

Kaikki operaattorit Io:ssa ovat metodeita; operaattorien erikoiskohtelu jäsennettäessä on lähinnä mukavuusominaisuus.

### Metodit ja lohkot

Io:ssa on kaksi tapaa tehdä anonyymejä funktioita: metodit ja lohkot. Ne ovat lähes identtisiä, paitsi yhden ominaisuuden, näkyvyysalueen, osalta. Lohkoilla on leksikaalinen ja metodeilla dynaaminen näkyvyysalue.

Sekä metodit että lohkot ovat korkeamman asteen funktioita.

### Esimerkkejä

Hei maailma -esimerkki:

```
 "Hei, maailma!" println

```

Uusia olioita luodaan kloonaamalla olioita. Io:ssa erityisesti kloonaus luo uuden tyhjän olion, ja eroavaisuudet sen ja vanhemman välillä luodaan uuteen olioon - tätä kutsutaan nimellä differentiaalinen perintä. Esimerkki tästä:

```
 A := Object clone // luo uuden tyhjän olion nimeltä "A"

```

Yksinkertainen ei-rekursiivinen kertomafunktio:

```
 kertoma := method(n,
 if(n == 0, return 1)
 res := 1
 n to(1) foreach(i, res = res \* i)
 res
 )

```

Esimerkki esittelee lukuvälin käyttöä, eikä käytä for-silmukkaa, joka on nopeampi.

Aiheesta muualla
----------------

* Io:n kotisivu
* Io Notes (Arkistoitu – Internet Archive)
* Open Directory: Programming: Languages: Io
* jEdit - "Programmer's Text Editor" sisältää syntaksinkorostuksen Io:lle