Helsingin yliopisto/Tietojenkäsittelytieteen laitos/Ohjelmointikielten periaatteet/Copyright © 2017 Arto Wikla.

Ohjelmointikielten periaatteet, kurssikoe 20.12.2017/AW

Kirjoita jokaiseen paperiisi kurssin nimi ja kokeen päivämäärä sekä nimesi, opiskelijanumerosi ja allekirjoituksesi.

  1. Vastaa lyhyesti mutta täsmällisesti sekä anna tarpeen vaatiessa konkreettisia pieniä ohjelmaesimerkkejä seuraaviin kysymyksiin (15 pistettä):

    1. Mitä on sidonta ohjelmointikielten viitekehyksessä? Anna esimerkkejä sidonnan eri ajankohdista.

    2. Mikä on sulkeuma? Miten siihen liittyvät käsitteet vapaa ja sidottu muuttuja?

    3. Mitä ovat nimiekvivalenssi, heikko nimiekvivalenssi ja rakenne-ekvivalenssi?

    4. Vertaile keskenään käsitepareja alityyppi-ylityyppi ja aliluokka-yliluokka. Miten Javan interface ja Scalan trait liittyvät asiaan?

    5. Mitä tarkoittavat soveltava järjestys (applicative-order evaluation) ja normaalijärjestys (normal order evaluation)?

  2. Mitä seuraava ohjelma tulostaa? Piirrä aktivaatiotietuepino dynaamisine ja staattisine linkkeineen, muuttujineen ja parametreineen, kun ohjelman suoritus on tähdillä (***) merkityssä kohdassa. Käytössä on staattinen näkyvyys ja arvoparametrivälitys. (10 pistettä)
      int a=1, b=2, c=3, d=4
      def A(int b) {
         int c=5; B(a+b); print a,b,c,d
      }
      def B(int c) { 
         def BB(int d) {
           int a=6;
           // *** //
           print a,b,c,d
         }
         BB(a+c) 
      }
      A(7)  
      print a,b,c,d
    

  3. Mitä seuraava ohjelma tulostaa, kun parametrit välitetään

    1. arvoparametreina
    2. arvo-tulos- eli value-result-parametreina, kun l-arvo evaluoidaan kutsun hetkellä
    3. arvo-tulos- eli value-result-parametreina, kun l-arvo evaluoidaan funktiosta palattaessa
    4. viite- eli muuttujaparametreina
    5. nimiparametreina?
      var i: int;
      taulu: array of int;
      def fun(y: int) {
         i := 2;
         print(y);
         y := 2017;
       }
      taulu[1] := 3;
      taulu[2] := 2;
      i := 1;
      fun(taulu[i]);
      print(taulu[1], taulu[2]);
    
    (10 pistettä)