Luento 12 – 22.2.2016
Jonne Itkonen
Sisällysluettelo
Oliosuuntatuneisuus
Alkuperä
Monesti ajatellaan, että oliot on "keksitty" 1980-luvulla, mutta ne ovat jo 1960-luvun tuote. Varsinainen olioiden esiinmarssi tapahtui 1980-luvun alussa.
Lähde: http://worrydream.com/EarlyHistoryOfSmalltalk/
Jep, on olemassa "virallisempiakin" paikkoja tuolle kirjoitukselle, mutta "aina kannattaa viitata http://worrydream.com/ -osoitteeseen, jos vain mahdollista!" (Itkosen viittaussäännöt)
1961 Burroughs 220 nimetön kehittäjä:
Tieto tallennettuna nauhalle kolmessa osassa: osoittimet aliohjelmiin, aliohjelmat ja data.
1969 Simula
Norjassa kehitetty ohjelmointikieli simulointiohjelmien (!) toteuttamiseen.
1972-1982- Smalltalk (oliosuuntautuneisuuden määritelmä)
Xeroxin PARC-laboratorion näkemys "henkilökohtaisesta tietokoneesta", ja kuinka sitä ohjelmoitaisiin. Samalla kehittyi nykyinen GUI, hiiri, ja hieman Internetkin.
- Kielen esimerkkeinä toimivat
- LISP, LOGO, Algol, sekä Kay et al aiemmat kielet
- Vannevar Bush: As we may think
- Ivan Sutherlandin: Sketchpad
- Douglas Engelbart: Demo
- Biologia!
- Kieli ja ohjelmointimalli tehtiin, jotta voitiin ohjelmoida tietokonetta, jossa on nykyisen kaltainen WIMP GUI ja tietoverkot (1972!)
- Xerox Alto, Dynabook, Xerox Star
- Undo!
- GUI on vanhempi keksintö, tämä malli vain jäi elämään
- kopioitu suoraan tämänhetkisiin käyttöliittymiin, kuten Windows, X Windows, Cocoa/OS X, Gnome, KDE, QT … valitettavasti
- Kay sanoi jossain videossa (https://youtu.be/N9c7_8Gp7gI?t=2312): GUI tehtiin lapsille, ei aikuisille.
- Kielen esimerkkeinä toimivat
Määritelmä
TL;DR; Opettele käyttämään jotain seuraavista: Squeak, Pharo, Cincom VisualWorks (GNU Smalltalkista on unohtunut IDE)
Kay "Real OOP"
Kaikki ovat olioita
Oliot ovat kuin pieniä, verkottuneita tietokoneita, jotka hoitavat oman tehtävänsä
Olio kapseloi tiedon ja sitä käsittelevät aliohjelmat (tila, käytös, identiteetti)
Oliot lähettävät toisilleen viestejä
Käytössä on myöhäinen sidonta
Oliot ovat muuttumattomia
muuta:
Perintä, jota olioperustaisessa tyylissä (object-based) ei ollut
- tyypin perintä
- käytöksen perintä
Polymorfismi, jota löytyy muistakin ohjelmointityyleistä (-paradigmoista)
Tiedon piilotus
IDE
Kehitys- ja ajoympäristö, toteutuskieli ja käyttöjärjestelmä ovat yksi ja sama asia
Smalltalkin IDE on suoraan kopioitu nykykehitystyökaluihin, kuten Visual Studio, Eclipse, Net Beans, Delphi, XCode, Xamarin, …
Teollisuus/de facto OOP
… on akenteista ohjelmointia käyttäen olioita kuin tietueita. Mukaan on tungettu muitakin tietotyyppejä. Viestin välitys on korvattu epäsuoralla aliohjelman kutsumisella.
Periaatteita
http://itkp113.it.jyu.fi/itkp113.html
Kaikki ovat olioita
Viestin välitys
Kapselointi
Oliot ovat muuttumattomia
Tiedon piilotus
Ei iterointia
- boolean, #ifTrue:#ifFalse, silmukat
Oikean tietorakenteen valinta kannattaa
- unohtakaa taulukot ;-)
Oliosta riittää tietää, mitä se lupaa tehdä
Tiedon piilotus! Se sanoo, ettei olion sisälle ole meneminen sorkkimaan, joten on luotettava, että olio tekee sen mitä lupaa. Siksi oliot toteutetaan niin, että niillä on vähän tai yksi vastuu, ja ne ovat selkeitä kokonaisuuksia (vrt. pieni tietokone yhtä tehtävää varten).
Meta-object Protocol (MOP, http://www.alu.org/mop/index.html)
Olioiden ominaisuudet ja elinkaari on tutkittavissa ja muokattavissa olioiden avulla. Mahdollistaa mukavasti ohjelmointikielen sovittamisen ja laajentamisen.
Kielistä
Simula -> Beta
http://dl.acm.org/citation.cfm?id=1238854
Lisp-kielet (1950-1980 luvuilla)
-> Logo
Logo ei ole varsinainen oliokieli, mutta se vaikutti paljon Smalltalkin syntyyn. Logon kehitti Seymor Papert, kun hän halusi näyttää, miten tietokoneet ovat helposti muokattavissa ohjelmoinnin avulla tukemaan hänen (ja Piaget'n) oppimiskäsitystään. Logo sai paljon vaikutteita Lispistä, ja jo pelkkä sen tunnetuin ominaisuus, kilpikonnagrafiikka, jossa ohjataan kuvaruudulla näkyvää tai paperin päällä kulkevaa kilpikonnaa, jonka avulla voidaan piirtää, on hyvin oliomainen ajatus. Lukekaa ehdottomasti http://dl.acm.org/citation.cfm?id=1095592!
-> Smalltalk -> Objective-C -> Swift
Smalltalk sai myös paljon vaikutteita Lispistä, eikä vähiten ideasta toteuttaa Lisp Lispillä. Myöhemmin Smalltalk on ollut Simulan ohella eniten oliokieliin vaikuttanut ohjelmointikieli. Uusin tulokas tässä jatkumossa on Swift https://swiftlang.ng.bluemix.net/#/repl.
Objective-C taas on "se toinen" C:n oliolaajennos, kylläkin se enemmän olioajattelun mukainen laajennos. Viime vuosina tämä on ollut hyvinkin suosittu kieli pelkästään Applen iOS -alustan ansiosta, vaikka kieli on kyllä lymyillyt Linux-koneissakin GCC:n mukana jo vuosikymmeniä. Kielessä on alkanut näkyä, kehityksestä huolimatta, ikääntymisen merkkejä, ja sen on saanut alkaa väistyä Swiftin tieltä.
Swift on alun perin Applen kehittämä kieli (korvaamaan Objective-C, koska sen syntaksi on niin erilainen Javasta ja C#:sta). Tosin Swift on myös hyvä jatkumo Java-C#-linjassa, eli "otetaan trendikielen malli ja päivitetään se nykyaikaan". Nykyään kieli on avoin, joten se löytyy jo Linuxillekin ja pian toivottavasti Windowsille. Kielen takana on sama taho kuin LLVM-kääntäjän takana, joten Swift on myös hyvä esimerkki LLVM:n mahdollisuuksista.
Kaikki ovat olioita
Smalltalkissa kaikki ovat olioita. Paitsi että tämä on hankala mieltää "perustietotyypeille", kuten kokonaisluku, on se myös vaikeaa mieltää luokkien tapauksessa. Luokkakin on olio! Luokan luokka (!) on Class, joka taas periytetään (mutkien kautta) Object-luokasta. Object taas periytetään ProtoObjectista joka, koska silläkin on oltava yliluokka, perii ProtoObject-luokan, eli itsensä. ("It's turtles all the way down.")
Protokolla
Smalltalkissa protokollat ovat tapa nimetä joukko viestejä (metodeja). C#/Java-ohjelmoijalle tutumpi termi on 'rajapinta', mutta protokollat ovat epämuodollisempia, lähinnä siis sopimuksia. Luokan protokolla voi myös sisältää tai olla sisältämättä metodeja, mitä samanniminen protokolla sisältää toisessa luokassa.
Luokan laajentaminen
Smalltalkissa luokkaa voitiin laajentaa, eli lisätä siihen metodeja luokan alkuperäisen määritelmän ulkopuolella. Smalltalkissa ei ole 'lähdekooditiedostoja' kuten muissa kielissä olemme tottuneet, vaan 'paketteja', jotka sisältävät määrittelyjä. Paketissa voi nyt olla määrittelyjä uusille tai vanhoille luokille.
-> Common Lisp Object System (CLOS)
Common Lisp on Lisp-kielien kenties yleisin standardi (oikea standardi). CLOS taas on Common Lispin oliolaajennos, joka myöskin on osa Common Lisp -standardia. CLOS on hyvin erikoisen oloinen oliokieli, sillä siinä metodit eivät kuulu luokkaan, vaan ovat geneerisen funktion osia. Tämä aiheuttaa sen, että metodi voi itse asiassa kuulua useampaan luokkaan, eli suoritettavan metodin valinta ei ole kiinni vain viestin kohdeolion luokasta, vaan kaikista viestin argumenttien olioiden luokista.
Amber
Amber on Smalltalk web-ohjelmointiin. Lyhyesti, kaikki se mitä olet aina halunnut web-ohjelmoinnissa, sen kielistä ja kehitys. ympäristöistä, muttet ole kehdannut kehittää itse. http://amber-lang.net esille heti!
Self, Kevo, JavaScript
Tämä jatkumo on oliosuuntautuneisuuden luokaton kehityshaara. Oliosuuntautuneisuus ei tarvitse luokkia, vaikka ne niin yleisiä kielissä ovatkin. Tämän osoitti ensin Self, ja sen opit levisivät Kevoon ja tunnetumpaan JavaScriptiin. Selfistä on myös lähtöisin Morphic-käyttöliittymämalli.
PLOOF "Programming Languages with Object-Oriented Features"
PLOOF-kielet ovat lähinnä proseduraalista ohjelmointia, jossa on mukana abstraktit tietotyypit (moduulit++). Valitettavasti nämä ovat myös se yleisin näkemys oliosuuntautuneisuudesta.
C# ( = Delphi + C + Java )
Java ( = C + "Simula" + GC)
C++ ( = C + "Simula")
Swift (ilmeisesti)
Muut kielet
Olio-ohjelmointia voi pitää "tyylinä" ohjelmoitaessa millä tahansa ohjelmointikielellä. Oliokielillä se on toki helpompaa, mutta esim. monelle tuttu SSH oli aikoinaan C-kielinen olio-ohjelma. Oliomaisuuden hyvät puolet ovat myös levinneet muihin tapoihin ohjelmoida. Lisäksi on syytä muistaa nk. moniparadigmakielet, jotka pyrkivät usean paradigman tukemiseen, tai sitten tekevät tästä oman paradigmansa.
Funktio-ohjelmoinnista kiinnostuneita kehotan tutustumaan Common Lispin CLOS-laajennokseen, vaikkei se tai Common Lisp vahvasti funktionaalinen kieli olekaan.
GUIt oliosuuntautuneisuudessa
MVC
Morphic
Morphic on alunperin Self-kielelle kehitetty GUI-kirjasto. Siinä olio on itse vastuussa omasta käyttöliittymästään, päinvastoin kuin MVC:ssä, joskin monesti käyttöliittymä kirjoitetaan omaan omaan luokkaansa. Morphic on toteutettu Selfin lisäksi Smalltalkille (Squeak ja Pharo), JavaScriptille ja Pythonille.
- Lively-web http://lively-web.org
DCI
CLIM
Oliotietokanta?
http://www.odbms.org/odmg-standard/
GemStone
Tapaus CERN & Stanford Linear Accelerator Center
Oliokäyttöjärjestelmä
Jos kerran GUI ja tietokanta, niin miksi ei käyttöjärjestelmäkin voisi olla oliosuuntautunut? Tällaisiakin on tehty, ja varsin monen käyttöjärjestelmän ohjelmointirajapinnat ovat oliomaiset. "Puhtaita" oliokäyttöjärjestelmiä on vähän, Smalltalk-koneet tietty ensimmäinen hyvä esimerkkki.
Smalltalk
Xerox Alto, Xerox Star
Lisp-koneet
Symbolics Genera
Amigaaah!
Oberon
OOSMOS
Tulevaisuus?
Oliosuuntautuneisuus ei ole päätepysäkki
- Eikä funktionaalisuuskaan, se on OO:n esiaste :-)
Oliosuuntatuneisuus ei sovi kaikkialle yhtä hyvin
- Ongelman/kontekstin rakenne tulisi näkyä ohjelmasta
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.