Python 解釋器和三種棧

源代碼就是程序員寫的人類能夠看懂的代碼。我們編寫的程序文件的執(zhí)行需要兩步:1强缘、編譯器將源碼編譯成二進(jìn)制文件,文件里是字節(jié)碼指令,字節(jié)碼會存儲在 PyCodeObject 對象中抛蚤;2、虛擬機(jī)運(yùn)行二進(jìn)制文件寻狂,在運(yùn)行時虛擬機(jī)會創(chuàng)建字節(jié)碼執(zhí)行的上下文環(huán)境岁经,也就是下文提到的各種棧,使用 PyFrameObject 表示運(yùn)行時的 “調(diào)用椛呷” 缀壤。Python 中這兩步是合在一起的樊拓,由 Python 解釋器完成。實(shí)際上 Python 解釋器由編譯器和虛擬機(jī)組成诉位,將源文件編譯為二進(jìn)制文件這步由編譯器完成骑脱,運(yùn)行二進(jìn)制文件這步由虛擬機(jī)來完成的,運(yùn)行完成后可以看到二進(jìn)制文件苍糠。Java 中這兩步是分開的叁丧,先編譯成二進(jìn)制文件,再由 JVM(Java 虛擬機(jī))執(zhí)行岳瞭。其實(shí)二者流程差不多拥娄,側(cè)重不同。
Python 文件在運(yùn)行之后會在同一個目錄中出現(xiàn) .pyc 文件瞳筏,這是上面提到的緩存二進(jìn)制文件稚瘾,它有助于提高文件再次運(yùn)行的效率,緩存文件通常保存在 __pycache__ 目錄下姚炕,緩存文件中的數(shù)據(jù)就是只有機(jī)器能夠識別的字節(jié)碼摊欠,使用編輯器打開文件我們也看不懂。
Python 與大多數(shù)解釋型語言一樣柱宦,解釋器在運(yùn)行程序時首先將源代碼編譯為一組虛擬機(jī)指令些椒,并且 Python 解釋器是針對相應(yīng)的虛擬機(jī)實(shí)現(xiàn)的。這種中間格式的虛擬機(jī)指令被稱為 “字節(jié)碼” 掸刊,也就是說 .pyc 這個二進(jìn)制文件中存儲的是字節(jié)碼指令免糕,這些指令只有對應(yīng)的 Python 虛擬機(jī)可以運(yùn)行。Python 被稱為解釋型語言忧侧,其中一個原因是如上所述的程序運(yùn)行時源代碼被轉(zhuǎn)換成字節(jié)碼指令石窑。

最常用的 Python 解釋器是 CPython ,我們說 "Python 解釋器" 時默認(rèn)就是指 CPython 蚓炬,它使用三種類型的棧:
調(diào)用棧 call stack 松逊、數(shù)據(jù)棧 data stack 、塊棧 block stack

調(diào)用棧 call stack 是運(yùn)行 Python 程序的主要結(jié)構(gòu)试吁。它為每個當(dāng)前活動的函數(shù)調(diào)用創(chuàng)建一個東西 —— “幀 frame”棺棵,也叫棧幀,調(diào)用棧的棧底是程序的入口點(diǎn)熄捍。每個函數(shù)調(diào)用推送一個新的幀到調(diào)用棧烛恤,每當(dāng)函數(shù)調(diào)用返回后,這個幀被銷毀余耽。
在每個幀中缚柏,有一個數(shù)據(jù)棧 data stack(也稱為計算棧 evaluation stack)。數(shù)據(jù)棧就是 Python 函數(shù)運(yùn)行的地方碟贾,運(yùn)行的 Python 代碼大多數(shù)是由推入到這個棧中的內(nèi)容組成的币喧,解釋器操作它們,然后在函數(shù)返回后銷毀它們干发。
在每個幀中,還有一個塊棧 block stack 史翘。它被 Python 用于跟蹤某些類型的控制結(jié)構(gòu):循環(huán)、try / except 塊以及 with 塊琼讽,將語句塊全部推入到塊棧中必峰,當(dāng)退出這些控制結(jié)構(gòu)時,塊棧被銷毀钻蹬。這將幫助 Python 了解任意給定時刻哪個塊是活動的肝匆,例如 continue 或者 break 語句可能影響塊的運(yùn)行。

In [34]: import dis

In [35]: def hello():
    ...:     print('Hello World')
    ...:

In [36]: dis.dis(hello)
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello World')
              4 CALL_FUNCTION            1
              6 POP_TOP
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滚澜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫁怀,老刑警劉巖设捐,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塘淑,居然都是意外死亡萝招,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門存捺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槐沼,“玉大人,你說我怎么就攤上這事捌治「诠常” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵肖油,是天一觀的道長兼吓。 經(jīng)常有香客問我,道長森枪,這世上最難降的妖魔是什么视搏? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任审孽,我火速辦了婚禮,結(jié)果婚禮上浑娜,老公的妹妹穿的比我還像新娘佑力。我一直安慰自己,他們只是感情好筋遭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布打颤。 她就那樣靜靜地躺著,像睡著了一般宛畦。 火紅的嫁衣襯著肌膚如雪瘸洛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天次和,我揣著相機(jī)與錄音反肋,去河邊找鬼。 笑死踏施,一個胖子當(dāng)著我的面吹牛石蔗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畅形,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼养距,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了日熬?” 一聲冷哼從身側(cè)響起棍厌,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竖席,沒想到半個月后耘纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毕荐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年束析,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憎亚。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡员寇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出第美,到底是詐尸還是另有隱情蝶锋,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布什往,位于F島的核電站牲览,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜第献,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一贡必、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庸毫,春花似錦仔拟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至载佳,卻和暖如春炒事,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔫慧。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工挠乳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姑躲。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓睡扬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黍析。 傳聞我的和親對象是個殘疾皇子卖怜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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