Helsingin yliopisto / tietojenkäsittelytieteen osasto / Ohjelmointikielten periaatteet / © Arto Wikla 2019

Ohjelmointikielten periaatteet: 2. harjoitukset 14.11.

Muutettu viimeksi 13.11.2019. Sivu luotu 6.11.2019.

Vastaajan arvonta —>

    1. (kurssikirjan tehtävä 5.8.1)
      Using some pseudo-language, write a fragment of code such that the maximum number of activation records present on the stack at runtime is not statically determinable.

    2. (kurssikirjan tehtävä 5.8.2)
      In some pseudo-language, write a recursive function such that the maximum number of activation records present at runtime on the stack is statically determinable. Can this example be generalised?

  1. (kurssikirjan tehtävä 5.8.4)
    Consider the following program fragment written in a pseudo-language using static scope:
       void P1 {
         void P2 { body-ofi-P2
                 }
         void P3 {
                  void P4 { body-of-P4
                          }
                  body-of-P3
                 }
         body-of-P1
         }
    
    Draw the activation record stack region that occurs between the static and dynamic chain pointers when the following sequence of calls, P1, P2, P3,P4,P2 has been made (is it understood that at this time they are all active: none has returned).

  2. (kurssikirjan tehtävä 5.8.6)
    Is it easier to implement the static scope rule or the one for dynamic scope? Give your reasons.

  3. Luennolla simuloitiin seuraavan staattisen näkyvyyden omaavan ohjelman aktivaatiotietuepinon elinkaari:
      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 
    
    Simuloi se myös itse. Riittää esittää tietueiden muuttujat sekä niiden staattiset ja dynaamiset linkit. [Tämä kannattaa osata tehdä!]

  4. Luentomateriaalissa esitellään laatimani yksinkertainen rekursiivisesti etenevään jäsentäjään perustuva kääntäjä, joka saa syötteenä infix-lausekkeen ja kääntää sen postifix-lausekkeeksi. Kieli on hyvin yksinkertainen:
       Lauseke ::= Yhtlaskettava | Yhtlaskettava + Yhtlaskettava
       Yhtlaskettava ::= Kerrottava | Kerrottava * Kerrottava
       Kerrottava ::= 0|1|2|3|4|5|6|7|8|9 | (Lauseke)
    
    Tuon kääntäjän semantiikka on siis vain infix-lausekkeen kääntäminen postifix-lausekkeeksi. Muokkaa tämä "ohjelmointikielen toteutus" sellaiseksi, että se laskee ja tulostaa syötetyn infix-lausekkeen arvon. Toteutus kahdella tavalla:

    1. Täydennä kääntäjä tulkilla, joka käännetyn postfix-lausekkeen ohjaamana laskee lausekkeen arvon pinossa.
    2. Muokkaa kääntäjän semantiikkaa siten, että jo jäsennyksen aikana postfix-lausekkeen generoinnin sijaan lasketaan lausekkeen arvoa suoraan pinossa.

    Vihje: Jos et jo osaa Scalaa, opettele se AW:n vanhasta kurssimateriaalista. Scala on kiva kieli! ;-)

  5. Vertaile Javan ja Pythonin ratkaisuja seuraavissa teknisissä ratkaisuissa:
    1. lohkorakenne ja tunnusten näkyvyys
    2. sidonta, mikä dynaamista, mikä staattista
    3. suorituksen kontrollin ohjaus : valinta, toisto, rekursio, ...