2 1* {A Eiffel-ohjelmointikieli {A ----------------------- {8 Mikko Koivunalho {8 mikkoi@utu.fi Eiffel on nuori ohjelmointikieli. Sen ensimmäinen malli julkistettiin vuonna 1985. 12 vuotta ei ole pitkä ikä, varsinkaan kun ottaa huomioon, että kieli on tullut laajemmin tunnetuksi vasta parina viime vuotena. Niinpä Eiffelillä onkin ollut hyvää aikaa puhdistautua alkuvaiheen virheistä ja suunnitteluvioista. Kui- tenkin sen määrittelyä on muutettu merkittävästi vain kerran, 1991, ja nykyinen Eiffel-malli, Eiffel 3, on sittemmin pysynyt muuttamattomana. Eiffel-standardi on pysynyt samanlaisena, koska Eiffelin kehitys on pääosin yk- sissä käsissä: Bertrand Meyerin ja ISE:n (Interactive Software Engineering), ja kielen standardina pidetään Meyerin kirjaa "Eiffel, The Language". Nimensä Eif- fel on saanut ranskalaiselta insinööriltä Alexander Gustave Eiffeliltä [efe'l] (1832-1923). Kielen suunnittelussa Meyer on seurannut Eiffelin omaa ideologiaa, jonka mukaan rakenteiden itsensä (pääosin rautaa, esim. Eiffelin torni) tulee olla kaunista katseltavaa symmetrisyydessään, yksinkertaisuudessaan ja täsmälli- syydessään. Eiffel on uusi kieli, jonka suunnittelussa on tieten tahtoen hylätty suuri jouk- ko vanhemmissa kielissä käytettäviä ohjelmointimetodeja ja otettu käyttöön uu- sia. Paitsi että se on täysiverinen oliosuuntautunut kieli, se on myös pikku- tarkka ja perinteisiin kieliin nähden syntaksiltaan yksinkertainen sekä ohjel- moijalta runsasta etukäteissuunnittelua vaativa. {6 ----------> Eiffelin filosofiaa ymmärtääkseen on tarkasteltava perinteisiä kieliä ja niiden ongelmia. Jo kauan ennen Eiffeliä ohjelmoinnin metodologian tutkijat esittivät, että mm. GOTO-komento ei missään nimessä kuulu asialliseen ohjelmointiin, koska se sallii ohjelman suoritusjärjestyksen täydellisen rikkomisen. Tämä ja vastaa- vanlaiset piirteet, mm. funktion tai ohjelman keskeytys ennen loppua, on täysin poistettu Eiffelistä. Edelleen Eiffelin syntaksia on radikaalisti yksinkertaistettu laittamalla siihen vain kolme suorituksenohjauslauseketta: yksi ehtolauseke, yksi toistolauseke ja yksi valintalauseke (moniehto-, C:ssä switch). Perinteisissä kielissähän näitä on monissa ollut kasapäin, esim. C-kielen while-, do-while- ja for-silmukat. Miksi laittaa monenlaisia toistolausekkeita sotkemaan ohjelmakoodia, kun kerran yksi riittää kaikkiin tarpeisiin hiukan sovittamalla? Eiffel on myös voimakkaasti tyypitetty kieli. Tavanomaisten vanhoista kielistä tuttujen tyyppien kuten REAL, INTEGER ja BOOLEAN lisäksi siihen on "sisäänraken- nettu" muita tyyppejä, jotka useimmista kielistä puuttuvat kokonaan tai ne on toteutettu kielen itsensä ulkopuolella, esim. vektori, lineaarinen lista, pino ja jono. {DOliokieli Edellä kirjoitin "sisäänrakennettu" lainausmerkeissä. Ilmaisu sallittakoon mi- nulle, vaikka nyt selitänkin, miksi näin ei oikeastaan voi olla: Eiffel on puh- das oliokieli, joten kaikkien sen ominaisuuksienkin tulee olla olioita. {6 ----------> Tietorakenteet eli tietotyypit onkin kaikki toteutettu olioina. Niinpä esimer- kiksi vektoria tai listaa voi kasvattaa tai kutistaa kulloisenkin olion sisällä vaivaamatta pääohjelmaa. Muita erikoisia tietotyyppejä ovat mm. puu-tyyppi, jol- la on aina kaksi oksaa ja yksi juuri, tai graafi, vielä puurakennettakin moni- puolisempi joukkotyyppi. Edellä mainittuja ja muita tyyppejä voidaan käyttää mm. erityyppisen tiedon tallennukseen ja helppoon järjestämiseen. Muita tietoraken- teita voi luoda omaan tarpeeseen omina olioinaan, jotka sitten voi liittää peräkkäin vaikka vektoriin tai jonoon. Ohjelmointia helpottaa myös automaattinen roskienkerääjä, joka vapauttaa niiden olioiden varaaman muistin, joihin ei enää ole osoitinta. Tämä tietysti hidastaa ohjelman suoritusta hivenen, mutta toisaalta nopeuttaa valtaisasti sen teke- mistä, koska muistivuotoja ei synny. Niiden paikkailuunhan aikaa eniten tuhraan- tuu koodattaessa ja virheitä korjattaessa. {DEiffelin toteutus Nykyisissä Eiffel-ympäristöissä Eiffel-koodia ei suinkaan käännetä suoraan kone- kieleen vaan käyttäen välikielenä C:tä. Varsinainen ISE:n Eiffel on isojen koneiden kieli. Sen päätarkoitus on "program- ming in large", siis suurten ohjelmistojen ohjelmointi. Niinpä ISE:n oma Eif- fel-paketti on paljon muutakin kuin vain itse kääntäjä. Se on pääasiassa Unix- purkeille tarkoitettu megojen kokoinen kokoelma ohjelmoijan työkaluja, valmiita kirjastoja ja oliokokoelmia mm. graafisen ympäristön luomiseen tai verkkosovel- lusten ohjelmointiin. ISE:n paketissa on jopa oma kieli, LACE, ACE-tiedostojen eli perinteisemmin "make"-tiedostojen tekemiseen (siis kääntämisen ja linkityk- sen määrittelyihin). {6 ----------> Sittemmin ISE on alkanut tehdä vastavanlaista pakettia myös PC-yhteensopiviin (pätkitty, mutta toimiva malli on saatavilla ilmaiseksi Maailmanseitistä, osoit- teesta http://www.eiffel.com). On myös olemassa ilmainen, GNU-lisenssillä levi- tettävä SmallEiffel-kääntäjä, jonka sorsakoodit on valmiiksi sovitettu GNU C -kääntäjiin tusinassa eri laiteympäristössä (ftp://ftp.loria.fr/pub/loria/genie- log/SmallEiffel). (Kääntyy pienellä sovituksella myös mm. SAS C:llä.) {6 ----------> {DEiffelin esimerkki-ohjelmapätkiä Tärkein kysymys on tietenkin, millaista on Eiffelin ohjelmakoodi. Se, pitääkö ohjelmoija koodin ulkonäöstä, on vakavampi näkökohta kuin useasti tullaan aja- telleeksikaan. Koodin, siis siistityn koodin, tulee olla ennen kaikkea helppolu- kuista, jotta se kelpaisi malliksi. Samalla sen tulisi kertoa kielen rakenteesta ja sisäisistä ratkaisuista. Ylempänä kerroin hiukan Eiffelin koodaamistyylistä, mutta mitäpä sanat merkitsisivät ilman konkreettisia esimerkkejä: {C1. esimerkki: Hello_World.e {5class HELLO_WORLD {5 -- Se tutuin ohjelma... Näin merkitään kommentit Eiffelissä! {5 -- Usein Eiffelillä ohjelmoidessa laitetaan vain yksi luokka {5 -- yhteen tiedostoon ja kerrotaan kääntäjälle, mikä on juuriluokka, {5 -- josta suoritus alkaa. {5creation make -- Millä rutiinilla olio luodaan, jos ei spesifisesti määrätä {5 -- jotakin toista luontioperaatiota. {5feature -- Mitä ominaisuuksia luokalla on. Sekä rutiinit että tietoalkiot. {5 make is {5 do {5 io.put_string("Hello World.") -- io-luokka hoitaa io-toiminnot. {5 end {5end -- HELLO_WORLD Ohjelman suoritus päättyy juuriluokan luontioperaation {5 -- suorituksen päättymiseen. {6 ----------> {C2. esimerkki: Rutiinit Vaikkei se välttämätöntä olekaan (siis siihen ei pakoteta), esitetään että ru- tiineja olisi kahdenlaisia: funktioita ja proseduureja. Funktiot suorittavat jonkin (lasku)toimituksen ja antavat palautteena sen arvon; proseduurit taas eivät palauta mitään, mutta tekevät/muuttavat jotakin tai jonkin muistipaikan arvoa. Ja yksi rutiini tietysti tekee mielellään vain yhden asian. Esimerkki funktion rakenteesta: {5nimi(argumentit): TYYPPI is -- otsikko ja palautettavan arvon tyyppi {5require -- (valinnainen) ehtolauseke argumentin arvon {5 -- sopivuuden testaamiseksi, esim. arg >= 0 {5local -- esitellään muuttujat {5 luku: INTEGER {5do {5 -- itse rutiini {5 Result := mikäliearvo -- funktion palauttama arvo {5end -- rutiini loppuu ja arvo palautetaan kutsujalle {5 -- vasta end-sanaan tultaessa. rutiinia ei voi {5 -- keskeyttää. {6 ----------> {C3. esimerkki: toistolauseke Kuten jo aikaisemmin mainittiin, Eiffelissä on perinteisiin kieliin nähden vähän rakenteita kontrollivuon ohjaukseen, mutta ne ovat monipuolisia. Alla on malli Eiffelin toistolausekkeesta, loop-lauseesta: {5from -- from-sanan alle laitetaan toistolauseen alustukseen {5 -- tarvittava koodi, esim. muuttujien alkuarvot. {5invariant -- (valinnainen) Ehtolauseke, jonka on oltava voimassa jokaisen {5 -- kierroksen alussa, jotta silmukka toimisi oikein (erityisen {5 -- tärkeä ensimmäisellä ja viimeisellä kierroksella) {5variant -- (valinnainen) on päinvastainen laskutoimitus kuin se mikä {5 -- suoritetaan jokaisella kierroksella; kokonaislukuarvoinen {5 -- laskutoimitus, jonka tuloksen täytyy olla positiivinen. {5 -- Varmistaa, että suorituskertoja on äärellinen määrä. {5until -- lopetusehto {5loop {5 -- Tähän väliin itse silmukka. {5end Tuntuiko pitkältä ja hankalalta? Mutta tällaisten juttujen miettiminen etukäteen tekee kummasti debuggauksesta helpompaa ja nopeampaa. Luulisi, että Meyer olisi laittanut toistolauseen loppuun vastaavan toiminnon kuin alun from-lause huoleh- timaan toiston jälkeisistä toimenpiteistä. Olisiko unohtanut vai pitänyt turhan hankalana? {6 ----------> {DKenelle Eiffel? Hankala kysymys. Helpompi kai olisi vastata päinvastaiseen: Eiffel ei ainakaan missään nimessä ole perinteisen mallin hakkerin kieli. Eiffel-koodin kanssa ei voi helposti räpeltää tai oikaista. Ohjelman suunnitteluun täytyy uhrata aikaa. Toisaalta aikaa ei kannata uhrata pienten sovellusten tekemiseen, mutta ammat- tiohjelmoijille Eiffel voisi olla mannaa. Apuneuvoineen se soveltuu isojen oh- jelmien tekemiseen. Mikään jokapaikan jyrä Eiffel ei ole, mutta ainakin minun suosiostani se kilpai- lee tasaveroisesti C++:n kanssa (raskaassa sarjassa).