Sharing

2013年6月25日 星期二

Static vs Dynamic Scoping

最近在看 Puppet, 裡面提到 3.0 和 2.7 版的差異
其中有一項是要將 Dynamic Scoping 換成 Static Scoping.
http://docs.puppetlabs.com/guides/scope_and_puppet.html
http://docs.puppetlabs.com/puppet/latest/reference/lang_scope.html
看起來寫的很詳細,但我就是看不懂=.=
只好另外找說明

直接用程式碼說明,最快速
http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/


Static Scoping
從 Definition 找 Scope
const int b = 5;
int foo()
{
   int a = b + 5;
   return a;
}
 
int bar()
{
   int b = 2;
   return foo();
}
 
int main()
{
   foo(); // returns 10
   bar(); // returns 10
   return 0;
}

Dynamic scoping
從 Call Stack 找 Scope
const int b = 5;
int foo()
{
   int a = b + 5;
   return a;
}
 
int bar()
{
   int b = 2;
   return foo();
}
 
int main()
{
   foo(); // returns 10
   bar(); // returns 7
   return 0;
}



稍微學術一點,另外 Lixical Scoping 等同於 Static Scoping
http://c2.com/cgi/wiki?DynamicScoping
http://c2.com/cgi/wiki?LexicalScoping

最完整的說明,也有從不同 Programming Language 來說明
http://en.wikipedia.org/wiki/Scope_(computer_science)

順便複習一下 Python 的 Scoping 原則
LEGB rule (Local, Enclosing, Global, Built-in)


沒有留言: