keskiviikko 15. helmikuuta 2012

Ohjelmointikieliä aloittelijoille


Kuva: Ramotion Blog (http://www.flickr.com/photos/ramotion/)
Huolimatta siitä, että useampikin nörttitytoistämme on joko huvikseen tai ammatikseen ohjelmoija, ei tässä blogissa ole vielä aikaisemmin ollut juurikaan puhetta ohjelmoinnista. Näinpä ajattelin täyttää tämän aukon antamalla pikakurssin ohjelmointikielien ihmeelliseen maailmaan. Muutaman huomion jälkeen on jokaisesta ohjelmointikielestä malli ns Hello Worldistä. Se on (yleensä, ei nyt puhuta APL:stä) yksinkertaisin ohjelmaesimerkki; ohjelma, joka ajaessaan tulostaa ruudulle tekstin "Hello World".

Assembly
Assembly on askel ylöspäin Matrixista tutuista ykkösistä ja nollista. Se näki päivänvalon 50-luvulla ja sitä käytetään pääasiassa esimerkiksi mikroprosessorien ohjelmointiin. Sen tarjoamat toiminnot ovat kohtuullisen yksinkertaisia ja näin ollen se on (ainakin teoreettisesti) helppo oppia. Assemblyllä on kuitenkin äärimmäisen helppoa tehdä suuria ohjelmointivirheitä, kuten loputtomia kiertoja ja monimutkaisemman ohjelman koodin lukeminen on vähintäänkin rasittavaa.

Hello World:
title   Hello World!                             (hello.asm)

dosseg
.model small
.stack 100h

.data
message db 'Hello, World!',0dh,0ah,'$'

.code
main  proc
      mov    ax,@data
      mov    ds,ax

      mov    ah,9
      mov    dx,offset message
      int    21h

      mov    ax,4C00h
      int    21h
main  endp
end   main

COBOL
COBOL on ohjelmointikielien torakka. Se näki alkunsa 1959 ja COBOL-sovellukset luultavasti jatkavat pyörimistään maailmanlopun jälkeenkin niin kauan kuin virtaa vain riittää. Ja kun koneet käynnistyvät uudelleen, ne aloittavat taas pyörimisen. COBOL on tuskallista ylläpitää ja kehittää, alkaen siitä, että kääntäjät ovat edelleen pääasiassa kaupallisia. Sen tekstinkäsittelykyky on surkea. Se on myös äärimmäisen tehokas ja kykeneväinen käsittelemään massiivisia määriä tapahtumia, joka tekee siitä edelleen suositun esimerkiksi pankkimaailmassa.

Hello World (RM/1 kääntäjälle):
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.     HELLOWORLD.
000300
000400*
000500 ENVIRONMENT DIVISION.
000600 CONFIGURATION SECTION.
000700 SOURCE-COMPUTER. RM-COBOL.
000800 OBJECT-COMPUTER. RM-COBOL.
000900
001000 DATA DIVISION.
001100 FILE SECTION.
001200
100000 PROCEDURE DIVISION.
100100
100200 MAIN-LOGIC SECTION.
100300 BEGIN.
100400     DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
100500     DISPLAY "Hello world!" LINE 15 POSITION 10.
100600     STOP RUN.
100700 MAIN-LOGIC-EXIT.
100800     EXIT.

C
C kehitettiin vuosien 1969 ja 1973 välillä. Se suurilta osin korvasi Assemblyn sulautettujen järjestelmien koodauskielenä. Sulautettuja järjestelmiä ovat monet, joita ei helposti tule ajatelleeksi hallinnoitavan ohjelmistolla; autojen mottorin hallinta, jarrut, luistonesto, televisiot ja koodasipa entinen opettajani C:llä joskus työkseen sprinklerijärjestelmiäkin. Oma kokemukseni C:stä on, että se on paljon helpompi oppia kuin Assembly huolimatta sen laajemmasta komentovalikoimasta, mutta se voi johtua siitäkin, että olen sillä tavalla vain vähän outo.

Hello World:
#include <stdio.h>
int main(void)
{
  printf("Hello world!");
  return 0;
}

C++
C++ saapui kuvioihin 1983, käytännössä C:n laajennetuna versiona. C++ tarjosi C-kieleen luokkamallin ja tyypitykset, joka helpotti esimerkiksi tekstin käsittelyä. Se on C:tä korkeamman tason kieli, niin sanottu keskitason kieli , koska se yhdistää sekä korkean tason, että alhaisen tason ominaisuuksia. Käytännössä esimerkiksi C++:lla on mahdollisuus tehdä fyysisen muistin varauksia, mutta se ei ole välttämätöntä. Monet pelit koodataan edelleen C++:llä, kuin myös tietokoneeseen liitettävien laitteiden ajurit ja muut vastaavat.

Hello World (huomattavaa on, että edellinen C:n esimerkki toimii myös C++:na, kunhan .c-tiedostomuodon vaihtaa .cpp-tiedostomuodoksi) :
#include <iostream.h>
int main(void)
{
  cout << "Hello world!" << endl;
  return 0;
}

Java
Kuva: Hillary Hartley (http://www.flickr.com/photos/hillaryandanna/)
Jos COBOL on ohjelmointikielien torakka, on Java ohjelmointikielien aasi. Sen tultua kuvioihin 1995 se on pitkälti vallannut maailman. Tähän on kaksi syytä; ensinnäkin Java on alusta lähtien ollut täysin ilmainen niin kirjastojen kuin kääntäjänkin suhteen ja toisekseen se toi mukanaan JVM:n eli Java Virtual Machinen. Kaikki Javalla tehdyt ohjelmat pyörivät JVM:n päällä, poistaen niiltä tarpeen keskustella alla olevan käyttöjärjestelmän kanssa. Tämä tarkoittaa, että Javalla kerran tehty ohjelma ainakin teoreettisesti (ja yleensä myös käytännössä) pyörii missä tahansa käyttöjärjestelmässä, joka oli tuolloin lähes ennen kuulumatonta. Vuosien varrella tämä aasi on kuitenkin lihonut ja hidastunut ja keksinyt omia erikoisia ja rasittavia oikkujaan. Se on silti erittäin laajasti erilaisissa liiketoimintaohjelmistoissa käytössä ja näin ollen kokeneella Java-ohjelmoijalla riittää työn puolesta kysyntää riesaksi asti.

Hello world:

 class Hello {
   public static void main(String[] args) {
     System.out.println("Hello world!");
   }
 }

C#
Vuonna 2001 julkaistiin .Net alusta ja sen myötä C#-ohjelmointikieli. Sitä juhlittiin monissa piireissä Javan tappajana; kevyempänä, nopeampana, helpompana, puhtaampana olio-ohjelmointikielenä. Toisissa piireissä tätä Microsoftin kehittämää kieltä taas kutsuttiin kalpeaksi kopioksi Javasta. C#:lla graafisten käyttöliittymien tekeminen on suoraan sanottuna mukavaa, varsinkin verrattuna Javaan. Toisin kuin Java, C# mahdollistaa nykyään myös funktionaalisen ohjelmoinnin, joka on yksinkertaistettuna paluuta lähemmäs datan matemaattista käsittelytapaa. Ajan kuluessa myös C# on hidastunut, joskin se on myös kehittynyt Javaa nopeammin ja pidemmälle. Se on oppinut Javalta virtuaalikoneajattelua, joskin oman kokemukseni mukaan (josta on myönnettävästi jo jonkin verran aikaa) se ei suju aivan yhtä saumattomasti.

Hello world:

public class Hello1
{
   public static void Main()
   {
      System.Console.WriteLine("Hello, World!");
   }
}

Ruby
Ruby esiteltiin maailmalle 1995, mutta se pysyi pitkään pelkästään yliopistomaailmassa. Vasta Rails-kehikon saavuttua vuoden 2005 aikoihin räjähti Ruby todella laajan yleisön tietoisuuteen. Toisin kuin tässä aiemmin mainitut kielet, Ruby on dynaamisesti tyypitetty kieli, joka tarkoittaa, että kerran luotuun olioon voidaan laittaa millaista dataa tahansa ilman erillisiä toimenpiteitä. Tämä ei välttämättä kuulosta merkittävältä, mutta takaan, että jokainen Javan ClassCastExceptioneita päivitellyt sai tuikkeen silmiinsä kuultuaan tuon ensimmäisen kerran. Ruby on vahvimmillaan selainsovellusten kehityksessä. Esimerkiksi alkeellisen verkkokaupan pystyttäminen nollasta vie noin kymmenen minuuttia Ruby on Railsillä, kun taas esimerkiksi Javalla siihen saattaa mennä päiväkausia. Nopeasti nähtävien tulosten ja helpon ymmärrettävyyden takia Ruby on saavuttanut alaa ns Ensimmäisenä Ohjelmointikielenä ja esim Future Female on Suomessa järjestänyt kurssitusta kielen alkeisiin niin sanotusti pystymetsästä saapuville.


Hello world:

puts 'Hello world'


Scala
Scala, henkilökohtainen suosikkini (jota pääsen kuitenkin käyttämään työssäni aivan liian harvoin), saapui estradille 2003. Se on alusta alkaen suunniteltu hyödyntämään parhaita puolia sekä olio-ohjelmoinnista, että funktionaalisesta ohjelmoinnista. Sen pääasiallisena alustana toimii niin hyvässä kuin huonossakin JVM ja se toimiikin (lähes) saumattomasti aikaisempien Java-ohjelmien kanssa. Scalasta on tehty myös versio .Net alustalle ja se pyörii nätisti myös Android-puhelimissa. Kuten Ruby, myös Scala on laajasti ja jopa pääasiallisesti käytössä selainten hallitsemassa maailmassa. Monet suositut sivustot on toteutettu joko osittain tai kokonaan Scalalla, hyvinä esimerkkeinä vaikka Twitter, Foursquare ja Guardianin verkkosivusto. Scalalle saatavilla oleva Lift-kehikko tarjoaa samat nopeasti nähtävät tulokset, jotka Ruby saavuttaa, kun taas JVM tai (.Net, jos sattuu olemaan sinne päin kallellaan) tarjoaa jämäkkyyttä ja laajennettavuutta.

Hello world:

  object HelloWorld {
    def main(args: Array[String]) {
      println("Hello, world!")
    }
  }


Useita katkeria taisteluita on väännetty netin keskustelupalstoilla, pubeissa ja kaikkialla missä useampi kuin yksi ohjemoija kerääntyy siitä, mikä ohjelmointikieli onkaan kaikkein paras. Ja jos totta puhutaan, ainakin tämä ohjelmoija on onnistunut väittelemään aiheesta myös ihan yksinäänkin. Tärkein asia, joka ohjelmointikielistä kannattaa kuitenkin muistaa on, että ne ovat loppujen lopuksi työkaluja. Vaikka se olisikin mahdollista, Rubylla ei välttämättä kannata lähteä tekemään pankkien taustajärjestelmiä, eikä Cobolilla verkkokauppaa. Ohjelmointikielien kirjo on laaja ja tuskin kukaan pystyy oppimaan käyttämään kaikkia. Tämä setti on vain esimerkki minulle tutuimmista ohjelmointikielistä ja siitä puuttuu monia tärkeitä ja laajasti käytettyjä ohjelmointikieliä (Lisp, Haskell, APL, Smalltalk, PHP, F# ja monia muita), joista joku muu varmasti mielellään jatkaa juttua.

16 kommenttia:

  1. Kirjoittaja on poistanut tämän kommentin.

    VastaaPoista
    Vastaukset
    1. Kirjoittaja on poistanut tämän kommentin.

      Poista
    2. Sähläilin tuon koodinpätkän kanssa kahdestikin, niin laitan viestin kokonaan uudestaan :D Blogi ei näköjään tykkää, kun koittaa laittaa PHP-koodia viestin sekaan...

      Vaikka kyseessä olikin vain pintapuolinen esittely eri kielistä, oli se silti mielestäni kiinnostava. Yleensäkin ohjelmointi on hauskaa puuhaa ihan jo vaikka harrastus- ja itsensä toteuttamismielessä. Kunhan on opetellut kielen perusteet (ja ehkä vähän edistyneempiäkin juttuja), on lähinnä vain mielikuvitus rajoitteena, että mitä sillä voi tehdä.

      Toivottavasti kukaan ohjelmointia harkitseva ei lannistu nähdessään noita Assemblyn ja COBOLin koodeja, ne nimittäin näyttävät aivan hirveiltä :D En ole edes uskaltanut tutustua niihin sen tarkemmin, mutta onneksi nuo uudemmat kielet ovat reilusti inhimillisempiä.

      Oma suosikkini tällä hetkellä on PHP, joka on tosin rajoittunut lähinnä nettisivustojen ja niiden alla olevan dynaamisuuden tekoon. Hyvinä puolina mm. yksinkertaisuus, olio-ominaisuudet ja laaja käyttäjätuki netin keskustelufoorumeilla.

      Jospa tuostakin se hello world -esimerkki:

      (jouduin lisäämään välilyönnit tagien sisälle tämän blogin estojen vuoksi)

      < html >
      < head >
      < title >Hello World -sivu< /title >
      < /head >
      < body >

      < ?php

      echo "< p >Hello World!< /p >\n";

      ? >

      < /body >
      < /html >

      Poista
  2. Kiitos, Nina, mielenkiintoisesta artikkelista! Tuota Rubyä ja Scalaa katsoessa en voi kuin miettiä, että olisi ehkä sittenkin kannattanut ylläpitää ohjelmointiharrastusta.

    Ja voihan Cobol! Mulla on edelleen katkeruus tota kieltä kohtaan sen jälkeen kun sain siitä opettajalta vain 3:en vaikka mulla oli koe ihan oikein. Tosin satuin näkemään vahingossa kurssin arvostelut ja siellä koko luokka oli saanut pelkkiä 1:iä ja 2:ia ja vain yksi tyyppi 4:n, että olin mä kait sitten kuitenkin ihan hyvän arvostelun saanut, mutta pänniihän se, kun ei tulevat työnantajat näe kuin sen 3:en siinä paperissa sen kielen kohdalla. >:'(

    Sen sijaan lähettelen rakkauspakkauksia ihanalle C, C++ ja C# -kieliperheelle. *pus*

    VastaaPoista
  3. Mullakin on katkeria muistoja Cobolista, kun mulla oli kotikoneella eri kääntäjä, kun koulussa oli ja sitten kotitehtävät ei ikinä kääntyneet koulussa ja niitä piti aina säätää.

    Vielä ei ole lainkaan liian myöhäistä palata takasin ohjelmointiharrastuksen pariin. Varsinkin Ruby on tosiaan todella helppo oppia ja sillä saa näkyviä tuloksia nopeasti. Mutta se ei tietenkään mun mielestä vedä vertoja ollenkaan Scalalle, lähinnä juuri funktionaalisen ohjelmoinnin tuen puutteen vuoksi.

    PHP:täkin ajattelin liittää tähän juttuun, mutta sitten se oli jo niin kovin pitkä, että pudotin sen, JavaScriptin ja APL:n, joka on matriisiohjelmointikieli.

    VastaaPoista
  4. Syvästi katkera siitä, ettet maininnut Pythonia EDES tuossa tokavikan rivin sulkeissa! :D Tosin jos osaa Rubyä, niin Pythonia on ehkä vähän turha opetella, ne elävät aika samaa ekologista lokeroa.

    VastaaPoista
  5. Kuten Pyry yllä kysyy missä Python, niin mä jäin kaipailemaan sen lisäksi myös Perliä - kun kerran Rubykin sai oman slottinsa :)

    Eihän kaikkia maailman kieliä tietenkään voi esitellä, mutta mun mielestä Perl on tuntunut jotenkin ehkä eniten järkeenkäypältä ja suosittelen sitä ihan lämpimästi vaikka ensimmäiseksikin kieleksi!

    Mutta kiva artikkeli!

    VastaaPoista
  6. Sepä se, kaikkia kieliä ei vaan voi mainita ja juuri tilan puutteen takia päätin pysyttäytyä niissä, jotka on mulle itelle tutuimpia. Noi tokavikan rivin sulkeissa olevat kielet on kaikki semmosia, millä mä olen itse koodannut jotain Hello Worldiä monimutkaisempaa edes jossain vaiheessa. Python ja Perl on molemmat jääneet aika pitkälti multa tuon Hello worldin tasolle, koska en ole koskaan tarvinnut ja muut kielet on tullu joko aikasemmin vastaan tai houkutellu enemmän. :) Esimerkkinä juuri tuo Ruby; ensimmäinen työnantajani sattumoisin järjesti pienen Ruby-illan juuri niihin aikoihin, kun meinasin Pythonia ruveta opettelemaan. Ja kun valinta oli opiskella yksin kotona ja kavereiden kanssa ilmaisen ruoan ja juoman merkeissä, niin valinta oli selvä. :D Perlikin on jäänyt lähinnä sille tasolle, että se tekis mieli opiskella lähinnä XKCD:n (http://xkcd.com/208/) takia, mutta kun päivässä ei riitä tunnit kaikelle kiinnostavalle.

    Mutta tosiaan, näitähän riittäisi vaikka kuinka ja kukaan ei kiellä tekemästä tätä yhteistoimista sarjaa. Itseäni kiinnostaisi kuulla tarkemmin ainakin yhdestä kuvapohjaisesta ohjelmointikielestä, jonka nimi on jo päässyt katoamaan mielestä.

    VastaaPoista
  7. Java on nykyään uusi kirosana sanavarastossani.

    Terv. 5s kerta toden sanoo (siis viides kerta kun teen Java-tentin)

    Enkä saa aloittaa C#, ennen kun Java on hyväksytty, yhyy.

    VastaaPoista
  8. Hyvä artikkeli Nina! Anteeksi kamalasti, kun en ehtinyt ennakkolukea tätä - mulle iski nyt tähän saumaan se elämä haitoksi. Juttu on kuitenkin erittäin ymmärrettävä, sillä jopa minä - ohjelmointikielistä mitään tajuamaton tunari - saan tästä täysin tolkkua. Hello Worldin käyttäminen esimerkkinä havainnollistaa kummasti.

    Näitä voisi tosiaan ihan mielenkiinosta lukea listääkin, joten ei muuta kuin sarjaa pystyyn. Mua henk. koht. kiinnostaa jostain syystä erityisesti tuo ohjelmmointikielten historia. Siihen sisältyy sellaista näkymätöntä arjen neroutta.

    Asiasta vähän leivänpaahtimeen tuli tästä mieleen, että vierailin joskus Manchesterin tiede- ja tekniikka museossa MOSIssa ( http://www.mosi.org.uk/explore-mosi/explore-revolution-manchester/revolution-manchester-themes/computer-age.aspx ), jossa on mm. toimiva replika Manchesterin yliopiston ensimmäisestä tietokoneesta Babystä ( http://en.wikipedia.org/wiki/Manchester_Small-Scale_Experimental_Machine ) vuodelta 1948. Toimimattomana siellä on tallessa myös Babyn seuraaja Manchester Mark 1, joka pikkuveljen asemastaan huolimatta olikin sitten jo melkoisesti Babyä isompi kone. (http://en.wikipedia.org/wiki/Manchester_Mark_1)

    Opin Mosissa mm. että Babyn ja eteenkin sen seuraajan Manchester Markin teknikoiksi ja ohjelmoijiksi palkattiin enemmän naisia kuin miehiä - muun muassa koska heitä pidettiin täsmällisempinä ja huolellisempina työnteijöinä. Noiden ensimmäisten tietokoneiden hoitamiseenhan tarvittiinkin kokonainen laboratoriotakinen työryhmä.

    Wikipediassa mancherilaisten tietokoneiden historia vilisee miespuolisten tutkijoiden nimiä, mutta on jotenkin ihan hauska tietää, että oman aikansa "nörttitytöilläkin" oli jo 40- ja 50-luvulla roolinsa tietotekniikan kehityksessä - vaikka sitten "vain" koneenkäyttäjinä.

    Tämä ei nyt tosiaan suoraan liittynyt mitenkään Ninan juttuun, koska nämä varhaiset tietokoneet tietysti käyttivät tässä mainittuja alkeellisempia binäärisiä ohjelmistokieliä. Joka tapauksessa, jos satutte Manchesteriin, kannattaa vierailla ilmaisessa Mosissa. Tietotekniikan historian lisäksi siellä on paljon mielenkiintoisesti esille pantua juttua myös puuvillateollisuuden historiasta ja siistejä vanhoja lentokoneita. ;-)

    VastaaPoista
  9. Ja selvennykseksi tuohon edelliseen, että se Babyn replika ei tietenkään ole vuodelta -48 vaan valmistui vuonna 1998. Arvaattekin varmasti huonosta lauserakenteesta huolimatta, että itse Baby näki päivänvalonsa keväällä 1948.

    VastaaPoista
  10. Ja pienen koluamisen jälkeen löytyi sitten maininta eräästä Mark 1:sta asti Manchesterin tietokonevallankumouksessa mukana olleesta naisihmisestä Mary Lee Woodista. (http://en.wikipedia.org/wiki/Mary_Lee_Woods)

    Pari suoraa lainausta Wikipediasta: "Programming in those days was very different to the situation today.[3] Programs were written in machine code, using the basic binary digits (bits) with which all machines operate. Every bit had to be right; there was plenty of room for error, but there was opportunity to be cunning too. She found it to be great fun."

    "All this was in the early 1950s when the programmers were about equal numbers of men and women. The women had to fight for equal pay. They also had to fight for the right to work on the computer at night, machine time being so precious that it was often the only time available."

    VastaaPoista
  11. Basic (etenkin visual basic) on vieläkin semmoinen että siihen törmää. Ja jos fyysikoilta kysyttäisiin niin aikoinaan Cobolin kanssa kilpaa maailmaa valloittanut Fortran on edelleen yksi tärkeimpiä isojenm laskennallisten kirjastojen tekokieliä..

    Sitten tietenkin nykyään liki löytymättömiä ovat mm. PL/M, APL, Comal, Logo, Forth, PostScript, Pascal, Prolog ja Modula. Nuo ovat nykyään harvinaisuuksia, jotka ovat painuneet historian hämäriin.

    Kaikki eivät tietenkään olleet aloittelijoille tarkoitettuja, mutta ainakin Basic, Comal, Logo tulevat mieleen kielinä joita opetettiin ihan ensimmäisinä.

    PS: Ei pidä unohtaa C:stä sitä että sillä on tehty monet nykyajan tärkeimmistä käyttäjärjestelmistä (Unix variantit, myös linuc, OSx kerneli jne). Wintoosa on kai tehty jollain C:n jatkoversiolla, mutta en mene sanomaan millä kun en niin hyvin tunne.

    PS2: Ja mitä Assembleriin tulee, niin niitä on sitten tuhottomasti erilaisia. Esim DSP-prosessoreiten assemblerit on monasti aika huvittavaa luettavaa.

    VastaaPoista
  12. Joanna: Windows on tietääkseni tehty aika pitkälti kokonaan C++:lla. Vistaa yritettiin alunperin tehdä C#:lla ja projekti sitten meni niinkuin meni, ilmeisesti pääasiallisesti siksi, että C# ei ole tarpeeksi tehokas käyttöjärjestelmäkoodaukseen.

    Anittaa saattaa kiinnostaa, että tiettävästi maailman ensimmäiset ohjelmat tulivat Ada Lovelacen kynästä, kun taas ensimmäisen kääntäjän teki Grace Hopper.

    VastaaPoista
  13. Juu, Ada Lovelacen tiedänkin, mutta Grace Hopper ei ole ennestää tuttu. Googlettamaan...

    VastaaPoista
  14. Hei,

    Suosittelen vakavasti laittamaan paukut joko Javaan tai C#:iin. Itse olen ohjelmoinut kaikilla muilla kielillä tuosta setistä paitsi Rubyllä (ja en ole aikonut sitä opetellakaan), ja voin sanoa että Java sekä C# ovat parhaat ja monipuolisimmat, mitään niistä kuitenkaan mollaamatta.

    Ei tarvitse arvailla mikä on suosittu kieli ja mikä ei. Katso vaan täältä: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html. Sieltä voi mm. huomata, että Scalaa voi toki opetella, mutta ei sillä leipäänsä tienaa _ainakaan_ tällä hetkellä (ja omasta mielestäni ei koskaan, sillä Java tulee "pöllimään" parhaat ominaisuudet siitä; se on jo alkanutkin). Kts http://www.developer.com/java/java-7-and-8-begin-to-take-shape-whats-in-whats-out.html.

    VastaaPoista

Kotisivu on muuttanut osoitteeseen geekgirls.fi. Kaikki vanhat (ja uudet) artikkelit kommentteineen löydät uudesta sivusta.

Huomaa: vain tämän blogin jäsen voi lisätä kommentin.