Tag: CPython

  • Python 底層運作 02 - PyTokenizer_Get 分析

    當 Python 在讀入程式碼的時候, 第一步就是對程式碼 lexing,將程式碼拆解成 token,標記出每個元素的分類為何。 以下面的程式碼為例: [crayon-651844ae772da817013184/] 我們透過 tokenize module 來分析,會變成: [crayon-651844ae772e1138906475/] 我們可以看到 foo 被標記為 NAME,= 標記為 OP (operator),12345 則被標記為 NUMBER。 在 CPython 中,負責將程式碼標記成 token 的程式碼是 PyTokenizer_Get ,位於 Parser/tokenizer.c。PyTokenizer_Get 本身是 tok_get 的一個 wrapper,用來處理 decoding error 的 handling;其回傳值是該 token 的類別,這些類別的值在 Include/token.h 以 macro 的方式被定義出來;p_start 以及 p_end 則是該 token 的起始以及結束位置: [crayon-651844ae772e3739696328/] [crayon-651844ae772e5070570090/] 主要的處理集中在 tok_get 當中,這個 function 的目的是要獲得下一個 token,並且會將空白 strip 掉。 整段 tok_get 的 function code […]

  • Python 底層運作 01 - 虛擬機器與 Byte Code

    Python 底層運作 01 - 虛擬機器與 Byte Code

    你可曾想過這段 Python 程式碼是如何運作的? [crayon-651844ae7776a588329451/] Python 作為 interpreted language,其運作可以分為兩個大項,Compiler 以及 Virtual Machine。Compiler 負責將輸入的語法做分析,轉換成 AST (Abstract Syntax Tree),再轉換成 CFG,最後依照 CFG 輸出 bytecode,Code Object 等必要的物件。Virtual Machine 則根據 bytecode 來運行,最後輸出程式運行的結果。 我們可以透過 Python 的 dis 模組,來得知程式碼的 Byte Code 是什麼: [crayon-651844ae77770552617574/] 詳細的 Byte Code 資訊可以到 32.12 dis - Disassembler for Python bytecode 第一行 a = 5 對應的是 LOAD_CONST 以及 STORE_NAME 這兩個 bytecode,透過 LOAD_CONST 將 const 放置到 stack top,接著 […]