Oppimateriaalin copyright © 2007 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.
(Muutettu viimeksi 24.1.2007)

Matala ja syvä sidonta

Matala ja syvä sidonta (shallow and deep binding) liittyvät aliohjelmien välittämiseen parametreina tai yleisemmin aliohjelmaviitteisiin - esimerkiksi muuttuja voisi olla tyypiltään aliohjelma ja muuttujan arvona voisi olla milloin mikin sopivan tyyppinen aliohjelma.

Kysymys on siitä, miten todellinen, viitattu aliohjelma liitetään omaan viittausympäristöönsä, missä näkyvyysalueessa aliohjelma on.

Tarkastellaan seuraavaa esimerkkiä. (Pyrin kirjoittamaan yksityiskohdat hieman "javamaisesti" (tai "ceemäisesti"), mutta Javasta poiketen tässä metodi voi sisältää metodeita ja oletusnäkyvyys on "sisältä ulos" Algolin ja Pascalin tapaan.)

program Esimerkki {

  procedure A(i:int; P():procedure) {

     procedure B() {  // A:n sisäinen aliohjelma
       print(i);   // tämän i:n merkitys on se kiinnostava kohta
     }

     // A:n algoritmi (so. A:n "pääohjelma")
     if (i > 1)
       P();      // muodollisen proseduuriparametrin kutsu!
     else
       A(2, B);  // B annetaan todellisena parametrina rekursiivisessa kutsussa
  }  // A:n määrittely päättyy

  procedure C() {
    // C on tyhjä proseduuri, A:n kanssa rinnakkainen
  }

  // pääohjelma
  A(1, C); // C annetaan todellisena parametrina
}

Tässä esimerkissä kyse on siitä, mihin A:n muodollisen parametrin i versioon B:ssä viitataan, kun A on kutsunut itseään rekursiivisesti. A:sta on kaksi aktivointia, jotka molemmat ovat määritelleet i:n, ja siis molemmilla on oma i.

Syvässä sidonnassa (deep binding) käytetään A:n ensimmäisen aktivoinnin i:tä, matalassa sidonnassa (shallow binding) viimeisimmän aktivoinnin i:tä.

Katso myös toisten harjoitusten tehtävää 12!

Tämä saattaa näyttää äärimmäisen keinotekoiselta ongelmalta, mutta valinta on erityisesti funktionaalisten kielten kohdalla mitä merkittävin päätös!


Takaisin sisältösivulle.