Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Samankaltaiset tiedostot
automaattisen tietotyypin tunnistamisen osalta, minkä Smith koki olevan avaintekijä onnistuneen rinnakkaisen ohjelmointikielen toteuttamisessa.

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

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

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

11/20: Konepelti auki

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

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

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin perusteet Y Python

Ohjelmointiharjoituksia Arduino-ympäristössä

Sisältö. 2. Taulukot. Yleistä. Yleistä

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

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

Tieto- ja tallennusrakenteet

Sisältö. 22. Taulukot. Yleistä. Yleistä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Tie Principles of Programming Languages Seminar Essay. Lua. Group 23 Miikka Koskinen Joose Sainio

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Java-kielen perusteet

15. Ohjelmoinnin tekniikkaa 15.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

7. Oliot ja viitteet 7.1

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

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

TIE Principles of Programming Languages CEYLON

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

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

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

Rinnakkaistietokoneet luento S

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ohjelmointi 1 Taulukot ja merkkijonot

Harjoitustyö: virtuaalikone

8. Näppäimistöltä lukeminen 8.1

Olio-ohjelmointi Syntaksikokoelma

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

11. Javan toistorakenteet 11.1

Tutoriaaliläsnäoloista

12. Javan toistorakenteet 12.1

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

7. Näytölle tulostaminen 7.1

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

16. Ohjelmoinnin tekniikkaa 16.1

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

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Ohjelmoinnin perusteet Y Python

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tietueet. Tietueiden määrittely

16. Ohjelmoinnin tekniikkaa 16.1

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

CUDA. Moniydinohjelmointi Mikko Honkonen

12. Javan toistorakenteet 12.1

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. 15. Lohkot. Lohkot. Lohkot

Kielioppia: toisin kuin Javassa

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Ohjelmoinnin perusteet Y Python

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin peruskurssi Y1

13 Operaattoreiden ylimäärittelyjä

815338A Ohjelmointikielten periaatteet

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

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

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

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä

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

8. Näppäimistöltä lukeminen 8.1

12. Näppäimistöltä lukeminen 12.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Rakenteiset tietotyypit Moniulotteiset taulukot

Taulukot, silmukat ja muut joka koodin pikku veijarit

Ohjelmoinnin perusteet Y Python

Listarakenne (ArrayList-luokka)

Ohjelmoinnin peruskurssien laaja oppimäärä

OPPITUNTI 5 Ohjelman kulku

Ohjelmoinnin perusteet Y Python

Transkriptio:

Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen

Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka on tarkoitettu etenkin suurten kokoluokan järjestelmien ja supertietokoneiden käyttöön. Chapel on skaalautuva kieli, joten sitä voidaan käyttää myös muissa järjestelmissä, joissa on useampi ydin, sekä mahdollisuus rinnakkaisuuteen(esimerkiksi kaikki nykyaikaiset tietokoneet), eikä vain suurissa supertietokoneissa, joita varten se on aluksi suunniteltu. Monisäikeistä suoritusmallia Chapel tukee käyttäen korkean tason abstraktioita erilaisista rinnakkaisen ohjelmoinnin toteutustavoista kuten tiedon rinnakkaisuus, jossa sama operaatio voidaan tehdä useammalle elementille samaan aikaan. Tehtävien rinnakkaisuus, jossa ydin voi suorittaa esimerkiksi plus- ja kertolaskuoperaatiot samanaikaisesti. Rinnakkaisuus, jossa useita funktioita voidaan suorittaa samanaikaisesti, sekä sisäkkäinen sisäkkäinen rinnakkaisuus joka tarkoittaa sitä, että ohjelman tehtävien sisällä voidaan luoda uusia tehtäviä. Chapel on suunniteltu niin sanotun Multiresolution philosophyn mukaisesti. Tämä tarkoittaa sitä, että ohjelmoija voi aluksi kirjoittaa koodia hyvin korkealla abstraktiotasolla, mutta tarpeen mukaan heillä on pääsy myös syvemmälle lähemmäs rautaa, jos tarve vaatii. Tämä mahdollistaa suorituskyvyn matalan tason optimoinnin tarpeen niin vaatiessa, mutta jos tarvetta ei ole, voidaan pysyä korkeammalla tasolla, jolloin koodin kirjoittaminen on nopeampaa. [1] Syntaksi ja tietotyypit Chapelin suunnitteluperiaate oli luoda kieli, joka mahdollistaa suuren skaalautuvuuden ja tehokkuuden, mutta kieli tulisi olla myös helppoa oppia, sekä kirjoittaa. Kielen syntaksi muistuttaakin melko paljon C-kieltä, eikä sen perusperiaatteiden ymmärtäminen ole vaikeaa, jos on käyttänyt ennen esimerkiksi C:tä C++:aa, Pythonia tai Javaa. Näiden kielien tapaan Chapel tukee esimerkiksi olioita ja luokkia. Chapel käyttää syntaksissaan aaltosulkeita erottamaan koodilohkot toisistaan. Rivit myös päättyvät puolipilkkuun. Kieli on myös staattisesti tyypitetty, tyyppiturvallinen kieli, jossa jokaisen muuttujan tyyppi tunnetaan käännösaikana. Muuttujat alustetaan avainsanalla var, jonka jälkeen määritellään muuttujan nimi ja lopuksi sen tyyppi tai muuttujan arvo. Tyypin voi myös jättää mainitsematta, jolloin se päätellään alustusarvon tyypistä. Muuttujia voi myös castata tyypistä toiseen. Tämä tapahtuu yksinkertaisesti luomalla uusi muuttuja, jolle castattava muuttuja annetaan parametrina. Esimerkiksi merkkijonon castaus tyypistä string tyyppiin int onnistuu seuraavasti: var mystring = 1234 ; var myint = mystring: int;

Chapelin käyttämiä perustietotyyppejä ovat seuraavat: Tyyppi Kuvaus Oletusarvo bool Totuusarvo false int Etumerkillinen kokonaisluku 0 uint Etumerkitön kokonaisluku 0 real Reaalinen liukuluku 0.0 imag Imaginääriluku 0.0i complex Kompleksinen liukuluku 0.0+0.0i string Merkkijono Chapellen perus tietotyypit ja niiden oletusarvot Kuten taulukosta nähdään, Chapel määrittelee tietotyypeilleen myös oletusarvon, jota käytetään, jos muuta arvoa ei ole annettu. Complexia lukuun ottamatta kaikki muuttujat ovat 64-bittisiä. Ohjelmoija voi kuitenkin halutessaan muuttaa sitä, kuinka suuria muuttujat ovat. Kokonaisluvuille ja booleanille pienin arvo on 8 bittiä, kun taas reaali- ja imaginääriluvuille se on 32 bittiä. Kompleksiluvut voivat olla vähintään 64 bittisiä ja niiden oletusarvo on 128 bittiä. Merkkijonoille näitä arvoja ei ole määritelty. [2] Tietovarastona Chapel käyttää taulukoita. Taulukot eroavat C-kielen taulukoista siten, että niihin voidaan lisätä alkioita myöhemmin, samaan tapaan kuin C++:n vektoreihin. Taulukot voivat olla myös kaksiulotteisia. Hieman outoja Chapelin taulukoista tekee se, että ohjelmoija voi halutessaan alustaa niihin vain tietyt indeksit. Esimerkiksi rivi var C: [2,4,6] int; Luo taulukon, joka pitää sisällään vain indeksit 2, 4 ja 6. Eli indeksejä 1, 3 ja 5 ei ole käytössä lainkaan ja jos näitä yritetään koodissa indeksoida, palauttaa ohjelma virheen. Alla on kuvattu tavat, jolla Chapelissa luodaan yksiulotteinen ja kaksiulotteinen taulukko: //Yksiulotteinen taulukko var A: [1..5] int; //Kaksiulotteinen taulukko var B: [1..5, 1..5] int; Taulukoille annetaan siis väli, tai halutut indeksit, joille taulukko luodaan. Jos taulukko luodaan käyttäen väliä, tulee taulukosta niin sanotusti tiheä (dense). Jos taas taulukolle listataan halutut indeksit, tulee siitä harva(sparse). Tiheisiin taulukoihin uusien elementtien lisääminen onnistuu

käyttäen push_back() operaattoria, mutta harvoihin sen käyttö ei onnistu, vaan kääntäjä palauttaa virheen. Chapelista löytyvät myös C-kielestäkin tutut for ja while silmukat, ehtolauseet, sekä C:n switch lausekkeen tapaan toimiva select-lauseke. Myös iteraattoreiden luonti on mahdollista. Iteraattori on kuin funktio, mutta se säilyttää oman tilansa ja se voi palauttaa useamman arvon. Iteraattoreita käytetään Chapelissa etenkin silmukoiden kanssa, jolloin silmukkamuuttujan arvoon voidaan jokaisella kierroksella palauttaa iteraattorin arvo. Alla on kuvattu koodi, jolla saadaan tulostettua näkyviin 10 ensimmäistä fibonacchin lukua iter fibonacci(n: int) { var (current, next) = (0, 1); for 1..n { yield current; (current, next) = (next, current + next); } } for indexvar in fibonacci(10) { write(indexvar, ", "); } Iteraattorille annettava parametri määrittää tässä tapauksessa sen, kuinka monta arvoa se palauttaa. Iteraattorin sisällä oleva yield avainsana palauttaa muuttujan arvon, ja se otetaan talteen indexvar silmukkamuuttujaan. Kun iteraattori on suorittanut itsensä 10 kertaa, lopettaa se toimintansa ja myös silmukan suoritus loppuu. Tehtävien rinnakkaisuus Tehtävä on Chapelissa laskennan yksikkö, joka suoritetaan rinnakkain muiden tehtävien kanssa. Nämä muodostavat perustan Chapelin kaikille rinnakkaisuudelle. Ohjelma, suoritus alkaa yhtenä tehtävänä ja uusia tehtäviä voi lisätä rinnakkaisajon aikaansaamiseksi. Ohjelma ei kuitenkaan automaattisesti lisää näitä, vaan se on ohjelmoijan itse määritettävä. Tehtävän suorituksen pituutta ei ole erikseen määritelty. Tehtävät voivat olla sisäkkäisiä, eli tehtävät luovat uusia tehtäviä. Tehtävät voivat jakaa tietoa keskenään perinteisten leksikaalisten lohkojen keinoin. Chapel ei takaa ohjelmien oikeellisuutta, mikäli tehtäviä yritetään ajaa sarjassa niiden päättymiseen asti. Tarkemmin sanottuna, on mahdollista että tehtävät ajetaan synkronoituna. Ne voivat myös estää tai odottaa muiden tehtävien suoritusta. Tehtävät voivat myös lukkiutua ja aiheuttaa kilpajuoksutilanteita.[3]

Yksinkertaisin tapa luoda tehtävä on lauseen tai lohkon aloittaminen begin -avainsanalla. Esimerkiksi: begin writeln("hei"); writeln("moi"); Koska näitä ei ole synkronoitu, suorituksen järjestys on määrittelemätön ja tulostus voi tapahtua kummassa järjestyksessä tahansa. Muuttujia voi synkronoida lisäämällä muuttujan tyypin eteen avainsanan sync, jolloin muuttuja sisältää tilan, joka voi olla tyhjä tai täysi. Muuttujaa ei voi lukea ennen kuin se on täysi ja siihen ei voi kirjoittaa ennen kuin se on tyhjä.[4] Muistinhallinta Chapel tukee dynaamista muistinhallintaa siten, että luokkaolioille voi varata muistia avainsanalla new ja vapauttaa avainsanalla delete. Chapel suunniteltiin alunperin ilman delete -avainsanaa. Aikomuksena oli toteuttaa roskienkeruu hajautetulle muistille (distributed-memory garbage collection), mutta tämä osoittautui tutkimusongelmaksi. Odotetaan, että tulevaisuudessa kieli tulee tukemaan vaihtoehtoisesti käytettävää hajautetun muistin roskienkeruuta sekä aluekohtaista muistinhallintaa (region-based memory management).[4]

Lähteet [1] https://chapel-lang.org/overview.html [2] https://chapel-lang.org/docs/latest/users-guide/base/basictypes.html [3] https://chapel-lang.org/docs/1.13/users-guide/taskpar/taskparallelismoverview.html [4] https://chapel-lang.org/docs/latest/_downloads/chapellanguagespec.pdf