1. 程式人生 > >python編譯過程和執行原理

python編譯過程和執行原理

一、編譯過程概述

  當我們執行Python程式碼的時候,在Python直譯器用四個過程“拆解”我們的程式碼,最終被CPU執行返回給使用者。

  首先當用戶鍵入程式碼交給Python處理的時候會先進行詞法分析,例如使用者鍵入關鍵字或者當輸入關鍵字有誤時,都會被詞法分析所觸發,不正確的程式碼將不會被執行。

  下一步Python會進行語法分析,例如當"for i in test:"中,test後面的冒號如果被寫為其他符號,程式碼依舊不會被執行。

  下面進入最關鍵的過程,在執行Python前,Python會生成.pyc檔案,這個檔案就是位元組碼,如果我們不小心修改了位元組碼,Python下次重新編譯該程式時會和其上次生成的位元組碼檔案進行比較,如果不匹配則會將被修改過的位元組碼檔案進行覆蓋,以確保每次編譯後位元組碼的準確性。

  那麼什麼是位元組碼?位元組碼在Python虛擬機器程式裡對應的是PyCodeObject物件。.pyc檔案是位元組碼在磁碟上的表現形式。簡單來說就是在編譯程式碼的過程中,首先會將程式碼中的函式、類等物件分類處理,然後生成位元組碼檔案。有了位元組碼檔案,CPU可以直接識別字節碼檔案進行處理,接著Python就可執行了。

二、過程圖解

三、編譯位元組碼

  Python中有一個內建函式compile(),可以將原始檔編譯成codeobject,首先看這個函式的說明:

  compile(...) compile(source, filename, mode[, flags[, dont_inherit]]) -> code object

  引數1:原始檔的內容字串

  引數2:原始檔名稱

  引數3:exec-編譯module,single-編譯一個宣告,eval-編譯一個表示式 一般使用前三個引數就夠了

  使用示例:

12345678910111213#src_file.py#some functiondef f(d=0):c=1print "hello"a=9b=8f()>>> a=open('src_file.py','r').read()   #命令列模式中開啟原始檔進行編譯>>> co=compile(a,'src_file','exec')>>>type(co)<
type 'code'>   #編譯出了codeobject物件

四、codeobject物件的屬性

  codeobject有哪些變數,接上節的內容分析一下:

1234567891011121314151617181920212223>>>print co.co_names   #所有的符號名稱('f','a','b')>>>print co.co_name   #模組名、函式名、類名<module>>>>print co.co_consts   #常量集合、函式f和兩個int常量a,b,d(0, <code object f at 0xb7273b18,file "src_file", line 2>,9,8,None)>>>print co.co_consts[1].co_varnames   #可以看到f函式也是一個codeobject,列印f中的區域性變數('c',)>>>print co.co_code   #位元組碼指令dZdZdZedS>>>print co.co_consts[1].co_firstlineno   #程式碼塊在檔案中的起始行號2>>>print co.co_stacksize   #程式碼棧大小2>>>print co.co_filename   #檔名src_file   #模組名、函式名、類名

  codeobject的co_code代表了位元組碼,這個位元組碼有什麼含義?我們可以使用dis模組進行python的反編譯:

123456789101112131415161718import disdis.dis(co)>>> output2        0 LOAD_CONST              0 (0)3 LOAD_CONST              1 (<codeobject f at 0xb7273b18,file "src_file", line 2>)6 MAKE_FUNCTION           19 STORE_NAME              0 (f)5        12 LOAD_CONST             2 (9)15 STORE_NAME             1 (a)6        18 LOAD_CONST             3 (8)21 STORE_NAME             2 (b)7        24 LOAD_NAME              0 (f)27 CALL_FUNCTION          0

相關推薦

python編譯過程執行原理

一、編譯過程概述  當我們執行Python程式碼的時候,在Python直譯器用四個過程“拆解”我們的程式碼,最終被CPU執行返回給使用者。  首先當用戶鍵入程式碼交給Python處理的時候會先進行詞法分析,例如使用者鍵入關鍵字或者當輸入關鍵字有誤時,都會被詞法分析所觸發,不正確的程式碼將不會被執行。  下一步

GCC 程式的編譯過程連結原理

一、C/C++檔案的編譯過程: 先來看一下gcc的使用方法和常用選項 提示:gcc --help Ⅰ、使用方法: gcc [選項] 檔名

gcc程式的編譯過程連結原理

一、C/C++檔案的編譯過程: 先來看一下gcc的使用方法和常用選項 提示:gcc --help Ⅰ、使用方法: gcc [選項] 檔名 Ⅱ、常用選項: 選項 含義 -v 檢視gcc編譯器的版

gcc 編譯工具(上)--- 編譯過程原理淺析

gcc 編譯工具(上)— 編譯過程和原理淺析 1. 什麼是gcc gcc(GNU C Compiler)編譯器的作者是Richard Stallman,也是GNU專案的奠基者。 gcc是GNU Compiler Collection的縮寫。最初是作為C

Android APP編譯執行原理

在本篇中,主要介紹Android平臺應用程式的執行原理,在閱讀了SDK文件中“Application Fundamentals”一篇的內容後,根據自己的理解繪製了下面的示意圖:       每個應用程式安裝後,系統便會為其分配一個獨立的儲存空間,所謂的“Securi

在Editplus中配置java的(帶包)編譯(javac)執行(java)的方法

會有 post 快捷方式 java程序 技術分享 不能 安裝路徑 一行 提示符 配置的前提是電腦安裝了JDK而且配置好了相關的環境變量(JAVA_HOME,path和classpath)。 配置好後在命令行中輸入javac和java驗證是否配置成功: 假設出現上

ASP.NET MVC下的異步Action的定義執行原理

urn des {0} 不同 exce .class 遠程 是否 了解 Visual Studio提供的Controller創建向導默認為我們創建一個繼承自抽象類Controller的Controller類型,這樣的Controller只能定義同步Action方法。如果我們

u-boot的啟動、編譯過程命令添加

U-BOOTu-boot的啟動、編譯過程和命令添加MCU:s5pv210開發板:unsp210u-boot:1.3.4一、簡介U-Boot是一種支持多架構,多操作系統的Bootloader(啟動引導程序)u-boot目前最新版本是:http://ftp.denx.de/pub/u-boot/二、啟動過程嵌入式

輕松掌握MySQL數據庫存儲過程觸發器原理

drop execute 數據 所有 type ava sql img oracl 1.1 什麽是存儲過程帶有邏輯的SQL語句。有條件判斷,有循環,帶流程控制。客戶端:SQLyog、Navicat1.2 存儲過程的特點優點:執行效率高,因為存儲過程是在數據庫服務端執行的。缺

理解Web應用程式的程式碼結構執行原理(3)

1、理解Web應用程式的執行原理和機制        Web應用程式是基於瀏覽器/伺服器模式(也稱B/S架構)的應用程式,它開發完成後,需要部署到Web伺服器上才能正常執行,與使用者互動的客戶端是網頁瀏覽器。 瀏覽器負責顯示來自伺服器的資料和接受使用者的輸入資料,也

快取-redis 三種模式搭建執行原理

文章目錄 一. redis安裝 1、安裝單機版redis 2. redis 的make test出現異常解決 3. redis的生產環境啟動方案 4. redis cli的使用 二. redi

淺談java編譯型別執行型別

背景:去某五星級酒店面試vi**,面試官拿出一段程式碼然購物寫輸出結果。考察點是:編譯型別和執行型別以及過載和覆蓋 話不多說,程式碼如下: class A{ public void show(A obj){ System.out.println(

Mysql查詢語句執行過程執行原理

Mysql查詢語句執行原理 資料庫查詢語句如何執行? DML語句首先進行語法分析,對使用sql表示的查詢進行語法分析,生成查詢語法分析樹。 語義檢查:檢查sql中所涉及的物件以及是否在資料庫中存在,使用者是否具有操作許可權等 檢視轉換:將語法分析樹轉換成關係代數表示式

python中程序執行

為什麼要用程序和執行緒 多執行緒是程式設計過程中經常會使用到的手段,其目的是為了能提高任務執行的效率,很多時候系統都需要建立多個程序以提高CPU的利用率,當數量較少時,可以手動生成一個個Process例項。當程序數量很多時,或許可以利用迴圈,但是這需要程式設計師手動管理系統

c語言編譯過程標頭檔案<>與""的區別

編譯過程:   預處理--編譯--彙編--連結 預處理:用於將所有#include標頭檔案及#define等巨集定義替換成真正的內容,預處理後的得到的仍然是文字檔案,但體積會大很多。 編譯:將預處理之後的程式轉換成特定彙編程式碼的過程

C#基礎篇之C# .Net框架的概念執行原理

 引言:要使用一樣東西,最起碼得對他有個最基本的瞭解,所以,熟悉一下概念和流程還是非常有必要的,下面一起來看看吧!一、微軟平臺的發展史二、.Net框架包含的東西1、名詞解釋  BCL:基類庫(Base Class Library)系統和底層提供的最基本的類庫  CLR:公共語

理解微信小程式的生命週期執行原理

  寫微信小程式,他的生命週期不能不知道,不知道小程式就會出現各種bug而無法解決。小助君公眾號帶你學習小程式的生命週期和執行原理。 小程式由兩大執行緒組成:負責介面的執行緒(view thread)和服務執行緒(appservice thread),各司其職由互相配合 小程式的生命週期借

gcc 編譯過程編譯優化

編譯過程          從原始碼(xxx.cpp)生成可執行檔案(a.out)一共分為四個階段:     1、預編譯階段:     此時編譯器會處理原始碼中所有的預編譯指令。預編譯指定非常有特點,全部以“#”開頭。     想想,以“#”開頭的命令有哪些?     不同

細談遞迴,備忘錄遞迴,動態規劃,三種演算法思想執行原理

大家都知道,數值稍大的遞迴執行時間對於開發者來說就是場災難,我們總是想方設法在優化遞迴,或者說不用遞迴,此文中從空間時間角度詳細剖析以上三種演算法的區別,以及執行原理,以斐波那契數為例, 程式語言java 此處為程式碼 package test

深入分析JVM中執行緒的建立執行原理 (future)

在JVM中除了應用執行緒,還有其他的一些執行緒用於支援JVM的執行,這些執行緒可以被劃分為以下幾類: VM Thread:負責JVM在安全點內的各種操作,這些操作(諸如自動記憶體管理、取消偏向鎖、執行緒dump、執行緒掛起等等)在執行過程中需要JVM處於這樣一個狀態——堆的內容不會被改變,這種狀態在