Regiono (programlingva)

En programlingvoj, **regiono** estas tiu parto de la teksto de komputila programo, kie validas deklaro de nomo (precipe de nomo de loka objekto) kaj kie oni rajtas uzi la nomon laŭ tiu deklaro.

## Videblejo 
La deklaroj konigas nomojn al sia regiono kaj al ties subregionoj (la regionoj povas ingiĝi); oni diras, ke per la nomo oni povas *vidi* ĝian deklaron.

La parto de la teksto de programo, kie deklaro videblas per nomo per ĝi deklarita estas ĝia **videblejo**.

Tamen povas okazi, ke nomo *n* deklarita per deklaro *D*0 en iu regiono *R*0 ricevas alian signifon per nova deklaro *D*1 en ĝia subregiono *R*1. Tiam la nova deklaro *eklipsas* la deklaron *D*0 (por la nomo *n*), kaj en la regiono *R*1 por la nomo *n* validos la deklaro *D*1. Tio signifas, ke la regionon *R*1 necesas «subtrahi» el la videblejo de *D*0, ke tiu videblejo havas truo(j)n.

## Vivdaŭro 
Dum plenumo de programo (dum rultempo) kreiĝas kaj detruiĝas kopioj, aŭ ekzempleroj de la regionoj; iuj objektoj (la «aŭtomataj» lokaj variabloj) kreiĝas kaj detruiĝas kune kun sia ekzemplero de regiono; tial oni ne ĉiam klare distingas la konceptojn de deklara regiono (koncepto traduktempa) disde vivdaŭro de deklaritaj variabloj.

## Kuntekstoj statika kaj dinamika 
La ĉi-supra difino de videblejo (aŭ videblo) uzas la nocion *subregiono*; nu, ekzistas du malsamaj manieroj aranĝi la hierarkion de la regionoj, kaj sekve, du malsamaj aranĝoj de la videblejoj, aŭ *kuntekstoj* por determini, kiu deklaro validas por apero de nomo:

* **Kunteksto statika** (): la subregionoj estas tekstaj partoj de la (difino de) sia superregiono; loka nomo ne validas ekster la teksto de sia regiono.
* **Kunteksto dinamika** (): nomo videblas dum la vivdaŭro de la regiono kie ĝi estas deklarita; la regionoj estas aranĝitaj kiel stakkadroj en la plenumstako, kaj por nomo el la pinta kadro validas la deklaro de tia nomo el plej proksima stakkadro.

Por la «puraj» funkcioj, kiuj manipulas nur siajn parametrojn kaj lokajn variablojn, ne estas diferenco inter la kuntekstoj statika kaj dinamika. La problemo aperas kiam oni uzas nelokajn variablojn
Ekz‑e ni ekzamenu la sekvan programon:

```bash
x=1
function g () { echo $x ; x=2 ; }
function f () { local x=3 ; g ; }
f # ĉu eĥiĝos 1 aŭ 3?
echo $x # ĉu eĥiĝos 1 aŭ 2?
```

La funkcio `g()` eligas kaj revalorizas la variablon `x`, kiu por `g()` estas neloka variablo; t.e. necesas rilatigi ĝin al deklaro el superregiono de `g()`.
* Se la programlingvo, al kiu apartenas ĉi tiu programo, uzas *statikajn kuntekstojn* (kiel pliparto da tradukataj lingvoj) tiam la nomo `x` ene de `g()` estas la malloka `x`. Tiam `g()`, vokite el `f()`, printos la komencan valoron de tiu *malloka* `x`, poste ĝi ĝin revalorizos, kaj tiu nova valoro estos eligita el la lasta linio de la programo. T.e. la programo eligos 1, kaj poste 2. La komencvalorizo `x=3` ene de `f()` tiun eligaĵon neniel influos, ĉar tiu loka `x` estas videbla nek en la regiono malloka, nek ene de `g()`.
* Se la programlingvo uzas la *dinamikajn kuntekstojn* (kiel la pliparto da lingvoj interpretataj, kaj interalie Bash, al kiu fakte apartenas la ekzempla programo), tiam la nomo `x` ene de `g()` rilatos al la *loka variablo* `x` de `f()`, ĉar `g()` *estos vokita* el `f()` kaj tial estas ĝia *subregiono* (en la plenumstako la stakkadro de `g()` situas sur la stakkadro de `f()`). Tial `g()` eligos la lokan variablon `x=3` de `f()` kaj ĝin revalorizos — kio neniel influos la mallokan `x`-on; do, la programo eligos 3 kaj 1.

## Noto 
Kategorio:Programadaj konstruoj
Kategorio:Programlingvaj konceptoj