偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

簡(jiǎn)介Python虛擬機(jī)中的Python運(yùn)行環(huán)境

開(kāi)發(fā) 后端
當(dāng)進(jìn)行Python語(yǔ)言啟動(dòng)后,首先會(huì)碰到Python運(yùn)行環(huán)境的初始化問(wèn)題,注意:這里的運(yùn)行時(shí)環(huán)境是與之前的運(yùn)行環(huán)境不一樣的環(huán)境。

其實(shí)Python運(yùn)行環(huán)境是一個(gè)全局性的概念,而執(zhí)行環(huán)境實(shí)際就是一個(gè)棧幀,是Code Block對(duì)應(yīng)的概念,兩者之間存在著本質(zhì)上的區(qū)別,在以后的運(yùn)行操作過(guò)程中就可以了解到他們呢兩者之間的不同。

運(yùn)行時(shí)環(huán)境的初始化過(guò)程非常地復(fù)雜,后面將用單獨(dú)的一章來(lái)剖析,這里假設(shè)初始化的動(dòng)作已經(jīng)完成,我們已經(jīng)站在了Python虛擬機(jī)的門(mén)檻外,只需要輕輕推動(dòng)一下***張骨牌,整個(gè)執(zhí)行過(guò)程就像多米諾骨牌一樣,一環(huán)扣一環(huán)地展開(kāi)。

這個(gè)推動(dòng)***張骨牌的地方在一個(gè)名叫PyEval_EvalFramEx的函數(shù)中,這個(gè)函數(shù)實(shí)際上就是Python的虛擬機(jī)的具體實(shí)現(xiàn),它是一個(gè)非常巨大的函數(shù),因此我們?cè)诹谐銎渲械脑创a時(shí)和以前有些不同。

PyEval_EvalFrameEx首先會(huì)初始化一些變量,其中PyFrameObject對(duì)象中的PyCodeObject對(duì)象包含的重要信息都被照顧到了。當(dāng)然,另一個(gè)重要的動(dòng)作就是初始化了堆棧的棧頂指針,使其指向f->f_stacktop:

  1. [PyEval_EvalFrameEx in ceval.c]      
  2.  
  3.     co = f->f_code;  
  4.  
  5.     names = co->co_names;  
  6.  
  7.     coconsts = co->co_consts;  
  8.  
  9.     ffastlocals = f->f_localsplus;  
  10.  
  11.     ffreevars = f->f_localsplus + co->co_nlocals;  
  12.  
  13.     first_instr = (unsigned char*)PyString_AS_STRING(co->co_code);  
  14.  
  15.     next_instr = first_instr + f->f_lasti + 1;  
  16.  
  17.     stack_pointer = f->f_stacktop;  
  18.  
  19.     f->f_stacktop = NULL;   /* remains NULL unless yield suspends frame */  

前面我們說(shuō)過(guò),在PyCodeObject對(duì)象的co_code域中保存著字節(jié)碼指令和字節(jié)碼指令的參數(shù),Python虛擬機(jī)執(zhí)行字節(jié)碼指令序列的過(guò)程就是從頭到尾遍歷整個(gè)co_code、依次執(zhí)行字節(jié)碼指令的過(guò)程。

Python運(yùn)行環(huán)境的虛擬機(jī)中,利用3個(gè)變量來(lái)完成整個(gè)遍歷過(guò)程。co_code實(shí)際上是一個(gè)PyStringObject對(duì)象,而其中的字符數(shù)組才是真正有意義的東西。這也就是說(shuō),整個(gè)字節(jié)碼指令序列實(shí)際上就是一個(gè)在C中普普通通的字符數(shù)組。因此,遍歷過(guò)程中所使用的這3個(gè)變量都是char*類(lèi)型的變量:first_instr永遠(yuǎn)指向字節(jié)碼指令序列的開(kāi)始位置;

next_instr永遠(yuǎn)指向下一條待執(zhí)行的字節(jié)碼指令的位置;f_lasti指向上一條已經(jīng)執(zhí)行過(guò)的字節(jié)碼指令的位置。展示了這3個(gè)變量在遍歷中某時(shí)刻的情形:

  1. [ceval.c]  
  2.  
  3. /* Interpreter main loop */  
  4.  
  5. PyObject* PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)  
  6.  
  7. {  
  8.  
  9.     ……  
  10.  
  11.     why = WHY_NOT;  
  12.  
  13.     ……  
  14.  
  15.     for (;;) {  
  16.  
  17.     ……  
  18.  
  19.     fast_next_opcode:  
  20.  
  21.         f->f_lasti = INSTR_OFFSET();  
  22.  
  23.         //獲得字節(jié)碼指令  
  24.  
  25.         opcode = NEXTOP();  
  26.  
  27.         oparg = 0;  
  28.  
  29.         //如果指令需要參數(shù),獲得指令參數(shù)  
  30.  
  31.         if (HAS_ARG(opcode))  
  32.  
  33.             oparg = NEXTARG();  
  34.  
  35.    dispatch_opcode:  
  36.  
  37.         switch (opcode) {  
  38.  
  39.         case NOP:  
  40.  
  41.             goto fast_next_opcode;  
  42.  
  43.         case LOAD_FAST:  
  44.  
  45.             ……  
  46.  
  47.         }  
  48.  
  49. }  

那么這個(gè)一步一步的動(dòng)作是如何完成的呢,我們來(lái)看一看Python運(yùn)行環(huán)境執(zhí)行字節(jié)碼指令的整體架構(gòu),其實(shí)就是一個(gè)for循環(huán)加上一個(gè)巨大的switch/case結(jié)構(gòu),熟悉Windows SDK編程的朋友可以想象一下Windows下那個(gè)巨大的消息循環(huán),就是那樣的結(jié)構(gòu)。在對(duì)PyCodeObject對(duì)象的分析中我們說(shuō)過(guò),Python的字節(jié)碼有的是帶參數(shù)的,有的是沒(méi)有參數(shù)的,而判斷是否帶參字節(jié)碼是通過(guò)HAS_ARG這個(gè)宏實(shí)現(xiàn)的。

注意,對(duì)不同的字節(jié)碼指令,由于存在是否需要指令參數(shù)的區(qū)別,所以next_instr的位移可能是不同的。但是無(wú)論如何,next_instr總是指向Python下一條要執(zhí)行的字節(jié)碼,這很像x86平臺(tái)上的那個(gè)PC寄存器。

Python在獲得了一條字節(jié)碼指令和其需要的指令參數(shù)后,會(huì)對(duì)字節(jié)碼指令利用switch進(jìn)行判斷,根據(jù)判斷的結(jié)果選擇不同的case語(yǔ)句,每一條字節(jié)碼指令都會(huì)對(duì)應(yīng)一個(gè)case語(yǔ)句。在case語(yǔ)句中,就是Python對(duì)字節(jié)碼指令的實(shí)現(xiàn)。

在成功執(zhí)行完一條字節(jié)碼指令后,Python運(yùn)行環(huán)境的執(zhí)行流程會(huì)跳轉(zhuǎn)到fast_next_opcode處,或者是for循環(huán)處,不管如何,Python接下來(lái)的動(dòng)作都是獲得下一條字節(jié)碼指令和指令參數(shù),完成對(duì)下一條指令的執(zhí)行。如此一條一條地遍歷co_code中包含的所有字節(jié)碼指令,最終完成了對(duì)Python程序的執(zhí)行。

【編輯推薦】

  1. 有關(guān)Python系統(tǒng)文件進(jìn)行介紹指導(dǎo)
  2. 如何正確的使用Python函數(shù)
  3. 對(duì)Python 構(gòu)建工具進(jìn)行詳細(xì)介紹分析
  4. PythonAndroid淺析Python優(yōu)勢(shì)所在
  5. 如何使用Python模塊解析配置文件?
責(zé)任編輯:chenqingxiang 來(lái)源: CSDN
相關(guān)推薦

2015-03-03 09:39:28

Java運(yùn)行環(huán)境Python解釋器

2024-09-30 16:08:43

Python虛擬機(jī)棧幀

2022-07-04 12:26:00

云原生開(kāi)源

2010-02-26 15:28:15

Python虛擬機(jī)

2021-07-30 20:25:04

pipxPython編程語(yǔ)言

2023-03-06 10:03:05

Java運(yùn)行機(jī)制

2013-06-17 10:16:53

虛擬機(jī)虛擬化安全

2010-02-24 10:39:28

Python虛擬機(jī)

2022-05-04 11:07:32

虛擬機(jī)Linux

2014-11-27 15:08:05

虛擬化動(dòng)態(tài)遷移

2011-12-12 09:08:48

OpenStack虛擬機(jī)監(jiān)控

2010-03-01 10:52:25

VMware ESX ESX快照

2021-07-31 12:58:53

PodmanLinux虛擬機(jī)

2010-06-11 14:50:48

虛擬機(jī)安裝openSU

2019-07-05 15:14:34

虛擬機(jī)WindowsWindows 10

2012-05-18 10:22:23

2009-08-18 10:48:33

2020-10-21 08:16:37

Java基礎(chǔ)入門(mén)篇

2020-01-17 10:52:37

無(wú)服務(wù)器容器技術(shù)

2017-10-16 14:42:20

VMware虛擬機(jī)ESXi
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)