Io (ohjelmointikieli)

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. Vuonna 2005 kielen suosio nousi.

 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 
 Open Directory: Programming: Languages: Io
 jEdit - "Programmer's Text Editor" sisältää syntaksinkorostuksen Io:lle
 https://dl.acm.org/doi/10.1145/1094855.1094916

 Lähteet 
Luokka:Oliopohjaiset ohjelmointikielet