C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

Samankaltaiset tiedostot
Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ohjelmointiharjoituksia Arduino-ympäristössä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Java-kielen perusteet

Lyhyt kertaus osoittimista

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

4. Lausekielinen ohjelmointi 4.1

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

C-ohjelmointi, syksy Modulaarinen ohjelmointi. Luento C-ohjelmointi Syksy

Modulaarinen ohjelmointi

Tietorakenteet ja algoritmit

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Ohjelmoinnin perusteet Y Python

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen historia

Tietueet. Tietueiden määrittely

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

.NET ajoympäristö. Juha Järvensivu 2007

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Tietorakenteet ja algoritmit

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ohjelmointi 1. Kumppanit

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Java-kielen perusteet

TIETORAKENTEET JA ALGORITMIT

Loppukurssin järjestelyt C:n edistyneet piirteet

Ohjelmoinnin perusteet Y Python

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

11/20: Konepelti auki

Tietorakenteet ja algoritmit

C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja

5. HelloWorld-ohjelma 5.1

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

ITKP102 Ohjelmointi 1 (6 op)

5/20: Algoritmirakenteita III

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tietotyypit ja operaattorit

4. Lausekielinen ohjelmointi 4.1

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

811120P Diskreetit rakenteet

12 Mallit (Templates)

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Sisällys. 15. Lohkot. Lohkot. Lohkot

3. Binääripuu, Java-toteutus

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Modulaarinen ohjelmointi Kertaus osoittimista

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Tietorakenteet ja algoritmit

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Tietorakenteet ja algoritmit

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmoinnin perusteet Y Python

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Tutoriaaliläsnäoloista

TIE Principles of Programming Languages CEYLON

ITKP102 Ohjelmointi 1 (6 op)

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Loppukurssin järjestelyt

Muuttujien roolit Kiintoarvo cin >> r;

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Ohjeita Siemens Step7, Omron CX Programmer käyttöön

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

1. Olio-ohjelmointi 1.1

Laiteläheinen C-kieli osa 1 pva

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Käännös, linkitys ja lataus

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000

Tietokoneen toiminta, K Tavoitteet (4)

Ohjelmoinnin peruskurssi Y1

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Transkriptio:

1. JOHDANTO C-kieli on perustana useille muille ohjelmointikielille. Esimerkiksi C++-kieli on kehitetty C- kielestä, Java- ja C#-kielen syntaksin perustana on toiminut C-kieli ja useat muutkin ohjelmointikielet ovat saaneet vaikutteita C-kielestä. C-kieli on nykyäänkin yhä edelleen se perusohjelmointikieli, joka kuuluu insinöörien perustyökaluihin. Voidaan leikkisästi sanoa, että C-kieli on insinöörin mopo. 1.1 Historia Dennis Ritchie kehitti C-kielen 1970-luvun alussa ja toteutti siitä ensimmäisen version vuonna 1972. Dennis Ritchie työskenteli tuolloin AT&T:n Bellin laboratoriossa Yhdysvalloissa. C- kielen syntyyn johtanut prosessi alkoi BCPL-kielestä (Basic Combined Programming Language), jonka kehittäjä oli Martin Richards. Ken Thompson kehitti BCPL-kielestä B-kielen, jonka puolestaan johti C-kielen syntymiseen. Kuvassa 1-1 on esitetty kielet joihin C- ja C++ - kieli perustuvat. BCPL Algol68 Simula67 Ada CLU C C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet. 1.2 Standardointi Ohjelmien ja sovellusten siirrettävyys on tärkeä tekijä ohjelmointikielen käytön kannalta. Mitä tarkemmin ohjelmointikieli on standardoitu, sitä paremmin sen kääntäjät ovat yhteensopivia eri laite- ja käyttöjärjestelmäympäristöissä. C-kielen kehittämisen jälkeen kului melkein 20 vuotta ennen, kuin ensimmäinen virallinen C- kielen standardi saatiin aikaiseksi. Näiden vajaan 20 vuoden aikana C-kielestä oli toki olemassa ns. de facto standardi. Tämän määritteli ensimmäisenä Brian Kernighan ja Dennis Ritchie kirjassa The C Programming Language (Englewood Cliffs, N.J.: Prentice-Hall, 1978). Ensimmäistä virallista standardia varten perustettiin komitea kesällä 1983, jonka tehtävänä oli luoda ANSI (American National Standards Institute), joka määrittelisi C-kielen. Standardointiprosessiin kului aikaa 6 vuotta. Ensimmäinen ANSI C standardi valmistui joulukuussa vuonna 1989. Tämä sai myös ISO:n (International Standarda Organization) hyväksynnän. Tämän jälkeen standardia on tyypillisesti nimitetty ANSI/ISO C standardiksi. Vuonna 1995 standardia täydennettiin lisäpiirteillä ja mukaan liitettiin uusia kirjastofunktioita. Vuoden 1989 standardi täydennettynä vuoden 1995 lisäpiirteinä toimi C++-kielen kehittämisen perustana. 8

Vuonna 1999 valmistui viimeisin C-kielen standardi, jota on kutsuttu C99:ksi. Vuoden 1989 standardi voi selvyyden vuoksi kutsua C89:ksi. C99 standardoinnin yhteydessä säilytettiin lähes kaikki C89:n piirteet, joten C99 sisältään C89:sän ja joukon uusia piirteitä sekä ominaisuuksia. 1.3 Sijoittuminen muiden ohjelmointikielten joukkoon C-kieli on ns. välitason ohjelmointikieli. Tämä ei tarkoita sitä, että C-kieli olisi tehottomampaa, vaikeampaa oppia tai kehittää ohjelmia, kuin korkeamman tason ohjelmointikielien ollessa kyseessä. Pikemminkin tämä tarkoittaa sitä, että C-kielessä on mukana korkeammantason ohjelmointikielten parhaita elementtejä mukaan lukien hallintarakenteet yhdistettynä assembler-kielestä tutun joustavuuden kanssa. Kuvassa 1-2 on esitetty C-kielen sijoittuminen joihinkin tunnettuihin ohjelmointikieliin nähden. Middle level: Kuva 1-2. C-kielen sijoittuminen joidenkin tunnettujen ohjelmointikielien suhteen. C-kielen syntaksi sallii yksittäisten bittien käsittelemisen, tavuja käsittelemisen, sanojen käsittelemisen sekä osoitteiden käsittelemisen. C-kielellä voidaan siis käsitellä tietokoneen tiedonkäsittelyn peruselementtejä, jolloin kieli soveltuu hyvin myös laiteläheiseen ohjelmointiin (Esim. sulautetut järjestelmät). Tästä huolimatta C-kielellä kirjoitetut ohjelmat ovat hyvin siirrettävissä olevia laite- ja käyttöjärjestelmäympäristöstä toiseen. Siirrettävyydellä tarkoitetaan yhteensopivuutta (Portability), jolloin ohjelmat on helppo muuttaa toimimaan erilaisissa ympäristöissä. Korkeantason ohjelmointikielet tukevat erilaisia tietotyyppejä (Data types). Yleiset tietotyypit ovat kokonaisluku- (Integer), merkki- (Character) ja liukulukutyyppi (Floating-point). Vaikka C- kielessä on useita ns. sisään rakennettuja tyyppejä, niin tästä huolimatta kieli ei ole kovin vahvasti tyypitetty. C-kieli mahdollistaa lähes kaiken tyyppiset tyyppimuunnokset. C-kielessä on myös mahdollista tehdä ns. johdettuja tyyppejä, jo olemassa olevista tyypeistä. C-kieli ei ole kovin voimakkaasti tyypitetty ohjelmointikieli. Tämä tarkoittaa sitä, että C-kielessä lähes kaiken tyyppiset tyyppimuunnokset (Type cast) ovat mahdollisia. 9

C-kielen yksi keskeinen piirre on se, että sen syntaksi sisältää hyvin rajatun määrän käskyjä eli varattuja sanoja. Standardi C89 sisälsi vain 32 varattua sanaa. Kuvassa 1-3 on esitetty C- kielen varatut sanat. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Kuva 1-3. C-kielen varatut (Määritetty C89). Standardissa C99 uusia varattuja sanoja tuli lisää vain 5 kappaletta. Kuvassa 1-4 on esitetty nämä sanat. _Bool _Imaginary restrict _Complex inline Kuva 1-4. C-kielen standardiin C99 lisätyt varatut sanat. 1.4 C-kielinen ohjelma C-kieli tukee rakenteellista ohjelmointia. Rakenteellisen ohjelmoinnin perusteisiin kuuluu eri tyyppisten lohkojen käyttö kuten toisto ja valintarakenteet. Toistorakenteita (Silmukka, Luuppi) ovat esimerkiksi seuraavat: for while do-while Toinen rakenteellisen ohjelmoinnin perustekniikka on aliohjelmien käyttö. Aliohjelmien avulla ohjelmistosta saadaan modulaarinen rakenteeltaan sijoittamalla toiminnot omiin aliohjelmiinsa. Aliohjelmien avulla voidaan samaa ohjelman osaa käyttää monesta ohjelman kohdasta kutsumalla ao. aliohjelmaa. Lisäksi aliohjelmat muodostavat oman ns. näkyvyysalueensa, jossa voidaan määritellä esim. muuttujia, jotka eivät näy eli ole käytettävissä aliohjelman ulkopuolella. Kolmas rakenteellisuutta tukeva ominaisuus C- kielessä on se, että eri käännösyksiköitä (lähdetekstitiedostot) voidaan kääntää erikseen ja sitten yhdistää linkittämällä nämä jälkeenpäin yhdeksi ohjelmistoksi. 10

1.4.1 Lähdeteksti C-kielinen ohjelma koostuu erilaisista lohkoista. C-kieliseen ohjelmaan kuuluu aina yksi pääohjelma. Tämä pääohjelma on nimeltään main. Lisäksi ohjelmaan voi kuulua yksi tai useampi aliohjelma (Function) sekä tarvittava määrä ns. globaaleja määrityksiä ja tietorakenteita. Globaalit määritykset ja tietorakenteet ovat määrityksiä, jotka sijaitsevat pääohjelman ja aliohjelmien ulkopuolella. Kuvassa 1-5 on yksinkertaisen, mutta täydellinen C-kielisen ohjelman lähdekoodi (Tätä voi myös nimittää C-kieliseksi ohjelmaksi kunhan muistaa, että tästä lähdetekstistä käännetään sitten lopullinen konekielinen ohjelma koodi, joka on vasta suorituskelpoinen.). #include <stdio.h> void main ( ) { printf ("C-kieli on insinoorin mopo!") ; } Kuva 1-5. C-kielisen ohjelman ohjelmakoodi. C-kielessä itsessään ei ole komentoja joilla voitaisiin suorittaa esim. input/output (I/O) operaatioita, monimutkaisia matemaattisia laskutoimituksia kuten vaikka logaritmin laskemista tai vaikka merkkien käsittelyrutiineja. Tästä johtuen C-kieleen on liitetty joukko ulkopuolisia funktioita em. kaltaisten operaatioiden toteuttamiseksi. Nämä funktiot on kirjastoitu erillisiin tiedostoihin aihealueittain, jotka sitten yhdessä muodostavat C-kielen standardikirjaston (C s standard library). Kuvan 1-5 esimerkissä on käytetty yhtä standardikirjaston funktiota printf, jota käytetään esim. tulostettaessa jotakin näytölle. Kirjastot täytyy ottaa eli ns. inkluudata mukaan ohjelmakoodiin. Tämä tapahtuu komennolla #include <stdio.h>, tässä stdio.h niminen standardikirjaston tiedosto otetaan mukaan ohjelmaan. stdio.h sisältää standardien tulostus- ja syöttöfunktioiden määrittelyt. Standardikirjaston lisäksi käytettävään ohjelmistokehitysympäristöön voi kuulua standardoimattomia funktioita, joita voi myös käyttää. Esimerkiksi Borlandin ohjelmistojen kehitysympäristöissä on funktio clrscr(), joka tyhjentää kuvaruudun. 1.4.2 Ohjelman kehittäminen C-kielellä kirjoitettavan ohjelman kehittämisessä (Kts. kuva 1-6) on seuraavat päävaiheet: 1. Lähdetekstitiedoston (-jen) kirjoittaminen 2. Lähdetekstitiedoston (-jen) kääntäminen objektitiedostoiksi 3. Lähdetekstitiedoston (-jen) ja tarvittavien kirjastofunktioiden linkittäminen yhdeksi suoritettavaksi ohjelmakokonaisuudeksi. Kuvassa 1-6 on esitetty C-kielisen ohjelman kehittämisen päävaiheet. 11

LÄHDEKOODI Ohjelmal.C Sisällytys (Esikääntäjä) Otsikko.H KÄÄNNÖS Ohjelma.OBJ + Käännetyt moduulit LINKITYS Ohjelma.EXE KIINTOLEVY Kuva 1-6. C-kielisen ohjelman kehittämisen päävaiheet. Linkitysvaiheessa muodostetaan ohjelmoijan itse kirjoittamasta lähdekoodista, joka on käännetty konekielelle (Machine code) tietokoneen ymmärtämään muotoon eli objektikoodiksi (Konekielistä koodia tietokone pystyy lukemaan ja suorittamaan.) ja kirjastoissa valmiiksi olevista lähdekoodeista suorituskelpoinen ohjelmakokonaisuus. Kirjastoissa olevat valmiit funktiot ovat ns. uudelleen sijoitettavaa tyyppiä (Relocatable). Tämä tarkoittaa sitä, että funktioiden koodien käskyille ei ole määrätty etukäteen ehdottomia (Absolute) osoitteita, vaan koodin käskyt saavat suhteelliset osoitteet. Näiden suhteellisten osoitteiden avulla kirjastofunktioiden koodit saavat linkitysvaiheessa vasta ns. oikeat ohjelmoijan kirjoittamaan koodiin sopivat osoitteet. 1.4.3 Ohjelman suorittaminen On olemassa kaksi pääasiallista tapaa suorittaa (Execute) eli ajaa ohjelma. Ohjelma voidaan kääntää ennen sen suorittamista tai ohjelmaa voidaan tulkata sen suorittamisen aikana. C- kieli on tarkoitettu käännettäväksi ennen sen suorittamista. Java esimerkiksi on tehty tulkattavaksi kieleksi. Pääsääntöisesti etukäteen käännetty ohjelmakoodin suorittaminen on nopeampaa, kuin koodin jota tulkataan ajonaikana. Tämä johtuu tulkkaukseen kuluvasta ns. ylimääräisestä ajasta (Overhead). 12

Ohjelman suorittamisessa on seuraavat päävaiheet (Kts. kuva 1-7): 1. Ohjelman lataus kiintolevyltä tietokoneen keskusmuistiin 2. Ohjelman suorittamisen aloitus ensimmäisestä käskystä (Yleensä pienin osoite ohjelmalle keskusmuistista varatulta alueelta.). 3. Ohjelman suorittaminen käsky kerrallaan. Prosessori lukee yhden käskyn kerrallaan keskusmuistista sisäänsä tulkitsee käskyn ja purkaa sen ns. mikrokoodin avulla pienempiin palasiin. Suorittaa käskyyn liittyneet tehtävät ja lukee taas uuden käskyn keskusmuistista jne 4. Ohjelman lopetus, ohjelmalle varattu tila keskusmuistista vapautetaan. KESKUSMUISTI KJ Ohjelma.EXE 1. 2. - 4. Prosessori KIINTOLEVY Ohjelmalle varattu muistialue Kuva 1-7. Ohjelman suorittamisen päävaiheet. 1.5 C-kielen muistialueet (Memory map) Käännetty ja suorituksessa oleva C-kielinen ohjelma käyttää neljää toisistaan erillistä muistialuetta. Kuvassa 1-8 on esitetty C-kielisen ohjelman käyttämät muistialueet. Pino Keko Globaalit muuttujat Suoritettava ohjelma Kuva 1-8. Periaatteellinen kuva C-kielisen ohjelman käyttämistä muistialueista. 13

Suoritettava ohjelma sijoitetaan omalle alueelleen muistissa. Tämä alue pysyy muuttumattomana koko ohjelman suorituksen ajan. Seuraava alue on ohjelman globaaleja muuttujia varten. Tälle alueelle on talletettu kaikki ohjelman globaalit muuttujat. Keko (Heap) on vapaata muistialuetta, jota ohjelma voi varata käyttöönsä (Allocation) dynaamisen muistin varaamiseen tarkoitetuilla funktioilla. Pino (Stack) on pääsääntöisesti väliaikaiseen talletukseen tarkoitettu muistialue. Pinossa pidetään mm. seuraavia asioita tallessa: Funktiokutsujen paluuosoitteet, Funktiokutsujen välitysparametrit, Paikalliset muuttujat ja Tietoja CPU:n tilasta. Näiden neljän alueen fyysinen toteutus vaihtelee eri prosessoreiden/kontrollereiden tyyppien ja C:n toteutuksen mukaan. 1.6 C-kielisen lähdetekstitiedoston nimeäminen C-kielisen lähdetekstitiedoston nimi jakaantuu kahteen osaan. Ensimmäisen osan muodostaa ohjelmoijan itsensä ohjelmalle antama nimi esimerkiksi OmaOhjelma. Toisen osan muodostaa ns. laajennusosa (Extension).C, joka on tämä sama kaikissa C-kielisissä ohjelmissa. Ohjelman koko nimi voisi tällöin olla OmaOhjelma.c. Laajennus osa kertoo sen minkä tyyppisestä ohjelmasta (lähdekoodista) on kysymys. Laajennusosan perusteella osataan täten valita sopivan tyyppinen kääntäjä, joka kääntää lähdetekstitiedoston sekä ohjelmalle sopivat käännösoptiot. 14