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