Helsingin yliopisto / Tietojenkäsittelytieteen osasto / Ohjelmointikielten periaatteet / Arto Wikla.

Ohjelmointikielten periaatteet, kurssikoe 17.12.2019/AW

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

  1. Mikä on sulkeuma? Miten siihen liittyvät käsitteet vapaa ja sidottu muuttuja? Anna pieniä ohjelmaesimerkkejä. (5 pistettä)

  2. Mitä ovat nimiekvivalenssi, heikko nimiekvivalenssi ja rakenne-ekvivalenssi? Millaisia valintoja viimeksi mainittuun liittyy? Anna pieniä ohjelmaesimerkkejä. (5 pistettä)

  3. 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ä)
       var a=6, b=5, c=4, d=3  
    
       function fA(int b) {
          var c=2    
          fB(a+b)   
          print a,b,c,d   
       }  
    
       function fB(int c) {
          function fBB(int d) {
             var a=1  
             // *** //
             print a,b,c,d  
          } 
    
          fBB(a+c) 
          b=666
       }  
    
       fA(49) 
       print a,b,c,d  
    

  4. Merkitään funktioarvoisen funktion tyyppi tyyliin: (funktion_parametrit)->funktion_palautusarvon_tyyppi ja kirjoitetaan funktioliteraali muodossa: (funktion_parametrit)->{funktion_runko}. Tyhjä parametrilista ilmaistaan tyhjin sulkein: ().

    Kielessä on staattiset näkyvyyssäännöt ja funktioarvoiset funktiot ovat sallittuja. Kielen virtuaalikone ylläpitää aktivaatiotietuepinoaan linkitettynä listana.

    Simuloi linkitettynä listana toteutetun aktivaatiotietuepinon käyttäytyminen ja sulkeumien toteutus hylättävien aktivaatiotietueiden avulla. Piirrä näkyviin staattiset, dynaamiset ja sulkeumiin liittyvät linkit sekä myös tietokenttien arvot seuraavan ohjelman suorituksen kohdassa // piirrä //.

       ()->int teeLaskuri() {
          int lkm=0;
          return ()->{lkm=lkm+1; return lkm;}
       }
    
       var a = teeLaskuri();
       var b = teeLaskuri();
    
       a(); a(); b(); a(); // piirrä //
    
    (10 pistettä ja papukaijamerkki)