(toiminnot)

hwechtla-tl: Symboli

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


Symboli on ihan loistava tietotyyppi, mutta useimmat ohjelmoijat eivät edes tiedä niiden olemassaolosta; tai ovat tottuneet pärjäämään ilman niitä, jolloin eivät osaa hyödyntää niitä edes, vaikka ne olisivat tarjolla. Tämän kirjoituksen pointti on selittää, mitä hyötyä symboleista on, ja innostaa ihmiset käyttämään symboleita enemmän ohjelmissaan.

Symbolien käyttö on synergeettistä, vähän niin kuin esimerkiksi se, että esittää tekstin aina tunnetussa merkistössä (kuten Unicodena). Tekstit kannattaa muuttaa Unicodeksi (ja nimet/tunnisteet symboleiksi) heti, kun ohjelma ottaa ne vastaan, niitä kannattaa käsitellä ohjelman sisäisesti aina Unicodena (ja symboleina), ja ne kannattaa muuttaa tavuiksi (merkeiksi) vasta, kun data lähtee ohjelmasta esim. tiedostoon tai verkkoon. Rakenteettoman tietotyypin käyttö saattaa tuntua helpommalta, "suoraviivaisemmalta", mutta aina, kun haluaa jollain tavoin prosessoida tietoa, on mukavampaa, jos sillä on selkeä rakenne. Ja symbolit antavat nimille rakenteen.

Tässä on kiva artikkeli aiheesta. Kieli on Ruby; ei yllättävää, sillä Lisp-ihmiset eivät aina tajua, että symbolien käyttöä pitäisi jotenkin selittää. http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol

Minkä rakenteen symboli antaa merkkijonolle? Sen, että sama nimi/tunniste (merkkijono) viittaa aina samaan asiaan. Tämä on oikeasti merkkijonotietotyypin ja symbolin ainoa ero: symboli on merkkijono, josta taataan, että kaksi samansisältöistä merkkijonoa ovat aina sama merkkijono. Käytännössä tämä tarkoittaa, että kahden symbolin vertaaminen toisiinsa on yhtä nopeaa kuin pienten kokonaislukujen. (Usein symboliin voi myös liittää lisätietoja.)

Symbolittomissa kielissä, kuten Javassa, C:ssä, Pythonissa jne., ohjelmoijat ovat usein tottuneet käyttämään lukuja tai luetelmia (enumeraatioita) tilanteissa, joissa tarvitsee ilmaista jokin monesta vaihtoehdosta. Esimerkiksi funktio, joka palauttaa kahden merkkijonon keskinäisen järjestyksen, voi ilmaista sen palauttamalla nollan tai negatiivisen tai positiivisen luvun sen mukaan, kumpi merkkijono on aakkostuksessa aiempi. Monet proseduurit palauttavat niin ikään virhekoodeja tai jonkin erityisarvon (kuten -1) tilanteessa, jossa ei ole kunnollista palautettavaa. Sama juttu funktioiden syötteissä: jos jokin syöte on monivalinta, siinä käytetään yleensä luetelmia.

Jotkin näistä tilanteista on luonnollista hoitaa poikkeuksin (poikkeusten käyttämisestä), mutta on myös paljon tilanteita, joissa symbolit ovat oikeasti paljon parempi vaihtoehto.

Symbolit ovat itsensä dokumentoivia, tehokkaasti toteutettuja tunnisteita. Se, että käyttää numeroita symbolien sijasta tällaiseen, on kuin käyttäisi rivinumeroita funktionimien sijasta viitatakseen ohjelman osiin. Symboleita ei tarvitse edes deklaroida millään tavoin, niitä voi käyttää saman tien. Tietyt tietotyypit, joiden arvoja on äärellinen määrä -- totuusarvot, tyhjä lista, viikonpäivät -- ovat ilman muuta symboleja.

Joissakin tietotyypeissä on potentiaalisesti ääretön määrä arvoja, mutta jotkin ovat yleisiä: värien nimet, henkilön ominaisuuksien nimet, luonnollisen kielen sanat, kuvien luokitteluun käytetyt tagit, protokollan eri viestit. Näissä ei ole edes mahdollista määritellä etukäteen kaikkia mahdollisia arvoja, mutta symboleitapa voikin muodostaa loputtomasti lisää ja kaikki on hyvin.

Tekstin käsittely on usein nopeampaa, kun muuntaa tekstin symboleiksi. Ei tosin ole kannattavaa muuttaa isoa tekstimössöä yhdeksi symboliksi, koska tämän symbolin vertailusta muihin on tuskin paljonkaan hyötyä. Mutta riippuen siitä, mitä tekstillä haluaa tehdä, esimerkiksi sen sanat (tai muut osat, kuten välimerkkien erottamat osat) voi muuttaa symboleiksi ja panna listaan. Jos etsii tekstistä paljon erilaisia ilmauksia, symbolien käyttö nopeuttaa prosessointia huomattavasti.

Symboleita kannattaa käyttää myös tietorakenteissa siellä, missä muuten käytettäisiin luetelmia, tageja tai nimiä. Jos esimerkiksi mallinnat dokumentin rakennepuuta, jokaisessa puun solmussa kannattaa ensimmäiseksi olla symboli, joka kertoo, minkälaisesta puun osasta on kyse (esim. kappale / korostus / otsikko / sana). IRC-protokollassa käyttäjien ja kanavien nimet sekä viestityypit ovat ilman muuta symboleita, koska ne ovat yksittäisten olioiden yksiselitteisiä tunnisteita.

Jos lähdetään kehittämään tietorakenneajatusta pidemmälle, niin dynaamisesti tyypitetyn oliojärjestelmän saa merkitsemällä olioihin luokan symbolilla. Jos haluat toteuttaa ohjelmointikielen, muuttujiin ja funktioihin kannattaa viitata ohjelmakoodista jäsennetyssä syntaksipuussa symboleilla, ja jos teet tietuemäärittelyn, jossa on monta kenttää, kenttien nimien kannattaa olla symboleita.

Staattisissa kielissä käytetään joskus symbolien sijaan deklaraatioita: muuttujien, luokkien, jäsenkenttien, metodien ja funktioiden deklaraatioita. Tämä on ihan hyväksyttävä tapa antaa nimille identiteetti (tai asioille nimi). Tunnisteet (identifier) ovat symbolien käännösaikainen vastine: nimi jollekin, joka oikeasti on vain muistiosoite tai numero. Dynaamisissa kielissä, joissa kaikkea ei tarvitse määritellä etukäteen, symbolit ovat verraton selkeytys; ja jos haluaa introspektiivisesti tutkia ohjelmaansa ajonaikaisesti, on luontevaa viitata myös käännösaikaisiin nimiin ajonaikaisilla symboleilla. (Symboleja tukevat kielet (Scheme, Lisp, Ruby) käytännössä aina yhdistävät käännösaikaisen nimiavaruuden ajonaikaisten symbolien nimiavaruuteen.)


kommentoi (viimeksi muutettu 16.04.2013 14:35)