• Ei tuloksia

4 VAIHTOEHTOISET LÄHESTYMISTAVAT

4.3 Ohjelmointikielten vertailu

4.3.1 Lisp

Lisp olisi ollut ihanteellinen kieli oliopohjaisten mallinnusominaisuuksien ja evalu­

oitavien funktioiden toteutukseen. Lisp-kielen standardiksi muodostunut oliolaaj ennus CLOS on kuuluisa dynaamisista ominaisuuksistaan, toteutuksessa onkin tähdätty jousta­

vuuteen ja laajennettavuuteen [Paep93], Ohjelmoijalle on jätetty haluttaessa mahdol­

lisuus lähes kaikkien olio-ominaisuuksien uudelleen määrittelyyn ja toteutukseen.

CLOS-järjestelmässä mahdollisimman useat objektit on pyritty tekemään kielen kannalta ensimmäisen luokan objekteiksi (first-class object). Oliomallinnuksen perusrakenteet — luokat, instanssit, geneeriset funktiot ja metodien valinta — ovat kaikki ensimmäisen luokan objekteja. Niitä voidaan siten kielen normaalien rakenteiden avulla ajonaikaisesti käsitellä, muuttaa, luoda tai tuhota. Itse CLOS-laajennuskin on itse asiassa toteutettu ensimmäisen luokan objektien avulla. Näitä objekteja kutsutaan edellisten metaobjekteiksi. Metaobjekteja muuttamalla voi ohjelmoija muuttaa CLOS- järjestelmän sisäistä toimintaa samalla tavalla kuin omaa CLOS-sovellustaan.

Lispin ongelmana oli Dos/Windows-tuen puuttuminen. Pelkän Lisp-tulkin lisäksi olisi tarvittu mittava joukko kehitysvälineitä, mm. debuggeri, käyttöliittymäkirjasto, relaatio- tietokantarajapinnat ja kommunikointimahdollisuus Windows-ympäristön muiden ohjelmien kanssa.

Lisp mahdollistaa C-kielisten kirjastojen kutsumisen. Näin olisi periaatteessa voitu rakentaa järjetelmän mallinnusominaisuuksien ydin Lispillä. Ytimen ympärille olisi voitu rakentaa käyttöliittymä, sovelluskehitinominaisuudet ja integroinnit muihin järjestelmiin. Käyttöjärjestelmän rajoitukset — moniajon puute, kehittymätön

virtuaali-muistinhallinta ja segmentoitu 16-bittinen muistiavaruus [SiPeGa91] — tekivät luotettavan Lisp-tulkin rakentamisen mahdottomaksi. Kahden ohjelmointikielen valinta olisi myös aiheuttanut kaksinkertaisen työn uusien kehitysvälineiden käyttöönotossa.

4.3.2 SmallTalk

SmallTalk on dynaamisesti tyypitetty olio-ohjelmointikieli, joka suurelta osin täyttäisi tässä työssä asetetut vaatimukset oliopohjaisille mallinnusominaisuuksille. Luokat ovat ensimmäisen tason olioita, joten niitä voidaan käsitellä kielen omien rakenteiden avulla.

Ohjelman suorituksen aikana voidaan luoda uusia luokkia ja luokat muodostavat luokkahierarkian.

SmallTalk järjestelmässä ei voida ohjelman suorituksen aikana muuttaa luokkien sisäistä rakennetta siten, että muutokset päivittyisivät välittömästi jo luoduille instansseille. Käytännössä tämä tekee uusien attribuuttien lisäämisen jälkikäteen mahdottomaksi tai hyvin hankalaksi. Rakenteellisia muutoksia aiheuttavaa instanssin luokan vaihtoa ei myöskään voi tehdä. Ohjelmoimalla SmallTalkin metatasolla, olisi mahdollisesti voitu rakentaa sellaisia luokkia, joiden rakennetta olisi ajonaikana voitu muuttaa.

SmallTalkin luokkahierarkia ei tue moniperintää. Moniperinnän puuttuminen voidaan kuitenkin usein korvata paloittelemalla instanssit useisiin pienempiin instansseihin, joista jokainen periytyy omista luokistaan [Rumb91].

Sovelluskehitinominaisuuksien rakentaminen SmallTalkilla olisi ollut haastava tehtävä.

Kokemuksia lopullisesti tuotteistetuista ohjelmista ei saatu. Periaatteessa käyttöliittymä olisi voitu rakentaa Windows-ympäristön standardien mukaisesti, näkymien ja grafiikan viimeistelyyn menevää työmäärää ei kuitenkaan osattu tarkasti arvioida. Käyttöliittymän ja sisäisen toteutuksen suorituskyvystä ei myöskään saatu varmaa tietoa. Pienet

esimerkkiohjelmat tuntuivat kuitenkin melko tehokkailta [Digi92].

Keskeisin syy SmallTalkin hylkäämiselle oli ajonaikaisten oliomallinnus- ominaisuuksien puuttuminen. Tavoitteena olevaa oliomallinnusta ei voida tehdä järjestelmällä, jossa luokkien rakennetta ei ajonaikana voi muuttaa. Käyttöliittymien ja

integrointien rakentaminen olisi luultavasti onnistunut.

4.3.3 C++

C++ on syntynyt C:n päälle toteutettuna laajennuksena, jonka tavoitteina ovat olleet ajonaikainen tehokkuus ja toteutuksen selkeys. Kielen syntaksi, olio-ominaisuudet ja valmisfunktiot on tarkasti määritelty ANSI-standardeissa, joita käsitellään esimerkiksi Strousstupin ja Eilisin kirjassa The Annotated C++ Reference Manual [StE190]. C++ on yleisin käännettävä ohjelmointikieli Windows-käyttöjärjestelmässä.

CLOS-järjestelmässä luokalle voidaan antaa seuraava määritelmä: "objekti, joka määrittelee rakenteen ja toiminnallisuuden joukolle muita objekteja, joita kutsutaan

luokan instansseiksi." C++-luokan vastaava määritelmä olisi "ohjelmoijan määrittelemä tyyppi, joka kiinnittää tietyn tietorakenteen ja siihen sovellettavat operaatiot." C++ on vahvasti tyypitetty, tyyppejä käytetään käännösaikaisten tarkistusten tekemiseen. Tyypit eivät kuitenkaan ole olemassa ohjelman suorituksen aikana, joten C++-ohjelman luokkiin ei ajonaikana voi viitata.

Suurin osa Windows-käyttöjärjestelmän ohjelmista on rakennettu C/C++-kielellä.

Windows itse koostuu joukosta dynaamisesti sidottuja kirjastoja (DLL, Dynamically Linked Library), joissa olevia funktioita voidaan kutsua suoraan C/C++-kielisistä ohjelmista.

Maailmalla on suuri joukko C++-luokkakirjastoja, joiden avulla voidaan korkeamman tason kutsujen avulla rakentaa näyttäviä graafisia käyttöliittymiä. Tunnetuimmista Windows-ympäristön C++-kääntäjistä Borlandin graafisen luokkakirjaston nimi on OWL (Object Windows Library) [Borl94] ja Microsoftilla vastaavasti MFC {Microsoft Foundation Classes) [Micr94a], Osa kaupallisista luokkakirjastoista mahdollistaa ohjelman kääntämisen suoraan moneen eri ikkunointijärjestelmään. Tällainen tuote on esimerkiksi Liantin C++/Views [Lian94].

C++ tarjoaa eniten vaihtoehtoja liittymien rakentamiseksi muihin Windows-käyttö- järjestelmässä toimiviin ohjelmistoihin. Monet taulukkolaskimet tarjoavat yksityis­

kohtaisen C-kutsurajapinnan, jonka kautta voidaan suoraan olla yhteydessä taulukko­

laskimen sisäisiin tietorakenteisiin. Kaikkiin tunnetuimpiin relaatiotietokantoihin voidaan suoraan tehdä kyselyjä ja päivityksiä Windows-käyttöj ärj estelmän tarjoamien ODBC {Open DataBase Connectivity) -ajurien avulla.

4.3.4 Yhteenveto ohjelmointikielistä

Taulukkoon 3 on koottu tutkittujen ohjelmointikielien tämän työn kannalta tärkeitä ominaisuuksia. Kaikki kielet ovat oliopohjaisia ohjelmoijan näkökulmasta. Ainoastaan CLOS mahdollistaa uusien luokkien luomisen ajonaikaisesti. C++ sisältää parhaimman tuen Windows-käyttöj ärj estelmälle ja mahdollistaa näyttävän graafisen käyttöliittymän ja tehokkaiden liittymien rakentamisen. CLOS-ohjelman ajonaikainen tulkkaus asettaa tarvittavalle laitteistolle muita kieliä suuremmat laitteistovaatimukset.

Taulukko 3 Ohjelmointikielten ominaisuuksien vertailu

Ominaisuus CLOS C++ SmallTalk

Oliopohjainen ohjelmointikieli KYLLÄ KYLLÄ KYLLÄ

Mahdollisuus luoda uusia luokkia ajonaikaisesti

KYLLÄ EI EI

Tuki Windows-käyttöjärjestelmälle EI KYLLÄ KYLLÄ

Roskankeruu KYLLÄ EI KYLLÄ

Graafisen käyttöliittymän rakentaminen helppoa

EI KYLLÄ EI

Liittymien rakentaminen muihin kaupallisiin ohjelmistoihin ja tietokantoihin helppoa

EI KYLLÄ EI

Standardi KYLLÄ KYLLÄ EI

Laitteiston tehokkuusvaatimus SUURI PIENI PIENI

Käytettäväksi ohjelmointikieleksi valittiin C++. Tärkeimmiksi valintakriteereiksi muodostuivat tuki Windows-käyttöjärjestelmälle sekä graafisen käyttöliittymän ja liitty­

mien rakentamisen helppous. C++:n valinta tekee myös tästä työstä tieteellisessä mielessä mielenkiintoisen. Koska C++ ei mahdollista uusien luokkien luomista ajonaikaisesti, on tässä työssä rakennettava kokonaan uusi luokka- ja instanssij ärj estelmä.