stanford-oval/wikipedia huggingface dataset:
Olio-ohjelmointi
Historia > Läpimurto

Olioperustainen ohjelmointi teki läpimurtonsa 1980-luvun puolivälissä, kun useat tahot kehittivät olioperustaisia kieliä, ohjelmistojen suunnittelumenetelmiä ja niitä tukevia CASE-välineitä sekä yksittäisiä sovelluksia. Lisäksi kiinnostuksen kasvu näkyi uusissa olioperustaisuutta käsittelevissä konferenssisarjoissa, lehdissä ja kirjoissa. Ensimmäinen tuotantokäytössä yleistynyt ohjelmointikieli oli C++. Bjarne Stroustrup kehitti sen Bell Labs -tutkimuskeskuksessa. Vuonna 1980 julkaistu versio oli kehitetty C-kielestä, johon oli lisätty oliotuki. Stroustrup kutsui sitä nimellä ”C with classes”. Kieli otettiin 1983 käyttöön myös Bell Labsin ulkopuolella, jolloin Rick Mascitti keksi nimen C++. Kielen kehittämisen motiivina oli alkuun saada simulointisovelluksiin Simulaa tehokkaampi kieli. Uuden kielen pohjaksi valittiin C, koska se oli suhteellisen matalan tason ohjelmointikieli ja sille oli valmiina toteutuksia lähes kaikissa ympäristöissä. C++ kehittyi vielä voimakkaasti 1980-luvun aikana: siihen lisättiin muun muassa moniperintä, parametrisoidut tyypit ja poikkeusten käsittely. Borland lisäsi omaan Turbo Pascal -kehitysympäristöönsä olio-ohjelmoinnin mahdollisuuden vuonna 1986 (Macintosh-versio). MS-DOS versio julkaistiin vuonna 1989.
Java-ohjelmointikielen kehitys lähti liikkeelle 1990-luvun alkupuolella, kun tarvittiin luotettavia ohjelmistoja erilaisille mahdollisesti verkkoon kytketyille elektronisille laitteille. Sun Microsystemsillä toiminut ryhmä halusi kehittää tarkoitukseen oman kielensä. Ryhmä tutki ensin C++:n käyttöä, mutta he totesivat sen monissa tapauksissa epätarkoituksenmukaiseksi. Java kehitettiin C++:n pohjalta, ja sen pääasiallisin kehittäjä oli James Gosling. Siitä poistettiin monia C++-kielessä virheitä aiheuttavia ominaisuuksia, kuten moniperintä. Sun Microsystemsin ryhmä alkoi 1994 tutkia Javan sopivuutta verkkosovelluksiin, ja keväällä 1994 yritys julkisti Javan lisäksi HotJava-selaimen. Java alkoi tämän jälkeen levitä verkossa, ja uusia Java-ohjelmistoja ilmestyi nopeaan tahtiin. Microsoftkin ilmoitti vuoden 1995 lopulla lisäävänsä ohjelmistoihinsa Java-tuen.
Python-kieli on tullut suosituksi vuosituhannen vaihteen jälkeen. Python on tulkattu ja dynaamisesti tyypitetty ohjelmointikieli, jossa tyyppitarkastukset tehdään ajon aikana. Pythonia pidetään varsin puhdasoppisena oliokielenä ja se on rakenteeltaan yksinkertainen. Pythonia käytetään eniten pienimuotoisten prototyyppien nopeaan kehitykseen.
2000-luvulla on syntynyt ainakin yksi uusi merkittävä oliokieli. Javaa hyvin paljon muistuttava C# on Microsoftin vuonna 2002 lanseeraama .NET-alustassa käytettävä kieli.  Toinen Microsoftin .NET alustalle lanseerattu oliopohjainen kieli on Visual Basic.NET (VB.NET). Kumpikin näistä kahdesta .NET -alustan ohjelmistokehysratkaisusta osoittaa omalla tavallaan olio-ohjelmoinnin käytön hyödyn luomalla abstraktioita toteutuksesta. VB.NET ja C# tukevat kielten välistä periytymistä, jolloin toisella kielellä määritellyt luokat voivat periytyä toisella kielellä määritellyistä luokista.
Polymorfismi - monimuotoisuus

Alatyypitys (subtyping) on yksi monimuotoisuuden ilmentymä. Alatyypityksessä kutsuttu koodi voi olla riippumaton siitä, missä tuetussa hierarkiassa se toimii, esimerkiksi kantaluokka tai jokin kantaluokan lapsiluokka. Samaan aikaan, esimerkiksi saman niminen metodi eri luokissa voi toimia eri tavalla, kun on kyse periytymisestä.
Esimerkiksi luokat, jotka ovat tyyppiä Ympyrä ja Neliö, ovat periytyneet kantaluokasta Muoto. Piirrä-metodi jokaisella luokalla, jotka ovat periytyneet Muoto-luokasta, implementoivat  metodin itselleen vaatimallaan tavalla, jotta vaadittu muoto piirtyy. Samalla koodin kutsuminen ei muutu, vaikka käsiteltäisiinkin monia eri Muoto-luokan lapsiluokkia, koska jokaisella lapsiluokalla on Piirrä-metodi ja sitä voidaan kutsua yleisesti Muoto-luokan kautta.
Kapselointi

Tiedon piilotus eli kapselointi tarkoittaa, ettei olion tilaa pääse muuttamaan muuten kuin olion metodien välityksellä. Olio kapseloi sisäänsä käytöksensä, tilansa ja identiteetinsä. Olion käytös kuvataan sen metodeissa. Metodi suoritetaan, kun olio saa viestin toiselta oliolta. Olio valitsee viestin perusteella metodin, jonka se suorittaa. Olion tilan muodostavat sen attribuutteihin sijoitetut arvot tiettynä ajanhetkenä. Identiteetti yksilöi olion: kahdella oliolla voi olla sama tila, mutta eri identiteetti; ts. ne ovat kaksi eri oliota. Identiteetti määräytyy automaattisesti oliota luodessa.
Luokka- vs. Prototyyppipohjainen

Luokkapohjaisessa ohjelmoinnissa luokat on määritelty etukäteen ja oliot on luotu luokkiin pohjautuen. Jos kaksi oliota omena ja appelsiini ovat luotu luokasta hedelmä, ovat molemmat hedelmiä ja on taattu, että voit käsitellä niitä samalla tavalla; esim. Ohjelmoija voi olettaa kummallakin olevan samat ominaisuudet, kuten väri, sokeripitoisuus tai on_raaka.
Prototyyppipohjaisessa kielessä oliot ovat itsenäisiä kokonaisuuksia. Luokkia ei ole. Olion prototyyppi on vain toinen olio, johon olio on linkitetty. Jokaisella oliolla on prototyyppilinkki (vain yksi). Uusia olioita voi linkittää jo valmiina oleviin olioihin linkittämällä se tämän prototyypiksi. Voit kutsua kahta eri objektia, omena ja appelsiini, Hedelmäksi, jos olio Hedelmä on olemassa sekä molemmilla olioilla, omenalla ja appelsiinilla, on asetettu Hedelmä prototyypiksi. Hedelmä ei ole tässä luokkana vaan olion jakavana ekvivalenssiluokkana. Olion attribuutit ja metodit on delegoitu kaikille tämän prototyypin määrittämän ekvivalenssiluokan olioille. Olion omistamia atribuutteja ja metodeja ei siis voi jakaa muille ekvivalenssiluokan olioille; esim. Attribuutti sokeri_pitoisuus voi puuttua oliosta omena. Prototyypin kautta voidaan toteuttaa vain yksi perintö.
Agenttiohjelmointi

Agenttiohjelmointi (engl. Agent-oriented programming, AOP) on ohjelmointiparadigma, joka pohjautuu ohjelmistoagentteihin. Toisin kuin olio-ohjelmoinnissa, joka perustuu metodeja tarjoaviin olioihin, agenttiohjelmoinnissa ohjelmiston yksittäiset komponentit ovat “agenteiksi” kutsuttuja itsenäisiä tietokoneohjelmia. Nämä agentit toimivat itsenäisesti ja kommunikoivat keskenään viestien avulla, jotta voidaan saavuttaa niille annettuja tavoitteita. Agentit voivat myös suorittaa toimintoja ympäristössään ja havainnoida ympäristön tilaa. Agenttiohjelmointia käytetään usein monimutkaisten järjestelmien kehittämiseen, joissa on paljon vuorovaikutusta komponenttien välillä. Agenttiohjelmoinnista on tullut myös tärkeä osa tekoälytutkimusta ja sitä käytetään muun muassa robotiikkaan ja puheentunnistukseen.
Agenttiohjelmoinnin historia ulottuu vuoteen 1990, kun Yoav Shoham esitteli käsitteen tekoälytutkimuksessaan. Hänen luomansa agentit olivat erityisiä, koska niillä on vain yksi metodi yhdellä parametrillä. Agenttiohjelmoinnin käsite alkoi vakiintua 1990-luvun lopulla, kun useat tutkijat alkoivat kiinnostua siitä. Esimerkiksi vuonna 1998 James Odell julkaisi kirjan ”Object-Oriented Analysis, Design and Implemention”, jossa hän puhui myös agenttiohjelmoinnista. Vuonna 2000 agenttiohjelmoinnista tuli virallisesti IEEE:n (Institute of Electrical and Electronics Engineers) standardi.
Avoin rekursio

Kielissä, jotka tukevat avointa rekursiota, voivat luokan metodit kutsua toisia metodeja, jotka ovat samassa luokassa, tai itseään. Metodeja kutsutaan yleisesti käyttäen erikoismuuttujia tai avainsanoja nimeltään "this" tai "self".
Konstruktori

Konstruktoria voidaan kutsua myös muodostimeksi tai rakentajaksi. Luokkapohjaisessa olio-ohjelmoinnissa muodostin on funktio, jota kutsutaan luomaan olio. Se vastaa uuden olion alustamisesta ja asettaa jäsenmuuttujat alkuarvoihin. Sillä ei ole eksplisiittistä palautustyyppiä eikä se ole implisiittisesti peritty. Muodostaja on usein saman niminen kuin luokka. Muuttumaton olio täytyy alustaa muodostajassa. Useimmissa ohjelmointikielissä (Java, Python, C++ jne.) luokalla voi olla useampi kuin yksi muodostaja, joilla on erilaiset parametrit.
Olio-ohjelmoinnissa muodostaja tyyppejä on erilaisia. Parametrilliset muodostajat (parameterized constructor) voivat ottaa vähintään yhden argumentin ja ne mahdollistavat tietojen asettamisen, kun luokkaa luodaan. Oletusmuodostaja (default constructor) on parametriton muodostaja ja sen toiminta on kielestä riippuvainen. Javassa oletusmuodostajan luo kääntäjä automaattisesti, jos luokalle ei ole sitä määritetty. Tyyppien arvot ovat silloin oletusarvoissa eli kokonaislukutyypit jätetään arvoon 0, liukulukutyypit arvoon 0,0 ja boolean-tyyppi arvoon false ja viitetyypit ovat null.
Kopiontimuodostajassa (copy constructor) on yksi muodollinen parametri, joka on luokan tyyppi ja parametri voi olla viittaus olioon. Tätä käytetään, kun halutaan luoda kopio saman luokan olemassa olevasta oliosta.  Muunnoskonstruktori (conversion constructor) tarjoaa keinon luoda implisiittisesti yhteen luokkaan kuuluvan olion erityyppisen olion perusteella. Muunnoskonstruktori mahdollistaa tietotyypin automaattisen muuntamisen toiseksi oliota luodessa. C++:ssa siirtomuodostajat (move constructor) ottavat Rvalue-viittauksen luokan olioon. Niitä käytetään resurssien omistajuuden siirtämiseen.
Roolisuuntautunut ohjelmointi

Roolipohjainen ohjelmointi on ohjelmoinnin muoto, jossa asioita ilmoitetaan termien avulla, jotka yrittävät ilmoittaa ihmisen näkökulmasta, tämä tekee koodin lukemisesta sekä
ymmärtämisestä helpompaa kuin tavallisen koodin.
Pääajatus rooli pohjaisessa ohjelmoinnissa on se, että ihmiset ajattelevat koodin toimintaa roolien läpi. Esimerkkinä rooli pohjaiselle ohjelmille käytetään ihmistä jolla on useita eri rooleja kuten työ rooli tai koti rooli. Tämän henkilön vuorovaikutukset riippuvat siis pitkälti hänelle annetuista rooleista ja niiden ominaisuuksista. Ominaisuudet jaetaan usein delegoimalla tietyt tehtävät tietylle oliolle.
Roolipohjaisen ohjelmoinnin edut eivät myöskään rajoitu vain koodin ymmärrettävyyden paranemiseen. Roolipohjainen ohjelmointi myös helpottaa ohjelmiston testaamista sekä ylläpitoa. Kun ohjelmisto on rakennettu roolien ja niiden ominaisuuksien ympärille tekee se toimintojen testaamisesta helpompaa, sillä jokainen rooli ja sen vastuut on määritelty tarkasti.
Jolloin mahdollisten virheiden löytäminen on helpompaa
Vanhoissa ohjelmointi oppaissa sekä muissa opetusmateriaaleissa rooli pohjaista ohjelmointia on käsitelty huomattavan vähän. Se on kuitenkin hyödyllinen osa olio ohjelmointia ja sen merkitys on lisääntynyt uusien ohjelmistojen kehityksessä. Tämän tyylisessä ohjelmoinnissa roolit pyrkivät helpottamaan kontekstin ymmärtämistä. Roolilla voidaan myös tarkoittaa tiettyä joukkoa kuten ohjelmiston palveluita, jotka esimerkiksi mahdollistavat paremman paremman palvelimen suorituskyvyn tietyistä toiminnoista verkossa.
Tulevaisuudessa roolipohjaisen ohjelmoinnin merkitys ja käyttö tulee todennäköisesti kasvamaan, kun kehitetään yhä monimutkaisempia ohjelmistoja, joissa on useita toimintoja ja rooleja, jotka tarvitsevat erillistä huomiota ja käsittelyä.
(Role-oriented programming)
Sovellusalueita

Olio-ohjelmoinnin ensimmäisiä käyttökohteita olivat diskreetit tapahtumasimulaatiot, joissa mallinnettiin esimerkiksi puhelinjärjestelmien tai logististen järjestelmien toimintaa.
Olio-ohjelmointi soveltuu erityisen hyvin graafisten käyttöliittymien toteuttamiseen. Käyttöliittymäkirjastot, kuten Swing, SWT tai MFC sisältävät luokkahierarkian, joissa käyttöliittymän komponenttien yhteisiä ominaisuuksia hallitaan perinnän avulla.
Olio-ohjelmointi on hallitseva paradigma myös tietojärjestelmien suunnittelussa. Reaalimaailman käsitteet mallinnetaan olioanalyysissä ja käsitteitä vastaavat luokat toteutetaan ohjelmointikielellä. Yleinen ongelma tietojärjestelmissä on olioiden avulla esitetyn mallin tallentaminen relaatiotietokantaan, sillä relaatiomalli voi esittää käsitteiden välillä monesta moneen suhteita, mutta ei toisaalta pysty esittämään perintäsuhteita.
Suosittu olio-ohjelmointikieli on C++. Se on yleiskäyttöinen ohjelmointikieli, joka laajentaa C-kieltä lisäämällä tuen olio-ohjelmointiin. C++:n avulla kehittäjät voivat toteuttaa objekteja, periytymistä, moninkertaisuutta ja muita olio-ohjelmointikonsepteja. C++:n ominaisuudet tekevät siitä tehokkaan ja joustavan kielen, jota käytetään laajalti esimerkiksi pelien kehittämisessä, grafiikkasovelluksissa ja sulautetuissa järjestelmissä. Olio-ohjelmointi ei rajoitu C++:aan, vaan muita suosittuja olio-ohjelmointikieliä ovat C#, Python ja Ruby. Näiden kielten avulla kehittäjät voivat hyödyntää olio-ohjelmoinnin etuja, kuten koodin uudelleenkäyttöä, kapselointia ja helpompaa ohjelman ylläpitoa. Olio-ohjelmointia käytetään laajasti erilaisissa sovelluksissa, kuten web-kehityksessä, mobiilisovelluskehityksessä, tietokannassa ja tekoälyssä. Sen avulla voidaan luoda modulaarisia ja laajennettavia ohjelmistoja, jotka on helpompi ymmärtää, ylläpitää ja laajentaa.
Olio-ohjelmoinnin periaatteiden ymmärtäminen ja sen soveltaminen ohjelmointiin on tärkeää nykyajan ohjelmistokehityksessä. Se antaa kehittäjille mahdollisuuden työskennellä tehokkaasti ja auttaa rakentamaan laadukkaita ja joustavia ohjelmistoja.
Hajautetuissa oliosovelluksissa oliot on sijoitettu hajalleen eri palvelinten välille. Olioiden välinen viestintä hoidetaan sovitun protokollan, esimerkiksi SOAPin, CORBA tai RMI:n avulla. Olion luominen ja purkaminen tapahtuvat näennäisesti oliota kutsuvalla koneella, mutta itse olion suorittama proseduuri voidaan ajaa jollakin toisella tietoverkossa sijaitsevalla palvelimella.
Oliopohjaisessa tiedontallennuksessa olioajattelua sovelletaan tiedon tallentamiseen siten, että kiinteiden blokkien tai tiedostojen sijaan tai ohella viitataan olioihin, jotka voivat  esimerkiksi yhdistellä tietoja useammasta paikasta ja jakaa sitä helposti keskenään. Esimerkiksi Windowsiin suunniteltiin 1990-luvun puolivälissä oliopohjaista tiedostojärjestelmää, mutta ajatus toteutui vain osin: esimerkiksi Ohjauspaneelin asetussovelluksiin viitataan käyttöjärjestelmän sisäisesti olioina, ei kiinteinä tiedostoina.
Sovellusalueita > Olio-ohjelmoinnin käyttö verkkoprotokollassa

Viestit, jotka liikkuvat palveluja pyytävän tietokoneen ja kyseistä palvelua tarjoavan palvelimen välillä, voidaan suunnitella luokkaobjekteiksi määritellyiksi objektijonoiksi. Kyseiset luokkaobjektit ovat viestivien osapuolten (eli tietokoneen ja palvelimen) tiedossa jo ennalta. Objekti voisi koostua esimerkiksi pituuskentästä, luokan tunnisteen sisältävästä kentästä ja arvokentästä. Palvelimen pitää ohjata vastaanotetut viestit oliolle, joka tunnistaa viestissä lähetetyn käskyn ja pystyy tarjoamaan pyydetyn palvelun. Palvelua käyttävän asiakastietokoneen ja sitä tarjoavan palvelimen välistä yhteyttä mallinnetaan usein olio-orientoituneena rakenteena. IBM:n Distributed Data Management Architecture (DDM) soveltaa tätä tapaa.
Sovellusalueita > Olio-ohjelmoinnin käyttö pelien kehittämisessä

Videopelit voivat koostua muutamista tuhansista koodiriveistä miljooniin koodiriveihin. Sen vuoksi on tärkeä kirjoittaa koodia, joka on helposti muokattavissa ja ylläpidettävissä. Ohjelmointi tyyleistä olio-ohjelmointi on yksi mahdollinen tapa, jolla saadaan luotua ylläpidettävää koodia, joka on mukautuvaa, ymmärrettävää ja laajennettavissa. Sen avulla voidaan luoda uudelleen käytettävää koodia noudattamalla DRY (Don’t Repeat Yourself) -menetelmää, eli suomennettuna, älä toista itseäsi menetelmää, joka tarkoittaa, että jokin tietty toiminnallisuus kirjoitetaan kerran ja tätä käytetään uudelleen, kopioimisen sijasta. Tämä tapa sopii hyvin pelien kehittämiseen, koska peleissä on asioita, joita halutaan tehdä monesti uudelleen. Olio-ohjelmointi tarjoaa tiettyjä erityisominaisuuksia, jotka voidaan nähdä etuina pelien kehittämisessä.
Koheesio (cohesion),
Yhdistäminen/kytkeytymien (coupling),
Kapselointi (encapsulation),
Abstraktio (abstraction),
Periytyminen (inheritance)
Pelin kehityksen kannalta koheesiota voidaan käyttää tilanteessa, jossa haluamme liikuutta esimerkiksi avaruusalusta. Tällöin meillä voi olla luokka nimeltä liike, joka hoitaa liikkumisen ja sitä voidaan käyttää uudestaan. Kytkeytymien tulee huomioida peliä tehdessä esimerkiksi siten, että mitä tapahtuu tilanteessa, jossa avaruusalus törmää asteroidiin, tuhoutuuko se vai ei? Abstraktiota voidaan soveltaa useampien olioiden liikutteluun pelissä. Tietty toiminnallisuus voidaan abstraktoida abstraktiksi luokaksi. Esimerkiksi avaruusalus ja asteroidi tarvitsevat samoja tietoja liikkumiseen, joita ovat esimerkiksi, nopeus ja sijainti. Objektin liikkuminen voidaan periyttää abstraktista luokasta avaruusalukselle, jolloin sitä ei tarvita avaruusalus luokassa.
Esimerkkejä peleistä, jotka ovat tehty Javalla, joka on olio-ohjelmointi kieli:
Wakfu
Worms: A Space Oddity
Sainst Row 2 (Mobile)
SimCity
Spiral Knights
RuneScape
Minecraft
Olion ja luokan ero

Aloittavalle olio-ohjelmoijalle luokan ja olion merkityksen ero voi olla vaikeaa hahmottaa. Yksikertaistettuna voidaan ajatella, että olio on konkreettinen asia ja luokka ei.
Eroa on usein helpompi ymmärtää erilaisten konkreettisten esimerkkien avulla.
Kun joillakin esineillä tai asioilla on monta yhteistä ominaisuutta, olisi hyödyllistä pystyä käsittelemään näitä asioita tai esineitä jotenkin kaikkia kerralla. Voidaan ajatella esimerkiksi autoa. Autoja on erilaisia, joilla on kaikilla tiettyjä samoja ominaisuuksia, kuten malli, valmistusvuosi ja hinta. Kun halutaan ajatella kaikkia autoja kerrallaan voidaan muodostaa Auto-luokka.
Toisena esimerkkina voidaan ajatella tilastoa, jossa yhdellä rivillä on monta eri tietoa, kuten sähkönkulutuksessa voisi olla aika, hinta ja kulutetun sähkön määrä. Tällöin voidaan muodostaa luokka joka sisältää jäsenmuuttuija nämä rivin sisältämät tiedot. Nyt kun tietoja halutaan siirtää paikasta toiseen voidaan ajatella pelkkiä rivejä, jotka sisältävät halutut tiedot. Tällöin tiedon siirtämisestä tulee yksinkertaisempaa, kun ei tietoa on vähemmän näkyvillä.
Luokka on ikään kuin kaava ja olio konkreettien tulos, joka saadaan syöttämällä tähän kaavaan tietyt parametrit.
Olio luodaan luokasta, joka toimii ”muottina” luotavalle oliolle. Luokat nimetään aina isolla alkukirjaimella ja oliot pienellä. Esimerkiksi ”henkilö” -olio luodaan ”Henkilö” -luokasta. Jäsenmuuttujat ovat hyvin tavallisesti määritelty yksityisiksi (private) jolloin ne ovat käytettävissä vain kyseisen luokan sisällä. Jotta yksityisiin muuttujiin päästään käsiksi, tähän tarvitaan jäsenfunktio (metodi). Alla esimerkki luokan, olion, jäsenmuuttujan ja jäsenfunktion käytöstä:
Luokka Henkilö
- nimi    (jäsenmuuttuja)
+ asetaNimi    (jäsenfunktio)
+ haeNimi    (jäsenfunktio)
Luokasta Henkilö luotu henkilö olio:
Nimi = Kalle
Yksinkertainen Henkilö-luokka pitää sisällään jäsenmuuttujan: ”nimi” sekä tarvittavat jäsenfunktiot (metodit) esimerkiksi ”haeNimi” (noutaja = getter) ja ”asetaNimi” (asettaja = setter). Kun luokasta: Henkilö, luodaan olio: henkilö, uusi olio tarvitsee nimen, joka annetaan luokalle parametrina.  Koska luokan jäsenmuuttujat määritellään yksityisiksi, jolloin muuttujiin päästään käsiksi ainoastaan jäsenfunktioiden kautta. Tässä tapauksessa nimen hakeminen tapahtuu jäsenfunktiota haeNimi käyttämällä seuraavasti: henkilö.haeNimi() ja tämä palauttaa kyseisen olion jäsenmuuttujassa olevan arvon. Jos taas olemassa olevan olion nimeä halutaan muuttaa, se tapahtuu käyttämällä jäsenfunktiota henkilö.asetaNimi(Matti), jolloin olemassa olevan olion nimi muuttujaan asetetaan "Kalle" tilalle "Matti". Aseta nimi tarvitsee parametrinä uuden nimen muttei palauta mitään.
Tukevia kieliä

Olio-pohjaiset ohjelmointikielet tarjoavat kehittäjille joukon työkaluja ja ominaisuuksia helpottaakseen olioiden luomista ja manipulointia. Vaikka on olemassa monia olio-ohjelmointia tukevia kieliä, Simula nähdään yleisesti ensimmäisenä kielenä, jossa on olennaiset piirteet olio-ohjelmoinnista. Toinen varhainen ohjelmointikieli on Smalltalk, jolla kehitettiin merkittävä osa olio-ohjelmoinnin teoriasta.
Olio-ohjelmointikielet voidaan jakaa "puhtaisiin" oliokieliin (joissa kaikki käsitellään olioina), olio-painotteisiin kieliin (jotka sisältävät joitain proseduraalisia elementtejä) tai alun perin proseduraalisiin kieliin, jotka ovat laajennettu olio-ohjelmointiominaisuuksilla. Joissakin kielissä on suurin osa olio-ominaisuuksista mutta eri muodossa (esim. Oberon). Toisissa kielissä on abstraktien tietotyyppien tuki, mitkä muistuttavat olio-ohjelmointia, mutta joilta puuttuu joitain ominaisuuksia (esim. JavaScript) .
On kuitenkin tärkeää huomata, että pelkän oliopohjaisen ohjelmointikielen käyttö ei takaa, että koodi noudattaa parhaita käytäntöjä olio-ohjelmoinnissa. Monet nykyaikaiset ohjelmointikielet ovat suunniteltu tukemaan olio-ohjelmointia ja niissä on erilaisia ominaisuuksia, kuten luokkien määrittelyjä, perintämekanismeja, polymorfismia, jne. Olio-ohjelmoinnin käyttö mahdollistaa ohjelmistojen paremman järjestelmällisyyden, luettavuuden ja ylläpidettävyyden, mikä tekee siitä tärkeän kehitystyökalun modernissa ohjelmistokehityksessä.
Nykyään on olemassa monia oliopohjaisia ohjelmointikieliä, ja jokaisella näistä kielistä on oma ainutlaatuinen syntaksinsa ja joukko ominaisuuksia, jotka vaikuttavat ohjelman suorituskykyyn ja ohjelmoijan työnkulkuun. Jotkut näistä kielistä ovat suunniteltu erityisesti tiettyihin käyttötarkoituksiin, kuten verkkokehitykseen tai tieteelliseen laskentaan (esim. MATLAB), kun taas toiset ovat yleisempiä ja soveltuvat moneen eri tarkoitukseen.
Yleisimmät olio-ohjelmointia tukevat ohjelmointikielet ovat:
Ada
C++
C#
Common Lisp
D
Delphi
Eiffel
Gambas – Avoimen lähdekoodin kilpailija Visual Basicille
MATLAB
Object Pascal
J#
Java
JavaScript
Lazarus
Neon
Perl 5
Pharo
PHP (versio 5)
Python
REALbasic
Ruby
Scala
Simula
Smalltalk
Visual Basic
Visual Prolog
Kirjallisuutta

Sytykeraportti: Oliot systeemityössä.  Suomen Atk-Kustannus, 1998.  ISBN 951-762-165-5
Meyer, Bertrand: Object-Oriented Software Construction.  Prentice-Hall, 1998.  ISBN 0-13-629155-4
Sakkinen, Markku: Inheritance and Other Main Principles of C++ and Other Object-oriented Languages.  (Jyväskylä Studies in Computer Science, Economics and Statistics 20)  University of Jyväskylä, 1992.
Smed, Jouni & Hakonen, Harri & Raita, Timo: Sopimuspohjainen olio-ohjelmointi Java-kielellä. Elektroninen kirja, 2007. ISBN 978-952-92-1776-2
Coad, Peter & Nicola, Jill: Object-Oriented Programming.  Prentice Hall, 1993.  ISBN 0-13-032616-X
Gamma, Erich & Helm, Richard & Jonson, Ralph & Vlissides, John: Design Patterns. Olio-ohjelmointi. Suunnittelumallit.  Edita, IT Press, 2001.  ISBN 951-826-428-7
Koskimies, Kai: Pieni oliokirja, s. 1–281.  Espoo:  Suomen ATK-kustannus, 1998.  ISBN 951-762-503-0
Aiheesta muualla

Kuvia tai muita tiedostoja aiheesta Olio-ohjelmointi Wikimedia Commonsissa
Käännös suomeksi
Täplätupsukas

| Täplätupsukas |
| --- | --- |
 koiras
Uhanalaisuusluokitus
 
 
Suomessa:
 Elinvoimainen  
Tieteellinen luokittelu
Domeeni::  Aitotumaiset Eucarya
Kunta::  Eläinkunta Animalia
Pääjakso::  Niveljalkaiset Arthropoda
Alajakso::  Kuusijalkaiset Hexapoda
Luokka::  Hyönteiset Insecta
Lahko::  Perhoset Lepidoptera
Alalahko::  Glossata
Osalahko::  Erilaissuoniset Heteroneura
Yläheimo::  Yökkösmäiset Noctuoidea
Heimo::  Villakkaat Lymantriidae
Suku::  Orgyia
Laji::  antiqua
Kaksiosainen nimi
 Orgyia antiqua  (Linnaeus, 1758) 
Katso myös
   Täplätupsukas Commonsissa 
Infobox OKNimi-testi OK: 
Täplätupsukas, aikaisemmalta nimeltään tupsutoukkakehrääjä, (Orgyia antiqua) on villakkaisiin kuuluva, alun perin Euroopasta kotoisin oleva yökkösmäisiin kuuluva perhoslaji. Ihmisen toimien seurauksena laji on levinnyt muun muassa Kanadaan.