Luento 12 – 22.2.2016

Jonne Itkonen

Oliosuuntatuneisuus

Alkuperä

Monesti ajatellaan, että oliot on "keksitty" 1980-luvulla, mutta ne ovat jo 1960-luvun tuote. Varsinainen olioiden esiinmarssi tapahtui 1980-luvun alussa.

  1. 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)

  2. 1961 Burroughs 220 nimetön kehittäjä:

    Tieto tallennettuna nauhalle kolmessa osassa: osoittimet aliohjelmiin, aliohjelmat ja data.

  3. 1969 Simula

    Norjassa kehitetty ohjelmointikieli simulointiohjelmien (!) toteuttamiseen.

  4. 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.

Määritelmä

TL;DR; Opettele käyttämään jotain seuraavista: Squeak, Pharo, Cincom VisualWorks (GNU Smalltalkista on unohtunut IDE)

  1. Kay "Real OOP"

    1. Kaikki ovat olioita

    2. Oliot ovat kuin pieniä, verkottuneita tietokoneita, jotka hoitavat oman tehtävänsä

    3. Olio kapseloi tiedon ja sitä käsittelevät aliohjelmat (tila, käytös, identiteetti)

    4. Oliot lähettävät toisilleen viestejä

    5. Käytössä on myöhäinen sidonta

    6. Oliot ovat muuttumattomia

  2. muuta:

    1. Perintä, jota olioperustaisessa tyylissä (object-based) ei ollut

      • tyypin perintä
      • käytöksen perintä
    2. Polymorfismi, jota löytyy muistakin ohjelmointityyleistä (-paradigmoista)

    3. Tiedon piilotus

  3. IDE

    1. Kehitys- ja ajoympäristö, toteutuskieli ja käyttöjärjestelmä ovat yksi ja sama asia

    2. Smalltalkin IDE on suoraan kopioitu nykykehitystyökaluihin, kuten Visual Studio, Eclipse, Net Beans, Delphi, XCode, Xamarin, …

  4. 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

  1. boolean, #ifTrue:#ifFalse, silmukat

Oikean tietorakenteen valinta kannattaa

  1. 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)

  1. -> 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!

  2. -> 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.

    1. 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.")

    2. 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.

    3. 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.

  3. -> 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.

    http://itkp113.it.jyu.fi/itkp113.html#sec-3-3-1

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.

  1. C# ( = Delphi + C + Java )

  2. Java ( = C + "Simula" + GC)

  3. C++ ( = C + "Simula")

  4. 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

  1. http://folk.uio.no/trygver/themes/mvc/mvc-index.html

  2. http://dl.acm.org/citation.cfm?id=50757.50759

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.

  1. Lively-web http://lively-web.org

DCI

  1. http://www.artima.com/articles/dci_vision.html

CLIM

  1. http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.54.6663&rep=rep1&type=pdf

  2. http://bauhh.dyndns.org:8000/clim-spec/1.html#_2

Oliotietokanta?

http://www.odbms.org/odmg-standard/

GemStone

  1. https://gemtalksystems.com

Tapaus CERN & Stanford Linear Accelerator Center

  1. http://www.slac.stanford.edu/BFROOT/www/Public/Computing/Databases/proceedings/CIDR05.pdf

  2. https://root.cern.ch

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

  1. Eikä funktionaalisuuskaan, se on OO:n esiaste :-)

Oliosuuntatuneisuus ei sovi kaikkialle yhtä hyvin

  1. 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.