perjantai 2. joulukuuta 2016

Tietokone, osa 6: Ohjelmointi

Viimekertaisen konekieliharjoituksen jälkeen on hyvä siirtyä oikeisiin ohjelmointikieliin. Pieni määrittely lienee paikallaan: ohjelmointikieli on keinotekoinen kieli, jossa on (yleensä) yksinkertainen ja kiinteä kielioppi sekä pieni sanasto. Kielestä riippuen koodi on lähempänä matematiikkaa tai englantia. Kääntäjäksi kutsuttu ohjelma muuntaa koodin konekieliseksi esitykseksi. Ohjelmointikielellä on kaksoistarkoitus olla selkeä sekä koneelle että ihmiselle, ja kiitos ihmisten luovuuden, niitä on ehditty luoda useampia tuhansia, hieman eri tarkoituksiin ja eri ajatusmalleja kannustaviksi.

Tässä osassa esittelen muutaman pääsuuntauksen historian varrelta, siinä missä niitä itse osaan. Loppuun olen lisännyt linkin Code.org -sivuston tunnin mittaiseen ohjelmointitehtävään, joka on aika loistavan oloinen ja visuaalinen tapa tutustua periaatteisiin itse. Aloitetaan!

Enemmän kuin konekieltä

Alkujaan koneet ohjelmoitiin tietenkin puhtaalla konekielellä, mutta varsin pian kehitettiin ensimmäiset symboliset kielet, jotka käännettiin konekielelle. Suurin osa näistä on unohtunut, mutta COBOLiin (COmmon Business Oriented Language) törmää vielä oikein vanhoissa systeemeissä, ja FORTRAN (FORmula TRANslation) on edelleen tiedepiireissä suosittu. Mitään näistä en osaa, joten ei esimerkkejä.

Classikko

70-luvun taitteessa kehitetty C (seuraaja kielelle nimeltä B — luovaa) on ehdoton hitti ohjelmointikielten keskuudessa. Se on varsin matalan tason kieli, eli se antaa paljon valtaa ohjelmoijalle sen suhteen, miten asiat tehdään. Tämä teki siitä loistavan kielen aikakauden hitaahkoille tietokoneille sekä käyttöjärjestelmien kirjoittajille. Mainittakoon tosin, että sillä on myös helppo ampua itseään jalkaan, ellei tiedä mitä tekee.

Edellisellä kerralla esitetty itseisarvofunktio näyttäisi tältä C:llä kirjoitettuna:

int abs(int x) {
    if (x < 0)
        x = -x;
    return x;
}

Koodissa määritellään funktio nimeltä abs (lyhenne itseisarvon englanninkielisestä termistä). Funktio vastaa terminä matemaattista sukulaistaan, mutta syvennymme asiaan tarkemmin ensi viikolla. Sana int tarkoittaa kokonaislukua (integer). Aiempi vertailu on nyt toteutettu selkeämmällä if -rakenteella. Erityyppisiä sulkeita käytetään ryhmittelyyn, ja "lauseet" lopetetaan puolipisteisiin. Sisennykset eivät ole pakollisia, mutta ovat olennainen osa selkeää ohjelmointityyliä.

C on kantamuoto merkittävälle osalle ohjelmointikielten sukupuusta. Sen pohjalta kehitetty C++ lisää objektien käsitteen sekä muita uusia ominaisuuksia, kuitenkaan poistamatta matalan tason piirteitä ("ammu itseäsi jalkaan tykillä!"). Nykyaikaiset Java ja C# ovat teknisesti aivan erilaisia, mutta käyttävät samanlaista kielioppia. (Niillä on vaikeampi ampua itseään jalkaan, mutta osa tehosta menetetään.)

Pascal on kivaa ohjelmoida

Samoihin aikoihin esitelty Pascal (nimetty aiemmin sarjassa vilahtaneen Pascalin mukaan) käyttää hieman erilaista kielioppia ja on muutenkin rakennettu turvallisemmaksi käyttää. Se oli erityisen suosittu 80-luvulla henkilökohtaisten tietokoneiden harrastajien parissa, nyttemmin suosio on hiipunut vähäisemmäksi.

function Abs(x: Integer) : Integer
begin
    if x < 0 then
        x := -x;
    Abs := x;
end;

Erotuksena edelliseen tämä kieli käyttää enemmän ja pidempiä sanoja (muuten brittienglannilla, joka on tietojenkäsittelyssä se toinen murre!). Luvun kirjoittamiseen käytetään erilaista yhtäsuuruusmerkkiä, mutta muuten tyyli on varsin samankaltainen.

Funktionaalinen juttu

Jo 50-60-luvuilla kehitetyn LISP-kielen johdannaiset ottavat erilaisen lähestymistavan. Niiden kielioppi on reippaasti yksinkertaisempi matemaattisessa mielessä, ja ne tarjoavat erilaisia vapauksia. Toisaalta samaan aikaan rajoitukset tekevät kielistä hieman epäkäytännöllisiä. Varsin matemaattinen lähestymistapa on jättänyt nämä kielet pääosin akateemiseen maailmaan — joitakin käytännön projekteja lukuunottamatta.

Toisaalta, henkilökohtaisesti pidän tätä vähän vaikeaselkoisena: (Tämä on Scheme-kieltä, jota olen opetellut viime aikoina ihan vähäsen)

(define (abs x)
    (if (> 0 x)
        (- x)
        x))

Tulkinnanvaraista

Parin viime vuosikymmenen aikana vapaamuotoisemmat kielet ovat nousseet suosioon. Ehdottomasti suurin niistä on JavaScript, jota käytetään verkkosivuilla. 90-luvun lopulla sillä tehtiin lähinnä yksinkertaisia pikkutoimintoja sivuille, nykyään sillä leikkaa ja voitelee leivänkin, ainakin melkein. JavaScript oli alkuun varsin hidas käyttää, koska tietokone tulkitsi sitä etenemisen mukaan, mutta nykytoteutukset ovat todella nopeita.

JavaScriptin sijaan esittelen kuitenkin Pythonin, koska se on hauska kieli. Se on tarkoituksella mukava kieli käyttää (nimi tulee Monty Pythonista), ja se korostaa selkeyttä ja yksinkertaisuutta. Sitä suositellaan aika usein ensimmäiseksi ohjelmointikieleksi, eikä suotta. Itse tosin olen jämähtänyt C:n sukuisiin kieliin, mutta arvostan Python-ajattelutapaa todella paljon.

def abs(x):
    if (x < 0):
        x = -x
    return x

Pythonissa ei tarvita puolipisteitä, ja sulkeita ei käytetä niin runsaasti. Sen sijaan sisennykset ilmaisevat ryhmityksen, ja rivityksellä on merkitystä. Tällä on suora tarkoitus tehdä koodista väljää ja selkeää.

Kokeile itse!

Mikäli olet jo ohjelmointitaitoinen, en voi kuin vinkata kokeilemaan jotain uutta. Oli se sitten uusi kieli, uusi aspekti tutusta kielestä, tai allaoleva, aivan sama.

Code.org on ohjelmointia nuorille esittelevä projekti, jolla on useampia tunnin mittaisia harjoituksia. Niissä ei tarvitse vääntää kielen parissa, vaan homma tapahtuu visuaalisella työkalulla. Samalla kuitenkin on mahdollisuus nähdä, millaista koodia työkalu tuottaa, ja halutessaan yrittää ratkaista tehtävä mahdollisimman lyhyellä ohjelmalla (ei täysin helppoa!).

Kävin itse jonkin aikaa sitten läpi Minecraft-teemaisen harjoituksen, joka antoi mielestäni loistavan kuvan peruspalikoista. Siksi en selitä niitä itse, vaan ohjaan harjoitukseen itseensä. Pelikokemusta ei tarvita alkuunkaan, ja sivu on maun mukaan myös suomeksi.

(Päivitys: Eivätkö he julkaisseet toisen version heti kun sain tämän tekstin julkaisujonoon. Tarkoitan vanhempaa Adventurer-versiota — uutta kannattaa kokeilla sen jälkeen, jos vielä kiinnostaa.)

Ensi viikolla jatkamme edelleen lähemmäs käytäntöä.

Ei kommentteja:

Lähetä kommentti

Kommentit ovat moderoituja — yritän hyväksyä kommenttisi mahdollisimman pian. Voit kirjoittaa kommenttiin LaTeX-koodia tai yksinkertaista HTML-merkintää: lue lisää Kommentointi-sivulta.