250 likes | 451 Views
Johdatus algoritmeihin ja ohjelmointiin. Perusopintokurssi, 3 op, syksy 2005 Turun yliopisto / ohjelmistotekniikka / Salo Lasse Bergroth _____________________________________ Kurssi perustuu opintomonisteeseen Boberg, Jorma: Johdatus tietojenkäsittelytieteeseen
E N D
Johdatus algoritmeihin ja ohjelmointiin Perusopintokurssi, 3 op, syksy 2005 Turun yliopisto / ohjelmistotekniikka / Salo Lasse Bergroth _____________________________________ Kurssi perustuu opintomonisteeseen Boberg, Jorma: Johdatus tietojenkäsittelytieteeseen Turun yliopisto / täydennyskoulutuskeskus elokuu 2000
Kurssin aikataulu • Luennot: yhteensä 28 tuntia 7 perättäisen viikon aikana • maanantaisin alkaen 2005-09-05, kello 14.00-15.45, sali D234 • tiistaisin alkaen 2005-09-06, kello 09.00-10.45, sali D234 o kurssin viimeinen luento tiistaina 2005-10-18 • Demonstraatiot: yhteensä 12 tuntia, perjantaisin • Ensimmäinen kerta 2005-09-16, kello 10.00-11.30 sali D234 • Seuraavat neljä kertaa viikon välein samaan aikaan salissa D234 • Viimeinen eli 6. demonstraatiokerta 2005-10-21 pidetään kuitenkin vasta kello 12.15 - 13.45 salissa D234
Kurssin suoritustavat • Kurssi koostuu luennoista, demonstraatioista ja tentistä. • Demonstraatiotehtäviä yhteensä 6∙5 = 30 tehtävää. • 12 tehtävää ( 40% ): tenttioikeus • 24 tehtävää ( 80%): yhden numeron hyvitys tenttiarvosanaan • Mahdollinen demonstraatiohyvitys tulee aina hyväksyttyyn tenttiarvosanaan. • Tehtävät ovat saatavilla viimeistään viikkoa ennen demonstraatiotilaisuutta. • Kysymykset löytyvät verkosta kurssin kotisivulta osoitteesta http://www.cs.utu.fi/opinnot/kurssit/Salo/syksy2005/bergroth/jajo.htm • Kaikkiin tentteihin pitää ilmoittautua viimeistään viikkoa etukäteen 3. kerroksen ilmoitustaululla olevalle listalle! • Tenttiin vastaamisaikaa käytettävissä 4 tuntia. • tenttiin kuuluu 5 kysymystä, jotka kaikki arvostellaan 6 pisteen arvoisesti, eli maksimipistemäärä on 30 • alimpaan hyväksyttyyn arvosanaan riittää 13 pistettä • Kurssin ensimmäinen tenttimistilaisuus on tarjolla tiistaina 2005-10-25 kello 09.00 – 13.00 salissa D234.
Kurssin tavoitteet • Esitellä algoritmiikan ja ohjelmoinnin peruskäsitteistöä, menetelmiä ja tekniikoita ( algoritmi, ohjelmointikielten ominaisuudet, abstraktiot, muuttujat, vakiot, asetuslause, ohjausrakenteet, aliohjelmat jne. ) • Antaa opiskelijalle edellytykset jäsentää asetettu, ratkaistavaksi tarkoitettu ongelma osittamalla se joukoksi itsenäisiä, alkuperäistä pienempiä osatehtäviä ( eli ns. moduuleiksi ) ja esittelemällä ne aliohjelmina ( funktiot ja proseduurit ) ja kokoamalla osatehtävien ratkaisut koko alkuperäisen ongelman ratkaisevaksi algoritmiksi • Valaista menettelytapoja, joilla algoritmimoduulien käytettävyyttä voidaan laajentaa ( moduulien parametrisointi ) • Esitellä vaihtoehtoisia laskennallisia lähestymistapoja saman ongelman ratkaisemiseksi ( rekursio vs. iteraatio ) • Tarjota perustiedot tietojenkäsittelytieteen oppiaineen tulevia opintoja varten ( mm. ohjelmoinnin opintoihin, kurssille Tietojenkäsittelytieteen perusteet sekä aine- ja syventäviä opintoja varten ). Kurssilla opittavia asioita tarvitaan toistuvasti myöhemmin, joten sillä käsiteltävien asioiden oppimiseen kannattaa panostaa voimakkaasti! • Tiivistetysti: antaa hyvät eväät algoritmiseen ajatteluun ja ohjelmointiin yleisellä tasolla sitoutumatta mihinkään yksittäiseen jo olemassa olevaan ohjelmointikieleen
Kurssin rakenne • Kurssilla käsitellään luentomonisteen luvut 1-2 kokonaisuudessaan. Käsiteltäviä asioita ovat mm. • Luku 1: Johdanto • Tietokoneet ja algoritmit • Ohjelmat ja ohjelmointikielet • Tietokonejärjestelmät • Algoritminen ongelmanratkaisu • Luku 2: Algoritmien suunnittelu • Algoritmin perusvaatimukset • Ohjelmointikielet • Algoritmien asteittainen tarkentaminen • Imperatiivinen paradigma • Ohjausrakenteet
Ohjausrakenteet • Modulaarisuus • Rekursio ja iteraatio • Tieto- ja talletusrakenteet • Keväällä pidettävällä kurssilla 'Tietojenkäsittelytieteen perusteet' käydään läpi monisteen loppuosa kokonaisuudessaan. Tuolloin käsiteltäviä teemoja ovat mm: • Algoritmien teoria ja laskettavuus • Tietokoneen rakenne ja toiminta • Systeemiohjelmisto • Epädeterminismi, rinnakkaisuus ja vapaajärjesteisyys
Tietojenkäsittelytiede vs. tietojärjestelmätiede • Tietojenkäsittelytiede pitää sisällään mm. seuraavat osa-alueet • Algoritmiikka • Ohjelmointi • Tietorakenteet • Tietokoneorganisaatio • Tekoäly • Tietojärjestelmätieteen piiriin lasketaan kuuluviksi puolestaan • Tietojärjestelmien suunnittelu • Tiedonhallinta • Ihminen kone -vuorovaikutus • Johdon tietojärjestelmät • ATK:n työyhteisölliset ja laajemmat yhteiskunnalliset vaikutukset • Kaiken kaikkiaan, tietojenkäsittelytieteen tutkimusalue on huomattavasti tietojärjestelmätiedettä suppea-alaisempi ja kohdistuu lähinnä tekniseen puoleen, kun taas tietojärjestelmätiede tuo tarkasteluun mukaan myös ihmis- ja yhteiskuntatieteellisen sekä myös taloustieteellisen näkökulman • Ohjelmistotekniikan perusopintoihin kuuluu sekä tietojenkäsittely- että tietojärjestelmätieteen opintoja ( algoritmiikan ja ohjelmoinnin kurssit vs. 'Tietojärjestelmän mallintaminen I ja II', 'Tietotekniikka työssä' jne. )
1 Johdanto • Tietojenkäsittelyn keskeisin käsite on algoritmi • Algoritmilla tarkoitetaan lyhyesti määriteltynä jonkin tehtävän suorittamiseksi tarvittavien toimenpiteiden selkeää kuvausta • Yleensä näiden toimenpiteiden joukko on järjestetty siten, että toimenpiteet suoritetaan peräkkäin yksi kerrallaan tietyn tavoitellun lopputuloksen saavuttamiseksi • Algoritmi on esitettävä tavalla, jota sen suorittaja ( ihminen, tietokone, robotti tms. ) pystyy ymmärtämään. • Tietokoneet saadaan suorittamaan algoritmeja, kun nämä esitetään sopivalla formaalisella kielellä, eli ns. ohjelmointikielellä • Algoritmit eivät ole luonteenomaisia pelkästään automaattiselle tietojenkäsittelylle ( vrt. ruoanlaittoreseptit, huonekalupakettien kokoamisohjeet, pelien säännöt jne. )
1.1 Tietokoneet ja algoritmit • Tietokoneiden yleistymisen vaikutuksia on usein rinnastettu lähes 200 vuotta aikaisemmin tapahtuneen teollisen vallankumouksen vaikutuksiin • Samalla kun teollinen vallankumous laajensi ihmisten fyysisiä voimavaroja ( monia raskaita, lihasvoimaa vaativia töitä alettiin siirtää koneiden hoidettaviksi ), ovat tietokoneet puolestaan laajentaneet ihmisten henkisiä voimavaroja. • Tietokoneet ovat vapauttaneet ihmiset pois runsasta toistoa vaativista rutiinitehtävistä, eli tehtävistä, joissa koneen hyvät ominaisuudet pääsevät parhaiten esille ( tehokas laskenta, tiedon varastointi jne. ) • Samoin kuin teollinen vallankumous saapuessaan vähensi ihmisten tarvetta lihasvoiman ylläpitoon, on usein nostettu viime aikoina esiin kysymys, muodostavatko tietokoneet uhkan ihmisen älyllisen kapasiteetin säilyvyydelle - aikaisemmin runsaasti ajatustyötä vaatineita työsuorituksia voidaan suorittaa tietokoneen avulla lähes käyttämättä ihmisaivoja • Lisäksi on kritisoitu voimakkaasti mahdollisuutta tietotekniikan soveltamista käytettäväksi vääriin tarkoitukseen, kuten aseteknologian tarpeisiin. • Tästedes tällä kurssilla keskitytään kuitenkin yksinomaan tietojenkäsittelyn tekniseen puoleen ottamatta kantaa moniin hyvinkin oleellisiin filosofisiin ja eettisiin kysymyksiin, joita tietotekniikka ihmisissä herättää.
Tietokone on laite, jolla pystytään ratkaisemaan hyvin määriteltyjä tehtäviä rutiininomaisesti suorittamalla suuria määriä yksinkertaisia (alkeis)operaatioita hyvin nopeaan tahtiin ( kymmeniä miljoonia operaatioita sekunnissa ). • Tehtävien ratkaisemiseksi tarvittavien toimenpiteiden täsmällistä kuvausta kutsutaan algoritmiksi. • Tehtävän suoritusta kutsutaan laskuksi tai prosessiksi. • Tehtävän suorittajasta käytetään puolestaan nimitystä prosessori. • Prosessi vaatii aina resursseja, joista tärkeimmät ovat • tehtävän suorittamiseen kuluva aika • tarvittavan muistitilan määrä • muut laitteistoresurssit ( esimerkiksi syöttö- / tulostuslaitteet jne. ) • Tietokoneen pääkomponentit ovat • prosessori eli keskusyksikkö • muisti • erilaiset siirräntä- eli syöttö- ja tulostuslaitteet • Tietokoneen muisti voidaan edelleen jakaa keskus- ja oheismuistiin • Keskusmuistissa säilytetään algoritmia, joka kuvaa suoritettavat operaatiot sekä tietoa ( data ), johon operaatiot kohdistetaan • Oheismuistia käytetään suurten tietomäärien pitkäaikaiseen varastointiin
Kuva 1: Tiedon prosessointia tietokoneella kuvaava kaavio Syöttö Prosessori Tulostus Muisti
Vertailua: ihminen vs. tietokone • Nopeus ja kyvykkyys • Tietokone: satoja miljoonia yksinkertaisia operaatioita sekunnissa • Monelle ihmiselle helpot tehtävät ovat koneelle erittäin vaikeita ( mm. puhuminen ja ymmärtäminen, motoriikkaa vaativat suoritukset yms. ) • On olemassa monia tehtäviä, jotka ovat niin vaikeita, että niitä ei voi suorittaa järkevässä ajassa nopeimmillakaan tietokoneilla • Luotettavuus • Tietokoneet eivät tee virheitä siinä mielessä kuin ihminen tekee. Ne eivät laskuissaan milloinkaan poikkea annetusta algoritmista. • Ne kykenevät väsymättä toistamaan suorituksensa kerrasta toiseen tarkalleen samanlaisena ja yhtä tehokkaasti, mutta nekin saattavat toki vioittua. • Yleensä tietokoneen tekemät virheet aiheutuvat suoritettavassa algoritmissa esiintyvästä virheestä, virheellisestä syöttötiedosta tai sähköviasta
Muisti • Tietokoneen muistin kapasiteetti ja hakunopeus vaihtelevat talletusvälineen mukaan • Tietokoneen muisti on järjestetty siten, että tietoalkio voidaan hakea muistista ainoastaan, jos sen tarkka sijaintipaikka talletusvälineellä tunnetaan. • Ihmisen muistin ongelma ei ole niinkään sen kapasiteetti vaan tiedon haku. Nykykäsityksen mukaan tiedon hakuperusteena ei ole tiedon paikka aivoissa, vaan erilaiset assosiatiiviset suhteet, eli tiedon liittyminen johonkin toiseen tietoon ( mietittäessä tiettyä asiaa muistuu helposti mieleen muita samaan tilanteeseen liittyviä tapahtumia ja asioita ) • Tietokoneella ei ole tapana unohtaa asioita ( kuten ihmisillä toisinaan! ), mutta tietokoneenkaan muistit eivät kuitenkaan ole rikkoutumattomia, joten erilaisiin virhetilanteisiin kannattaa varautua tallentamalla tärkeistä tiedoista kopiot turvaksi häiriöiltä. • Kustannukset • Tietokoneella saavutettavat kustannussäästöt manuaaliseen toimintaan verrattuna ovat usein huomattavia ( esim. reaaliaikaiset lentojen varausjärjestelmät ) • Tärkein syy tietotekniikan käytön yleistymiseen! • Tietokoneiden käytöstä saatavat hyödyt ovat kiistattomia, mutta on olemassa myös ongelmia, joihin ei ole olemassa algoritmista ratkaisua! Tietokone ei pysty ratkaisemaan mitään sellaista ongelmaa, jonka ratkaisua ihminen ei pystyisi löytämään. Tietokone siten vain täydentää muttei korvaa ihmistä.
1.2 Ohjelmat ja ohjelmointikielet • Tehtävän ratkaisu tulee esittää koneelle tarkasti jonkin etukäteen valitun formalismin avulla. • Kyetäkseen tulkitsemaan algoritmia prosessorin tulee ymmärtää, mitä kukin algoritmin askel ( = käsky ) tarkoittaa • Yksinkertaisin ohjelmointikieli on kullekin prosessorille ominainen konekieli, jonka käskyjä tietokone osaa tulkita suoraan Konekieli • Prosessorikohtainen • Laajan algoritmin esittämiseen tarvitaan hyvin paljon konekielisiä käskyjä • Ohjelmoinnin helpottamiseksi on kehitetty korkean tason kieliä eli lausekieliä.
Korkean tason kieli • Prosessorista riippumaton • Käsitteet ovat abstraktimpia kuin konekielen käsitteet • Pyritty suunnittelemaan siten, että tehtävien esittäminen algoritmeina olisi ihmiselle mahdollisimman helppoa ja luontevaa. • Tietokone ei kuitenkaan ymmärrä korkean tason kieltä suoraan, vaan tällaisella kielellä kirjoitettu ohjelma tulee kääntää konekielelle ennen suoritusta. • Käännös suoritetaan tietokoneohjelmalla, jota kutsutaan kääntäjäksi. • Ohjelman kääntämisen asemesta voidaan toisinaan turvautua ohjelman tulkitsemiseen yksi suoritettava lause ( käsky ) kerrallaan. • Ohjelman kääntämiseen ja tulkitsemiseen palataan myöhemmin kurssilla 'Tietojenkäsittelytieteen perusteet'. • Tarkastellaan luentomonisteen sivulla 12 olevaa kuvaa prosessista, jossa jonkin tehtävän ratkaisemiseksi kirjoitettu algoritmi muunnetaan suorituskelpoiseksi tietokoneohjelmaksi.
Käyttöjärjestelmä • Tietokoneen käyttöjärjestelmä ohjaa koneen perustoimintoja. Ilman käyttöjärjestelmää tietokone on käyttökelvoton. • Yleisimpiä käyttöjärjestelmiä ovat mm. MS-DOS, UNIX, Windows, Linux • Käyttöjärjestelmän tärkeimmät tehtävät ovat: • Syötön ja tulostuksen hallinta • Käyttäjän antamien komentojen toteuttaminen • Ohjelmien käynnistäminen: konekielinen ohjelma on pelkkä bittijono, ja vasta käyttöjärjestelmä muodostaa siitä toimivan prosessin • Oheismuistin hallinta ( tiedostojärjestelmä huolehtii tiedostojen sijoittelusta koneella ) • Tietokoneen resurssien jakaminen eri prosesseille • Käyttöjärjestelmän toimintaan perehdytään tarkemmin kurssin jatko-osan luvussa 5.
1.3 Tietokonejärjestelmät • Tietojärjestelmällä tarkoitetaan jonkin toiminnon toteuttamiseksi muodostetun organisaation tietojenkäsittelytarpeen tyydyttämiseksi kehitettyä järjestelmää, joka koostuu • Tietokonejärjestelmän lisäksi • Organisaatioon kuuluvista tietokonejärjestelmää käyttävistä ihmisistä • Tietokonejärjestelmä muodostuu • sovellusohjelmistosta • systeemiohjelmistosta sekä • tietokonelaitteistosta
1.4 Algoritminen ongelmanratkaisu • Algoritmin suorittaminen on systemaattinen toimenpide. • Algoritmien muodostaminen on älyllistä ponnistusta vaativa tehtävä. Ei siis ole mahdollista kirjoittaa algoritmia algoritmin muodostamiseksi. • Algoritmin rooli on keskeinen: ilman algoritmia ei ole ohjelmaa, ja ilman ohjelmaa ei tietokoneella ole mitään suoritettavaa • Algoritmit ovat kielestä ja koneesta riippumattomia, joten algoritmien suunnittelua voi opiskella pelkäämättä tiedon vanhentumista. • Algoritmi vaatii toimiakseen paitsi toimenpiteet annetun tehtävän ratkaisemiseksi niin kuvauksen siitä, miten sen tarvitsemat tiedot esitetään. Algoritmin liittyy siten usein kiinteästi jokin tietorakenne, joka on sidoksissa tehtävän formalisointiin. • Valitulla tietorakenteella on huomattava vaikutus algoritmin toimintatapaan ja tehokkuuteen.
Teknologian kehittyminen parantaa algoritmien suoritusmahdollisuuksia nopeuttamalla käytössä olevien algoritmien suoritusta ja tekemällä yhä monimutkaisempien ja runsaammin resursseja vaativien algoritmien käytön mahdolliseksi ( vrt. teollisen vallankumouksen vaikutukset: moni aikaisemmin taloudellisesti kannattamaton toiminta muuttui kannattavaksi; liikenneyhteyksien samanaikainen paraneminen ja halpeneminen jne. ). • Uudet ohjelmointikielet puolestaan helpottavat ohjelmointia ja mahdollistavat yhä abstraktimpien ja monimutkaisempien algoritmien esittämisen luontevasti tietokoneen ymmärtämässä muodossa ( yhä useampi ihminen pystyy kirjoittamaan ohjelmia, ja mahdollisuus ohjelmien virheettömyyteen paranee ns. abstraktiotason noustessa lähemmäksi ihmisen ajattelumallia ). • Kursseilla 'Tietorakenteet ja algoritmit I ja II' perehdytään tätä kurssia syvemmälti algoritmien ja niiden ominaisuuksien tarkasteluun. • Tarkastellaan monisteen sivulla 14 olevaa kaaviota prosessista, jossa jokin reaalimaailman algoritmisesti ratkaistavissa oleva ongelma ratkaistaan tietojenkäsittelytieteen menetelmin.
2 Algoritmien suunnittelu 2.1 Algoritmin perusvaatimukset • Ainoastaan yksikäsitteisesti ja riittävän täsmällisesti määritellylle tehtävälle voidaan laatia algoritminen ratkaisu. • Esimerkki epätarkasta tehtävänmäärittelystä: "Etsi lukujen suurin yhteinen tekijä". • Mitä tarkoitetaan 'luvuilla': ovatko tarkastelun kohteena luonnolliset, kokonais-, vai reaaliluvut tai peräti jokin äärellinen lukujoukko? • Monenko luvun suurinta yhteistä tekijää ollaan määräämässä: tarkalleen kahden vaiko mahdollisesti mielivaltaisen monen ... ? • Matematiikkaa opiskellut mitä ilmeisimmin tulkitsee annetun tehtävän kahden positiivisen kokonaisluvun suurimman yhteisen tekijän määräämiseksi, johon on olemassa mm. tunnettu Eukleideen algoritmi. • Eukleideen algoritmista täysin tietämätön joutuu kuitenkin arvaamaan, mitä tehtävän määrittely itse asiassa tarkoittaa • ---> mikä tahansa toimintaohje ei siis kelpaa algoritmiksi!
Algoritmilta vaaditaan ( tiukasti tulkittuna ) seuraavat ominaisuudet: • Yleisyys: Algoritmin on sovelluttava määritellyn tehtävän kaikkiin tapauksiin. • Esimerkki: Jos algoritmin tarkoituksena on ratkaista toisen asteen yhtälö ax2 + bx + c = 0 käyttämällä lukion oppikirjoista tuttua kaavaa x = -b ± b2 - 4ac ) / 2a, ja sijoitettaisiin vaikkapa a=1, b=0, ja c=1, ei algoritmi saa ajautua reaaliluvuilla laskettaessa ajonaikaiseen virheeseen sen takia, että lauseke b2 - 4ac menee negatiiviseksi, vaan tällöin pitää estää neliöjuuren laskentayritys ja tulostaa, ettei annetulla yhtälöllä ole ratkaisua reaalilukujen joukossa. • Deterministisyys: Tehtävän ratkaisun on oltava yksikäsitteisesti määritelty, ja laskennan joka vaiheessa tiedetään tarkalleen, mitä seuraavaksi tehdään • Ei saa syntyä tilannetta, ettei tiedettäisi, miten alkanutta laskentaa pitäisi jatkaa, vaikka se voisi olla joskus periaatteessa jopa yhdentekevää ( esimerkiksi hakuongelma: mistä suunnasta yritetään seuraavaksi? ) • Poikkeuksen deterministisyyskriteeristä muodosta kuitenkin vapaajärjesteiset algoritmit, joihin tutustutaan kursilla 'Tietojenkäsittelytieteen perusteet'.
Tuloksellisuus: Algoritmin on aina annettava oikea tulos • Tuloksellisuuskriteeri voidaan edelleen jakaa kahtia seuraaviin osiin: • Oikeellisuus: Algoritmin antama tulos on aina oikea • Terminoituvuus: Algoritmin suoritus päättyy aina, eli vastausta ei jouduta odottelemaan loputtoman kauan • Oikeellisuuskriteeristä voidaan kuitenkin toisinaan joustaa, sillä • On mahdollista, ettei tarkkaa lopputulosta koskaan edes pystytä saavuttamaan, eli joudutaan väistämättä tyytymään likiarvoon ( esimerkiksi neliöjuuren arvon laskeminen, kun tuloksena olisi irrationaaliluku eli päättymätön ei-jaksollinen desimaalikehitelmä ) • Tarkalleen oikean ratkaisun laskeminen veisi tarpeettoman paljon aikaa verrattuna likimääräisratkaisuun ( esimerkiksi merkkijonojen yhtäläisyyksien vertailuun liittyvät ongelmat ) tai tarkka ratkaisu saavutetaan tietyllä, riittävän suurella todennäköisyydellä ( esimerkiksi graafeihin liittyvät ns. NP-täydelliset ongelmat ) • Myös terminoituvuudesta on tarpeen tinkiä, jos kokonaisprosessin ei koskaan halutakaan päättyvän ( esim. kirjaston tietokannan ylläpito, kulkuneuvojen varausjärjestelmät jne. )
2.2 Ohjelmointikielet • Luonnollinen kieli ei sovellu tietokoneella suoritettavan algoritmin kuvaamiseen. Syitä tähän ovat mm. luonnollisen kielen • laaja sanasto ( usea eri sana voi tarkoittaa samaa asiaa tai käsitettä ) • mutkikas, epätäsmällinen kielioppi ( esimerkiksi yhdyssanojen muodostaminen ) • lauseiden merkityksen riippuvuus asiayhteydestä eli kontekstista ( samalla termillä voi olla useita eri merkityksiä, kuten vaikkapa sanalla kuusi ) • perustuminen viime kädessä puhuttuun kieleen ( vivahde-erot, korostukset ) • käytön vaatima 'maailmankuva' ( ymmärtämys jotain tiettyä taustaa vasten ) • Ohjelmointikielille on tulkinnanvaraisuuksien välttämiseksi oltava • yksinkertainen kielioppi • rakenteilla yksiselitteinen merkitys • ( ainakin melko ) riippumaton kontekstista • Ohjelmointikieliä on olemassa satoja erilaisia, ja niitä on kehitetty myös tietyn sovellusalueen tarkoitusperiä varten ( esimerkiksi funktionaaliset ja logiikkaohjelmointikielet ). • Ohjelmointikielen suunnittelun tavoite: kielen pitää olla sekä ihmisen että koneen helposti ymmärrettävissä
Ohjelmointikielen yleiset piirteet • Kielioppi eli syntaksi • sanelee, mitkä kirjoitelmat ovat hyväksyttyjä • perustuu käytettävissä oleviin symboleihin ja kielioppisääntöihin • vaihtelee voimakkaasti ohjelmointikielittäin • vastaa kysymykseen: Miten kielen mukaisia lauseita tulee kirjoittaa? • prosessorin tulee pystyä ymmärtämään • syntaktisesti virheellistä tietokoneohjelmaa ei pystytä suorittamaan; ohjelman onnistunut kääntäminen edellyttää kielioppivirheiden poistamista Esimerkki: Lause i++; tarkoittaa C-kielessä muuttujan i arvon kasvattamista ykkösen verran. Sen sijaan Pascal-kielessä ilmaus on virheellinen. • kone on erittäin herkkä reagoimaan kielioppivirheisiin toisin kuin ihminen, joka usein pystyy ymmärtämään toisen kirjoittaman tekstin, vaikka siinä olisi paljonkin kielioppivirheitä.Esimerkki: Lauseen "Tahvo matkusti tänää juna Salo Helsinki" mitä ilmeisin merkitys "Tahvo matkusti tänään junalla Salosta Helsinkiin" on helposti lukijan arvattavissa. • Semantiikka • määrää ohjelmointikielen lauseiden merkityksen • semantiikan täsmällinen määrittely on työlästä • ohjelmointikielen semantiikka tulee määriteltyä tulkin / kääntäjän toiminnassa • vastaa kysymykseen: Mitä lauseen suorittaminen saa aikaan?
syntaktisesti virheetön ohjelma voi olla semanttisesti virheellinen; virheellisyys ilmenee yleensä mielettöminä toimintatapoina ( esimerkiksi viittauksina varatun muistialueen ulkopuolelle ) Esimerkki: "Syötä syyskuun 31. päivän ylin lämpötila" ei ole semanttisesti järkevä ilmaus, koska syyskuussa on vain 30 päivää • semanttiset virheet ohjelmassa paljastuvat joko ajon aikana tai ilmenevät vasta virheellisinä lopputuloksina • Pragmatiikka • kuvaa ohjelmassa esiintyvien lauseiden tarkoitusperää • on vielä vaikeampi kuin pragmatiikka määritellä täsmällisesti • vastaa kysymykseen: Miksi tietyssä kohtaa ohjelmaa on juuri tuo lause? • pragmaattiset virheet ovat ns. loogisia virheitä: ohjelma voi olla sekä syntaktisesti että semanttisesti oikein, mutta se ei ratkaise asetettua ongelmaa oikein ( ainakaan yleisesti ) • loogisten virheiden jäljittäminen on usein vaikeaa: niiden esiintymistä voi ehkäistä parhaiten hyvällä suunnittelutyöllä ja ohjelman tunnusten mielekkäällä ja osuvalla nimeämisellä • esimerkki loogisesta virheestä: yritetään laskea mielivaltaisen kolmion pisimmän sivun pituutta käyttämällä Pythagoraan lausetta, vaikkei sitä voida soveltaa kuin ainoastaan suorakulmaiselle kolmiolle ja vain silloin, kun kahden lyhimmän sivun pituudet ovat tiedossa