lexical scoping vs dynamic scoping

lexical scoping翻譯為詞法作用域或靜態(tài)作用域

dynamic scoping翻譯為動(dòng)態(tài)作用域

With lexical scope, a name always refers to its local lexical environment. This is a property of the program text and is made indenpendent of the runtime call stack by the language implementation. Because this matching only requires analysis of the static program text, this type of scoping is also called static scoping. Lexical scoping is standard in all ALGOL-based languages such as Pascal, Modula2 and Ada as well as in modern functional language such as ML and Haskell. It is also used in the C language and its syntactic and semantic relatives, although with different kinds of limitations. Static scoping allows the programmer to reason about object references such as parameters, variables, constants, types, functions, etc. as simple name substitutions. This makes it much easier to make modular code and reason about it, since the local naming structure can be understood in isolation. In contrast, dynamic scope forces the programmer to anticipate all possible dynamic contexts in whihc module's code my be invoked.

With dynamic scope, each identifier has a global stack of bindings. Introducing a local variable with name x pushes a binding onto the global x stack (which may have been empty), which is popped off when the control flow leaves the scope. Evaluating x in any context always yields the top binding. In other words, a global identifier refers to the identifier associated with the most recent envirenment. Note that this cannot be done at compile-time because the binding stack only exists at run-time, which is why this type of scoping is callled dynamic scoping.

它們是編程語(yǔ)言中變量可見(jiàn)性作用域的兩種不同的方式涩蜘。簡(jiǎn)單來(lái)說(shuō)部脚,詞法作用域和你書(shū)寫(xiě)程序時(shí)變量定義的位置有關(guān),而動(dòng)態(tài)作用域和程序執(zhí)行時(shí)的上下文有關(guān)故俐。舉例說(shuō)明:

#!/bin/bash

x=1

function g()

{

echo $x

x=2

}

function f()

{

local x=3

g

}

f

echo $x

執(zhí)行輸出:

[yellia lua]$ ./scope.sh

3

1

由此可見(jiàn)bash采用的動(dòng)態(tài)作用域揉阎。

下面再來(lái)看下lua的

#!/usr/local/bin/lua

x=1

local function g()

print(x)

x=2

end

local function f()

local x=3

g()

end

local function f2()

local x=3

local function g2()

print(x)

x=2

end

g2()

end

f()

print(x)

f2()

print(x)

執(zhí)行的結(jié)果:

[yellia lua]$ ./scope.lua

1

2

3

2

由此可見(jiàn)lua采用的靜態(tài)作用域寝贡,1银酗,2的結(jié)果是因?yàn)間()函數(shù)的定義在f()定義之外堰酿,因此不能訪問(wèn)到x膜毁。當(dāng)g()的函數(shù)定義到f()之內(nèi)時(shí)昭卓,x可以被訪問(wèn)到。

靜態(tài)作用域和first class(第一類值)的特性為實(shí)現(xiàn)閉包提供了支持瘟滨。

再來(lái)看下expect呢候醒,我們發(fā)現(xiàn)expect中的直接報(bào)錯(cuò),為什么呢杂瘸?原來(lái)expect中變量的實(shí)現(xiàn)很簡(jiǎn)單倒淫,根本沒(méi)有全局變量和局部變量的概念,所有的變量只在當(dāng)前命令的執(zhí)行上下文中可見(jiàn)败玉,這也就是為什么proc 定義的函數(shù)不能訪問(wèn)其之外定義變量的原因敌土。

有興趣的還可以看下javascript的實(shí)現(xiàn),它也是支持閉包的語(yǔ)言运翼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末返干,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子血淌,更是在濱河造成了極大的恐慌矩欠,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠夯,死亡現(xiàn)場(chǎng)離奇詭異癌淮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疗疟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門该默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人策彤,你說(shuō)我怎么就攤上這事栓袖∠徽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵裹刮,是天一觀的道長(zhǎng)音榜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捧弃,這世上最難降的妖魔是什么赠叼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮违霞,結(jié)果婚禮上嘴办,老公的妹妹穿的比我還像新娘。我一直安慰自己买鸽,他們只是感情好涧郊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著眼五,像睡著了一般妆艘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上看幼,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天批旺,我揣著相機(jī)與錄音,去河邊找鬼诵姜。 笑死汽煮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棚唆。 我是一名探鬼主播逗物,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瑟俭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起契邀,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摆寄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后坯门,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體微饥,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年古戴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欠橘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡现恼,死狀恐怖肃续,靈堂內(nèi)的尸體忽然破棺而出黍檩,到底是詐尸還是另有隱情,我是刑警寧澤始锚,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布刽酱,位于F島的核電站,受9級(jí)特大地震影響瞧捌,放射性物質(zhì)發(fā)生泄漏棵里。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一姐呐、第九天 我趴在偏房一處隱蔽的房頂上張望殿怜。 院中可真熱鬧,春花似錦曙砂、人聲如沸头谜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乔夯。三九已至,卻和暖如春款侵,著一層夾襖步出監(jiān)牢的瞬間末荐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工新锈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甲脏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓妹笆,卻偏偏與公主長(zhǎng)得像块请,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拳缠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 最近集中寫(xiě)字墩新,看得東西也就自然地多起來(lái)。有以下三點(diǎn)感觸: 1.每每看到多號(hào)重復(fù)的推送(有時(shí)換個(gè)題目)窟坐,換湯不換藥的...
    紅豆hr閱讀 201評(píng)論 0 0
  • 世界是一同一個(gè)地球海渊,卻會(huì)因?yàn)榈赜颍瑫r(shí)間哲鸳,情緒,的不同而不同臣疑。 這篇文章是因睜眼―閉眼―睜眼的過(guò)程中看到的春...
    葉棲閱讀 254評(píng)論 0 0
  • 本文定位于理解和總結(jié)<Effective Java>的所講內(nèi)容,而不是翻譯徙菠,因此不當(dāng)之處讯沈,還請(qǐng)廣大網(wǎng)友指出。 復(fù)雜...
    MrCoding閱讀 2,030評(píng)論 5 14
  • 概覽 Tophat回貼基因組 Cufflinks拼接轉(zhuǎn)錄本 Cuffmerge整合轉(zhuǎn)錄本 Cuffdiff計(jì)算轉(zhuǎn)錄...
    yangmqglobe閱讀 5,273評(píng)論 0 6