Tag: CPython

  • Python 底層運作 02 – PyTokenizer_Get 分析

    當 Python 在讀入程式碼的時候, 第一步就是對程式碼 lexing,將程式碼拆解成 token,標記出每個元素的分類為何。 以下面的程式碼為例: bar = 12345 我們透過 tokenize module 來分析,會變成: $ ./python -m tokenize tests.py 0,0-0,0: ENCODING ‘utf-8’ 1,0-1,3: NAME ‘foo’ 1,4-1,5: OP ‘=’ 1,6-1,11: NUMBER ‘12345’ 1,11-1,12: NEWLINE ‘\n’ 2,0-2,1: NL ‘\n’ 3,0-3,1: NL ‘\n’ 4,0-4,0: ENDMARKER ” 我們可以看到 foo 被標記為 NAME,= 標記為 OP (operator),12345 則被標記為 NUMBER。 在 CPython 中,負責將程式碼標記成 token 的程式碼是 PyTokenizer_Get ,位於 Parser/tokenizer.c。PyTokenizer_Get…

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

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

    你可曾想過這段 Python 程式碼是如何運作的? >>> a = 5 >>> b = 10 >>> c = a * b >>> c 50 Python 作為 interpreted language,其運作可以分為兩個大項,Compiler 以及 Virtual Machine。Compiler 負責將輸入的語法做分析,轉換成 AST (Abstract Syntax Tree),再轉換成 CFG,最後依照 CFG 輸出 bytecode,Code Object 等必要的物件。Virtual Machine 則根據 bytecode 來運行,最後輸出程式運行的結果。 我們可以透過 Python 的 dis 模組,來得知程式碼的 Byte Code 是什麼: ➜ cpython git:(master) ✗ cat tests.py a…