Oppimateriaalin copyright © 2011 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 9.3.2011)

"Ilosanoma litteiden kielten uhreille"

C-kieli ja sen perilliset (C++, Java, ...) hylkäsivät aikanaan jo Algol 60 -kielen esittelemän "syvärakenteen": aliohjelma voi sisältää aliohjelmia, jotka voivat sisältää aliohjelmia, jne. Aliohjelma näkee ympäröivän aliohjelman tunnukset, ellei se itse anna tunnuksille uusia merkityksiä. Toisaalta ulkopuolelta ei näy minkään aliohjelman sisään.

C:ssä (ja Javassa yms.) kaikki "funktiot" sijaitsevat samalla tasolla; kielen aliohjelmarakenne on litteä.

Jo Algol 60 salli ja toteutti aliohjelmien ja lohkojen sisäkkäiset nimiavaruudet. Sittemmin monet Algol-Pascal-linjan kielet jatkoivat käytäntöä.

Esimerkiksi Scalalla voidaan ohjelmoida seuraavaan tyyliin:

def swappauttelua(a:Int, b:Int) = {
  var x = a
  var y = b
  def swap() {
    val apu = x
    x = y
    y = apu
  }
  println(x + " " + y)
  swap()
  println(x + " " + y)
}

swappauttelua(1,2)

On siis mahdollista ohjelmoida paikallisia työkaluja, jotka pääsevät käsiksi ympäröivään nimiavaruuteen. (Samanlainen näkyvyystekniikka on muuten Javassakin sisäluokkien sisäkkäisyydessä.)

Vastaava "sisältä ulos" -näkyvyys toteutuu myös nimeämättömissä sisäkkäisissa lohkoissa (vrt. Javaan & co., jotka sallivat sisäkkäiset lohkot, mutta vaativat silti metodin sisällä nimien yksikäsitteisyyttä):

var i=1; var j=2; var k=3;
println(i + " " + j + " " + k)

  {var i=10; var j=20;      // uudelleenmääritellään i ja j
   println(i + " " + j + " " + k)

       {var i=100               // uudelleenmääritellään i
        println(i + " " + j + " " + k)
       }

   println(i + " " + j + " " + k)
  }

println(i + " " + j + " " + k)

Tulostus:
1 2 3
10 20 3
100 20 3
10 20 3
1 2 3



Takaisin sisältösivulle.