Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Samankaltaiset tiedostot
TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

C++11 lambdat: [](){} Matti Rintala

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

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

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

11/20: Konepelti auki

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

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

Groovy. Niko Jäntti Jesper Haapalinna Group 31

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

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

ITKP102 Ohjelmointi 1 (6 op)

Harjoitustyö: virtuaalikone

TIE Principles of Programming Languages CEYLON

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Jakso 4 Aliohjelmien toteutus

7. Näytölle tulostaminen 7.1

Ohjelmointiharjoituksia Arduino-ympäristössä

- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

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

815338A Ohjelmointikielten periaatteet

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Java-kielen perusteet

1. Omat operaatiot 1.1

7/20: Paketti kasassa ensimmäistä kertaa

Rajapinta (interface)

Lyhyt kertaus osoittimista

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

13 Operaattoreiden ylimäärittelyjä

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Java kahdessa tunnissa. Jyry Suvilehto

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Common Lisp Object System

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

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Syntaksikokoelma

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

05/04/2004. Digitaalisen median tekniikat, k2004 HY/TKTL, javascript_1. Harri Laine 1. JavaScript

Digitaalisen median tekniikat JavaScript

Digitaalisen median tekniikat JavaScript Harri Laine 1

4. Luokan testaus ja käyttö olion kautta 4.1

7. Oliot ja viitteet 7.1

Haskell ohjelmointikielen tyyppijärjestelmä

Luento 4 Aliohjelmien toteutus

12. Monimuotoisuus 12.1

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Javalla

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

1. Olio-ohjelmointi 1.1

Osoittimet ja taulukot

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

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

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

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

ITKP102 Ohjelmointi 1 (6 op)

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

Java-kielen perusteet

Tutoriaaliläsnäoloista

Operaattorin ylikuormitus ja käyttäjän muunnokset

Osoitin ja viittaus C++:ssa

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin jatkokurssi, kurssikoe

Loppukurssin järjestelyt C:n edistyneet piirteet

Jakso 4 Aliohjelmien toteutus

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

Virtuaalifunktiot ja polymorfismi

C# olio-ohjelmointi perusopas

Ohjelmointi 2 / 2010 Välikoe / 26.3

Delegaatit ja tapahtumakäsittelijät

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit

Tieto- ja tallennusrakenteet

Rakenteiset tietotyypit Moniulotteiset taulukot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

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

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Ohjelmoinnin perusteet Y Python

Tietueet. Tietueiden määrittely

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

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

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

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

Loppukurssin järjestelyt

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

Transkriptio:

Ohjelmointikieli TIE-20306 Principles of Programming Languages Syksy 2017 Ryhmä 19 Juho Kärnä Ville Mäntysaari

1. Johdanto D on yleiskäyttöinen, strukturoitu, staattisesti tyypitetty, käännettävä ohjelmointikieli järjestelmien ja sovellusten koodaamiseen. D tukee imperatiivista ja jossain määrin funktionaalista ohjelmointiparadigmaa sekä olio- ja rinnakkaista ohjelmointia. Kielessä on C:n kaltainen syntaksi, ja kieli onkin suunniteltu sillä periaatteella, että saman näköinen koodi tekee saman asian C:ssä ja D:ssä. Siirtyminen C:n kaltaisista kielistä on näin tarkoitus tehdä mahdollisimman helpoksi. D:n tavoitteena on olla tehokas, kuten C:nkin, mutta tarjota silti mahdollisimman paljon tulkattavien kielten helppokäyttöisyyttä. D:ssä onkin useita käyttöä helpottavia ominaisuuksia, kuten automaattinen tyyppien päättely ja roskienkeruu. Helppokäyttöisyyden ja tehokkuuden lisäksi D:n yksi tärkeimmistä suunnitteluperiaatteista on turvallisuus. 2. Tyypit D on staattisesti tyypitetty kieli. Muuttujan tyypiksi voidaan kuitenkin antaa auto, jolloin kääntäjä päättelee muuttujan tyypin. Kielen perustyypit ovat aina samankokoisia riippumatta järjestelmästä, paitsi real, joka on niin suuri kuin mahdollista kyseisellä järjestelmällä. D ei ole vahvasti tyypitetty kieli. Implisiittinen tyyppimuunnos tyyppien välillä on sallittu, mikäli muuttujan arvon tarkkuus ei kärsi (liukulukujen välillä muunnos on sallittu myös arvojen tarkkuuden kärsiessä). Myös eksplisiittinen tyyppimuunnos on sallittu. D kielessä käytetään arvosemantiikkaa käsiteltäessä perustyypin muuttujia ja viitesemantiikkaa käsiteltäessä olioita. Jos halutaan antaa perustyypin muuttuja funktiolle viiteparametriksi, täytyy käyttää funktion määrittelyssä parametrin yhteydessä ref avainsanaa. Kielessä on käytössä osoittimia. D sisältää myös immutable- avainsanan, jota seuraava muuttuja voidaan asettaa vain kerran. Kielessä on myös avainsana const, joka on paikallinen määre. Esimerkiksi funktio voi luvata olla muuttamatta parametreja avainsanalla const. Const-parametreiksi voidaan antaa immutable muuttujia. D tukee sekä tietyn mittaisia tauluja, jotka tallennetaan stackkiin, ja dynaamisesti kasvavia tauluja, jotka menevät heappiin. Kielessä taulut ja myös hajautustaulut määritellään hakasulkuoperaattoreilla. Dynaaminen taulu varataan avainsanalla new. Alla esimerkki taulujen syntaksista ja staattisen ja dynaamisen taulun varaamisesta.

int [ 10 ] array; // Staattinen taulu int [] array = new int [ 10 ]; // Dynaaminen taulu int [string] hashmap; // Hajautustaulu D:ssä on sisäänrakennettuna tauluoperaatioita: Kaksia taulua voidaan lisätä yhteen alkioittain, ja taulu voidaan kertoa tai jakaa luvulla operaattoreilla *= ja %=. Merkkijonot ovat D:ssä aina Unicodea. Ne ovat määritelty immutable char-tauluina. Merkkijonot voivat olla useita riviä pitkiä. Niitä voidaan yhdistää operaattorilla ~. Lainausmerkkejä sisältäviä merkkijonoja voidaan määritellä sellaisenaan kahdella eri syntaksilla: (`merkkijono`) tai ( r merkkijono ). Alla on esimerkkikoodi. string s1 = `tämä on "testi"` ; // Merkkijono: tämä on testi string s2 = r "tämä on `testi`" ; // Merkkijono: tämä on `testi` writeln( s1 ~ s2); // Merkkijono: tämä on testi tämä on `testi` 3. Kontrollirakenteet D kielessä on samankaltaiset kontrollirakenteet kuin monissa muissa imperatiivisissa ohjelmointikielissä kuten funktiokutsut, for ja while silmukat, if-else-then rakenteet, goto rakenne ja switch-case rakenne. Lisäksi D kielessä on foreach- silmukka, jossa silmukkamuuttuja käy järjestyksessä läpi sekventiaalista rakennetta, kuten taulukkoa tai range-rakennetta. 4. Olio-ohjelmointi D kieli tukee olio-ohjelmointia. Luokka voi olla periytetty korkeintaan yhdestä luokasta ja interface- rakenne toimii abstraktina luokkana (abstraktissa luokassa vain esitellään metodit, jotka pitää toteuttaa siitä periytetyissä luokissa) ja se voidaan periyttää usealle luokalle. Kun luokassa ylikuormitetaan kantaluokan metodia, täytyy käyttää avainsanaa override metodin määrittelyssä. 5. Funktionaalinen ohjelmointi Vaikka D onkin pääosin imperatiivinen ohjelmointikieli, se sisältää mahdollisuuden tiettyihin funktionaalisen paradigman toimintoihin. Kielessä on esimerkiksi mahdollista määritellä sisäkkäisiä funktioita.

D sisältää avainsanan pure, joka määrittelee funktion puhtaaksi. Puhtaat funktiot eivät pääse käsiksi ohjelman tilaan ja palauttavat aina saman paluuarvon samoilla parametreilla. D:ssä on käsite vahvasti puhdas funktio, joka vastaa yleistä käsitystä funktionaalisen ohjelmoinnin puhtaasta funktiosta: funktio ottaa vain arvolla välitettyjä parametreja, eikä siten vaikuta funktion ulkopuoliseen tilaan. D:ssä on kuitenkin käytännön syistä mahdollista määritellä myös pure -avainsanalla määritellylle funktiolle viiteparametreja. Funktio voi muokata kyseisiä viiteparametreja, mutta ei tietenkään pääse ohjelman ulkopuoliseen tilaan käsiksi. Tällaista funktiota kutsutaan D:ssä heikosti puhtaaksi funktioksi. Kielessä on myös mahdollista antaa funktiolle parametrina funktioita. Avainsana function parametrina vaatii globaalin funktion. D:ssä on myös käsite delegate. Delegatet ovat pointtereita funktioon, jossa on mukana ylimääräistä tietoa funktion kontekstista. Funktioita ja delegateja ei voi sekoittaa keskenään, mutta globaali funktioreferenssi on mahdollista muuttaa delegaatiksi. D:ssä on mahdollista myös määritellä anonyymejä funktioita, sekä lyhyemmällä syntaksilla lambda-funktioita. Alla on esitelty D:n funktioiden syntaksia. // Anonyymi funktio auto f = ( int a, int b) { return a + b; }; // Lambda-funktio, kääntäjä muuntaa yllä olevaa koodia vastaavaksi. Muuttujien // f ja g tyyppi on delegate auto g = ( int a, int b) => a + b; // Funktio, joka ottaa lokaalin funktion parametrina int dotwice( int a, int delegate ( int ) f ) { return f(f(a)); }; Vaikkakaan laiska suoritus ei ole täysin funktionaalinen piirre, se esiintyy yleensä funktionaalisissa kielissä. D tukee laiskaa suoritusta anonyymien funktioiden muodossa. D:ssä jokainen lauseke voidaan implisiittisesti muuttaa delegateksi, joka palauttaa joko void tai lausekkeen tyypin. Funktiossa voidaan käyttää parametrin edessä avainsanaa lazy, joka korvaa eksplisiittisen delegate-määritelmän. Alla on esitelty D:n laiskasuoritusominaisuutta.

auto loggingenabled = false ; void log( lazy char [] delegate ) { if (loggingenabled) { writeln( delegate() ); } } void main() { // Tätä merkkijonoa ei koskaan rakenneta, sillä funktioon parametrina // annettavaa ( implisiittisesti muutettua ) delegatea ei koskaan kutsuta, log( "Log test." ); } 6. Rinnakkainen ohjelmointi D kieli tarjoaa rakenteita rinnakkaiseen ohjelmointiin. Jaettu data ja sen päivittäminen rinnakkaisten säikeiden välillä aiheuttaa suuren osan rinnakkaisen ohjelmoinnin ongelmista. D kielessä suositellaan käytettävän immutable muuttujia ja viestejä säikeiden välisiin kommunikointiin. Immutable muuttujia voidaan jakaa säikeiden kesken ilman synkronointia. Säikeiden välillä voidaan myös jakaa muuttuvaa dataa (joka on merkitty avainsanalla shared ) ja käyttää mm. mutex-lukkoja samanaikasen datan lukemisen ja päivittämisen välttämiseksi. 7. Kielen erikoisuuksia D:n ytimen muodostaa muistiturvallisten operaatioiden joukko SafeD. SafeD:n idea on tehdä ohjelmoinnista turvallisempaa, sillä muistin manuaalinen käsitteleminen on yksi virheherkimmistä ohjelmoinnin alueista. Muistia voi varata operaatiolla new, mutta pointteriaritmetiikka ja tarkastamattomat castit eivät ole sallittuja. Roskien keruu hoitaa varatun muistin vapauttamisen. Varaamattomaan tai jo vapautettuun muistiin ei pääse käsiksi. Tauluissa ja merkkijonoissa on indeksitarkastelut. SafeD:hen kuuluvat funktiot ovat merkitty @safe-annotaatiolla. Omia funktioita voi myös merkitä samalla tavalla, jolloin kääntäjä tarkastaa että funktio tekee vain sallittuja operaatioita. Jos funktio tekee kiellettyjä operaatioita, niin kuin joskus on tarpeellista tehdä, mutta käyttäjä uskoo tietävänsä mitä hän tekee, voidaan funktio merkitä @trusted-annotaatiolla. Safe-merkittyjen funktioiden sisältä voi kutsua vain @safe ja @trusted merkittyjä funktioita. Kaikki muut funktiot ovat oletuksena @system funktioita, joilla ei ole mitään rajoituksia. Yksi D:n tärkeimmistä ominaisuuksista on Uniform Function Call Syntax (UFCS). UFCS tarkoittaa, että mitä tahansa globaalia funktiota voidaan kutsua kuin jäsenfunktiota. Argumentittomasta funktiosta voi myös jättää aaltosulut pois. Tämä

mahdollistaa monimutkaistenkin funktioketjujen kirjoittamisen siten, että koodi on silti selkeää. D:ssä on myös mahdollista piilottaa tai jopa lisätä jälkeenpäin gettereiden ja settereiden toteutus, sillä luokassa @property-annotaatiolla merkittyjä funktioita voidaan käyttää suoraan kuin kenttiä. Alla on esitelty UFCS:sää. // f ja g on määriteltyjä globaaleja funktioita jotka ottavat yhden kokonaisluvun parametrina ja palauttavat kokonaisluvun. int a = 3 ; // Nämä kaikki tekevät saman asian. Viimeinen tapa on siitä vaarallinen, että // f:ää ja g:tä ei tunnista suoraan funktioksi. int b = f(g(a)); int c = a.f().g(); int d = a.f.g; class Test { int number = 0 ; int timesset = 0 ; int timesget = 0 ; @property int number(){ timesget++; return this.number; } @property void number( int value ){ timesset++; this.number = value; } } Test olio = new Test(); olio.number = 5 ; // Tämä on sallittua. Nyt olion timesset on 1. D kielessä on sisäänrakennettu mahdollisuus yksikkötestaukselle. Yksikkötestejä voi kirjoitaa unittest koodiblokin sisään, joissa assert komennolla voi testata toiminnallisuutta. Kielessä on myös rakenteita sopimussuunnittelun toteutumisen tarkistamiseksi.

Lähteet 1. Yleistieto - https://dlang.org/ 2. Logo - http://www.sukimashita.com/d/