Comparative Programming Languages

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Fout bij het aanmaken van de miniatuurafbeelding: Bestand is zoek

Informatie over het examen

Oplossingen van (sommige) examens en oefeningen (zonder enige garanties).

Examenvragen

Januari 2015-01-29

1) Gegeven het volgende programma in IMPLICIT-REFS:

let g = let x = 100
    in prox(y) let r = x
               in begin x := y; r end
in (g 99)
a) Gegeven een initieel leeg environment, hoe ziet de store er uit na het uitvoeren?
b) Wat is de waarde van dit programma na evaluatie?

2) De interpreter voor PROC implementeert static scoping. Beschrijf alle aanpassingen die gedaan moeten worden om dynamic scoping te ondersteunen.

3) Gegeven de continuation-passing interpreter for LETREC. Schrijf de gedetailleerde trace van invocaties van value-of/k voor:

a) (100 - 98) - (60 - 50)
b) let x = 20 in (x - 44)
c) let d = proc (f) proc(x) (f (f x)) in ((d proc(x) (x-1)) 3)

4) Gegeven het volgende CLASSES-programma:

class c1 extends object
    field x
    field y

    method initialize()
        x := 1

    method m1(z)
        y := z

class c2 extends c1
    field y

    method m1(z)
        begin y := 100; super m1(z) end

class c3 extends c2
    field y
    field z

    method m1(x)
        begin super m1(x); y := 1000; z := 2000 end

let o3 = new c3()
in begin send 03 m1(13); o3 end
a) Teken het environment voor de drie invocaties van m1
b) Geef de store na het uitvoeren (vertrekkende van een initieel leeg environment)
c) Het kan gebeuren dat een methode geen toegang heeft tot alle velden in het object. Beschrijf in detail onder welke voorwaarden dit wel zo is.

5) Breid de type checker van CHECKED uit om om te gaan met EXPLICIT-REFS. (Boek pagina 248, oef. 7.10)

Januari 2015-01-24

1) Gegeven het volgende programma in PROC:

let g = proc(x) let y =x 
    in proc(z) (x-(y-z)
in ((g 1) 1)
a) Teken de AST en teken daar de contour diagrams op. 
   Teken vanuit iedere bounded variable een pijl naar zijn declaratie 
b) Vertaal het programma naar LEXADDR waarbij er dus geen variable namen bestaan.

2) Gegeven het volgende programma in IMPLICIT-REFS waarbij we veronderstellen dat het initiële environment leeg is:

let d let f = proc(x) x
      in proc(g) begin f:=g; (f 1) end
in (d (proc(x)2))
a) Geef het resultaat van het programma
b) Geef de store aan het einde van het programma.

3) Gegeven een aantal types, geef een programma dat met inferrence dat type als resultaat geeft (%x is een var-type) bv.

a) (bool->bool) -> (int->int)
b) (%1->%2) -> (%2->int) -> (%1->bool) 
c) %1
d) %1 -> %2

4) Maak devolgende uitbreidingen op CLASSES: (1) fieldvalue obj field-name die de value teruggeeft van gegeven veld van het gegeven object (2) fieldvalue-set obj field-name exp die het gegeven veld van het gegeven object op de value van de gegeven expressie zet. Geef voor elk A) de syntax en B) de aanpassingen aan de interpreter en eventuele helper functies.

5) Iets met THREADS en wat de evaluatie is als er een lang tijdsslot wordt gegeven [idem dito]

September 2014

1) Beschrijf alle veranderingen die moeten worden uitgevoerd aan de proc interpreter, om ervoor te zorgen dat de zero? test beschikbaar is in de initiele environment, ipv hargecodeerd in de syntax van de taal.

2) let a = newref(newref(newref(0))) in

      let f = proc(l)
          begin
            setref(deref(deref(l)),l);
            deref(l)
          end in
      deref((fa))
 a) Als dit programma runt met een lege initiele environment en store, hoe ziet de store er dan uit als de executie gedaan is
 b) Naar wat evalueert het programma

3) Continuation passing interpreter LETREC. Schrijf de invocaties van value-of/k op dat gebeuren tijdens de evaluatie van de volgende expressies (negeer de environment parameter)

a. let x=0 in (1-x)

b. (15 - if zero?0 then 1 else 2)

c. let double = proc (f) proc (x) (f(f x)) in ((double proc(x) (x-1)3)

4) De type checker van CHECKED uitbreiden voor tuples

5) Extend classes met fieldref en fieldset (oefening 9.8 in boek)

Januari 2014

1) Gegeven een programmake:

a) Teken de AST.
b) Teken daar de contour diagrams op.
c) Teken vanuit iedere bounded variable een pijl naar zijn declaratie ofzoiets. (zoals in de slides, einde hoofdstuk 3)
d) Naar wat evalueert het programma?

2) gegeven een programmake in IMPLCIT(hoofdstuk 4):

a) Geef de uiteindelijke staat van de store.
b) Naar wat evalueert het programma?
c) Naar wat zou het evalueren moest het call-by-refence zijn ipv call-by-value?

3) Er zijn 3 stukjes programme gegeven met een "hole" in (hoofdstuk 5)

ze leken op (uit herinnering ...):
a) ((2-3) - [])
b) ([] - (2-3))
c) (let x = 3-1 in ([] x))   [en dus niet (let x = (2-3) in (x-2))]

Slechts 1 van de 3 is mogelijk. Welke en waarom?

4) Gegeven enkele expressies: Geef de unknown types en het type van de gehele expressies zoals INFERENCE (hoofdstuk 7) dat zou doen.

5) Vul CLASSES (hoofdstuk 9) aan met de expressie 'instanceof'(zoals bij Java).

Januari 2014 (25/01)

Zie kopie

1) Gegeven een programma:

a) Wat is het resultaat bij static-scoping
b) Wat is het resultaat bij dynamic-scoping
c) Schrijf een programma dat bij static-scoping de constante 0 functie is en bij dynamic-scoping het dubbel teruggeeft

2) Gegeven een programma:

a) Wat is de inhoud van de store op het einde van het programma
b) Wat is het resultaat van het programma bij call-by-value
c) Wat is het resultaat van het programma bij call-by-reference

3) Gegeven een programma, geef een trace van de value-of/k functie voor de continuation. (Zelfde trace als het scheme programma van de cursus geeft, maar dat enkel voor de value-of/k en niet de apply-cont).

bv.

   (x-5) => value-of/k((1-5), [])
         => value-of/k(1, []-<5>)
         => value-of/k(5, 1-[])
         => -4

maar dan met ingewikkeldere expressie...

4) Gegeven een aantal types, geef een programma dat met inferrence dat type als resultaat geeft (%x is een var-type)

bv.

   a) int
   b) (int -> int) -> (int ->bool)
   c) %1
   d) (%1 -> %2) -> (%2 -> int) -> (%1 -> bool)
   e) %1 -> %2
   f) (%1 -> %2) -> %1

5) Pas de interpreter (CLASSES) aan zodat je een methode kan oproepen op statische manier (met behulp van zijn klassenaam).

Zodat je kan schrijven: call-static <obj> <klassenaam> <methode-naam> <args>

Je moest hierbij de constraint afdwingen dat de klasse van obj dezelfde moest zijn als <klassenaam> of een subklasse.