Regiono (programlingva): Malsamoj inter versioj

[kontrolita revizio][kontrolita revizio]
Enhavo forigita Enhavo aldonita
→‎Vivdaŭro: +kuntekstoj
Linio 9:
 
== Vivdaŭro ==
Dum plenumo de programo (dum [[rultempo]]) kriĝaskreiĝ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 objekto|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''' ({{lang-en|lexical scope, static binding}}): la subregionoj estas tekstaj partoj de la (difino de) sia superregiono; loka nomo ne validas ekster la teksto de sia regiono.
* '''Kunteksto dinamika''' ({{lang-en|dynamic scope, dynamic binding}}): 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 [[loka variablo|lokajn variablojn]], ne estas diferenco inter la kuntekstoj statika kaj dinamika. La problemo aperas kiam oni uzas [[neloka variablo|nelokajn variablojn]]
Ekz‑e ni ekzamenu la sekvan programon:
<syntaxhighlight lang="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?
</syntaxhighlight>
La funkcio <code>g()</code> eligas kaj revalorizas la variablon <code>x</code>, kiu por <code>g()</code> estas [[neloka variablo]]; t.e. necesas rilatigi ĝin al deklaro el superregiono de <code>g()</code>.
* Se la programlingvo, al kiu apartenas ĉi tiu programo, uzas ''statikajn kuntekstojn'' (kiel pliparto da [[tradukata programlingvo|tradukataj lingvoj]]) tiam la nomo <code>x</code> ene de <code>g()</code> estas la malloka <code>x</code>. Tiam <code>g()</code>, vokite el <code>f()</code>, printos la komencan valoron de tiu ''malloka'' <code>x</code>, 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 <code>x=3</code> ene de <code>f()</code> tiun eligaĵon neniel influos, ĉar tiu loka <code>x</code> estas videbla nek en la regiono malloka, nek ene de <code>g()</code>.
* Se la programlingvo uzas la ''dinamikajn kuntekstojn'' (kiel la pliparto da [[interpretata programlingvo|lingvoj interpretataj]], kaj interalie [[Bash]], al kiu fakte apartenas la ekzempla programo), tiam la nomo <code>x</code> ene de <code>g()</code> rilatos al la ''loka variablo'' <code>x</code> de <code>f()</code>, ĉar <code>g()</code> ''estos vokita'' el <code>f()</code> kaj tial estas ĝia ''subregiono'' (en la plenumstako la stakkadro de <code>g()</code> situas sur la stakkadro de <code>f()</code>). Tial <code>g()</code> eligos la lokan variablon <code>x=3</code> de <code>f()</code> kaj ĝin revalorizos — kio neniel influos la mallokan <code>x</code>-on; do, la programo eligos 3 kaj 1.
 
== Noto ==