Artikkelit
Ohjelmointikielen valinta
Valitse tarkoituksenmukainen ohjelmointikieli
Java on jo pitkään ollut yksi yleisimmistä tietojärjestelmien toteutuksissa käytetyistä ohjelmointikielistä. Monimutkaisen järjestelmän toteutuksessa kannattaa kuitenkin yleensä hyödyntää useita eri työkaluja.
Tässä artikkelissa esittelemme joukon nykyaikaisia ohjelmointikieliä vaihtoehtona Javalle. Perustelemme myös, miksi yhteen ohjelmointikieleen ei kannata sitoutua koko järjestelmän toteutusta varten ja mihin tarkoituksiin vaihtoehtoiset kielet soveltuvat parhaiten.
Kielen valinta vaikuttaa ohjelman laatuun
Ohjelmointikielten suunnittelu on tasapainoilua yleiskäyttöisyyden ja erityistarpeiden välillä: yleiskäyttöinen kieli on sovellettavissa suureen joukkoon ongelmia, mutta ratkaisun toteuttaminen on helpointa ongelmaan erityisesti suunnitellulla kielellä. Mitä monimutkaisempi ratkaistava ongelma on, sitä enemmän ohjelmointikielen soveltuvuus ongelmaan korostuu.
Ohjelmakoodin pituus vaikuttaa merkittävästi ohjelman laatuun. Lyhyt ohjelma on usein helpompi ymmärtää, toteuttaa ja laajentaa, ja se sisältää vähemmän virheitä. Ohjelman pituuteen taas vaikuttaa ohjelmointikielen abstraktiotaso, joka määrittää, miten tietokoneen yksityiskohdat esitetään yksinkertaistettuna kielen käyttäjälle.
Yleistäen matalan abstraktiotason kieli antaa enemmän kontrollia ohjelmoijalle, mutta vaatii enemmän ohjelmointia kuin korkean abstraktiotason kieli. Toisaalta ohjelmointikielissä on mahdollisuus ohjelmoida abstraktioita, jotka mallintavat ratkaistavaa ongelmaa. Mitä joustavampi kieli, sitä kattavampia malleja ratkaisun osista voi tehdä.
Selkeitä abstraktioita funktionaalisella ohjelmoinnilla
Koska ohjelmat monimutkaistuvat jatkuvasti, ne vaativat yhä korkeampaa abstraktiotasoa, jotta ratkaisut voidaan mallintaa järkevässä määrässä ohjelmoitavaa koodia. Funktionaalinen ohjelmointiparadigma on hyväksi havaittu keino selkeästi jäsennellyn koodin kirjoittamiseen. Tällöin ohjelma rakennetaan yhdistelemällä monia pieniä itsenäisiä osia, funktioita. Koska funktioiden sivuvaikutukset on rajattu ja funktioiden yhdistely on monipuolista, funktiot ovat hyvin uudelleenkäytettäviä.1
Useat nykyaikaiset ohjelmointikielet tukevat joko kokonaan tai osittain funktionaalista ohjelmointiparadigmaa lukuun ottamatta Javaa, joka ei tässä suhteessa ole kehittynyt muiden kielten tahdissa.
Silti käännetyn Java-kielen suoritukseen käytetty virtuaalikone, JVM (Java Virtual Machine), ja Javan ekosysteemi lukuisine kirjastoineen ovat edelleen arvostettuja. Monien uusien kielten ajoympäristöt pohjautuvat JVM:ään: hyvin toimivaa virtuaalikonetta ei kannata keksiä uudelleen. Lisäksi tällöin saadaan mahdollisuus käyttää Java-kirjastoja uudesta kielestä käsin.
Esimerkkejä nykyaikaisista ohjelmointikielistä
Scalan merkittävin piirre on funktionaalisen ohjelmoinnin ja olio-ohjelmoinnin yhdistäminen. Scalan kehittynyt tyyppijärjestelmä tarkistaa ohjelman rakenteen oikeellisuuden käännösaikana. Lisäksi Scalassa on monipuoliset välineet ongelmaympäristölle räätälöidyn kielen eli DSL:n (Domain Specific Language) kehittämiseen. DSL:n käyttö nostaa abstraktiotason lähelle luonnollisen kielen kirjoittamista.
Scala soveltuu samoihin tarkoituksiin kuin Java, kuten kriittisiin ja suorituskykyä vaativiin järjestelmiin. Kokeneen Java-ohjelmoijan on helppo siirtyä ohjelmoimaan Scalalla, koska kielen edistyksellisiä ominaisuuksia ei tarvitse käyttää heti. Scala on toteutettu JVM:n päälle, ja Java-kirjastojen kutsu Scala-koodista käsin ja päinvastoin on helppoa.
Myös Clojure on JVM:ään toteutettu funktionaalinen kieli. Clojure on kuitenkin Lisp-kielen murre, mikä määrittää kielen piirteet vahvasti: siinä on yksinkertainen listarakenteinen syntaksi, jolla koko ohjelma esitetään. Toistuvia koodirakenteita abstrahoidaan monipuolisella makrojärjestelmällä, joka käsittelee ohjelman listarakennetta käännösaikana.
Clojuressa on mekanismeja monelle rinnakkaisohjelmoinnin tyylille. Clojuressa ei ole erillistä käännösvaihetta ohjelman suorittamiseksi, vaan Clojure-tulkki kääntää lähdekoodin sitä lukiessaan JVM:n ymmärtämäksi tavukoodiksi. Lisp-juurien takia Clojure on hyvin ilmaisuvoimainen ja joustava kieli, mutta sen tehokas käyttö vaatii paljon opiskelua. Kuten Scalassa, Clojure-koodi voi käyttää Java-kirjastoja ja päinvastoin.
Ruby on omaksunut oliomallinsa Smalltalk-kielestä ja funktionaalisia piirteitä Lispistä. Rubyn dynaamisella tyyppijärjestelmällä on helppo kehittää DSL:iä ohjelman sisälle. Web-sovelluksien ohella Ruby soveltuu hyvin Unix-ohjelmointiin matalan järjestelmäkutsukerroksen ja kattavan kirjastokokoelman ansiosta. Koska Rubyllä kirjoitettua ohjelmaa ei käännetä, on ohjelman kehitys- ja testaussykli hyvin nopea. Vastapainona Ruby-ohjelman suorituskyky on huonompi kuin käännetyllä kielellä kirjoitetun vastaavan ohjelman suorituskyky. Kielestä on monia eri toteutuksia, joista JRuby on tehty JVM:n päälle.
Erlang on suunniteltu vikasietoisiin hajautettuihin järjestelmiin, joissa on korkeat vaatimukset rinnakkaisajolle. Rakenteeltaan Erlang on yksinkertainen funktionaalinen kieli, joka Scalan ja Clojuren tapaan välttää sivuvaikutuksia. Erlangin todellinen pihvi on kuitenkin sen kevyessä prosessimallissa ja viestinvälitysparadigmassa. Erlang tarjoaa myös prosessien valvonnan ja hajautuksen valmiina itse virtuaalikoneen toteutuksessa. Lisäksi Erlangin standardikirjasto, OTP (Open Telecom Platform), sisältää monia ratkaisuja hajautettujen järjestelmien tarpeisiin. Erlang soveltuu hyvin monimutkaisten järjestelmien taustakomponentiksi vastaamaan esimerkiksi viestinvälityksestä tai tietokannasta.
Viimeisenä esimerkkinä on JavaScript, jonka perustelu tässä artikkelissa esittelyyn on erikoisin: JavaScript on ainoa web-selainten yleisesti tukema ohjelmointikieli. Alati kehittyvien ja nopeutuvien selainten myötä web-sovellusten ohjelmointi on siirtymässä palvelimesta selaimeen. Tällöin sovellus jakautuu esitys- ja taustapäähän, joita yhdistää sovittu rajapinta. Esityspää ohjelmoidaan JavaScriptillä selaimessa ajettavaksi ja tausta- eli palvelinpää toteutetaan itsenäisesti.
JavaScript on funktionaalinen ohjelmointikieli Javasta tutulla C-kielen syntaksilla ja prototyyppipohjaisella oliomallinnuksella. Web-sovellusten käyttöliittymien kehittämiseen JavaScript, CSS ja HTML muodostavat avoimen, standardeihin pohjautuvan ja testiautomaatiota tukevan vaihtoehdon suljetuille työkaluille.
Toteuta järjestelmän osat sopivilla työkaluilla
Kaikkia yllä kuvattuja ohjelmointikieliä voidaan pitää nykyaikaisina, vaikka niistä vain Scala ja Clojure ovat uusia. Kielten ympärillä olevat aktiiviset yhteisöt kehittävät kieliä edelleen, ja funktionaalisen ohjelmoinnin suosion kasvun myötä kielet ovat saaneet uusia kannattajia.
Timpuri käyttää urakkansa aikana monia eri työkaluja, koska yksi työkalu ei sovellu kaikkiin tehtäviin. Niin pitäisi olla myös ohjelmistokehityksessä. Nykyaikainen tietojärjestelmä on usein niin monimutkainen, että yksi kieli ei sovellu järjestelmän kaikkien osien toteuttamiseen. Tällöin kukin osa kannattaa toteuttaa siihen sopivalla kielellä.2 Hyvin soveltuva kieli ratkaisee ongelman luonnollisemmin ja vähemmällä määrällä koodia kuin huonosti soveltuva kieli. Kirjoitetun koodin laatu puolestaan vaikuttaa lopulta koko tietojärjestelmän laatuun.
