python源码剖析新版_Python 源码剖析之基础知识
Python 源碼剖析之基礎知識
為了和《Python 源碼剖析》一書保持一致,本系列筆記分析的源碼是 cpython-2.5.6 。
Python 總體架構
Python 的總體架構可以分成三個主要的部分:
大量的核心模塊、庫和用戶自定義模塊
Python 作為腳本語言的核心即解釋器(詞法分析產生 token,語法分析建立抽象語法樹,編譯成字節碼,虛擬機執行字節碼)
Python 運行時環境(對象和類型體系,內存分配器,運行時狀態信息)
Python 總體架構
Python 源代碼組織結構
為了和參考書籍保持一致,便于學習,這里仍舊采用 cpython-2.5.6 進行研究學習。
源代碼目錄如下:
├── Demo
├── Doc
├── Grammar
├── Include
├── LICENSE
├── Lib
├── Mac
├── Makefile.pre.in
├── Misc
├── Modules
├── Objects
├── PC
├── PCbuild
├── PCbuild8
├── Parser
├── Python
├── README
├── RISCOS
├── Tools
├── configure
├── configure.in
├── install-sh
├── pyconfig.h.in
└── setup.py
其中:
Include: Python 提供的所有 C 語言頭文件,當自己想用 C 或 C++ 來編寫自定義模塊擴展 Python 的時候,就需要用到這些頭文件??梢钥吹嚼锩嬗形覀冎笠芯康母鞣N對象的聲明。
? cpython-2.5 tree -L 1 Include
Include
├── Python-ast.h
├── Python.h
├── abstract.h
├── asdl.h
├── ast.h
├── bitset.h
├── boolobject.h
├── bufferobject.h
├── cStringIO.h
├── cellobject.h
├── ceval.h
├── classobject.h
├── cobject.h
├── code.h
├── codecs.h
├── compile.h
├── complexobject.h
├── datetime.h
├── descrobject.h
├── dictobject.h
├── enumobject.h
├── errcode.h
├── eval.h
├── fileobject.h
├── floatobject.h
├── frameobject.h
├── funcobject.h
├── genobject.h
├── graminit.h
├── grammar.h
├── import.h
├── intobject.h
├── intrcheck.h
├── iterobject.h
├── listobject.h
├── longintrepr.h
├── longobject.h
├── marshal.h
├── metagrammar.h
├── methodobject.h
├── modsupport.h
├── moduleobject.h
├── node.h
├── object.h
├── objimpl.h
......
├── pythread.h
├── rangeobject.h
├── setobject.h
├── sliceobject.h
├── stringobject.h
├── structmember.h
├── structseq.h
├── symtable.h
├── sysmodule.h
├── timefuncs.h
├── token.h
├── traceback.h
├── tupleobject.h
├── ucnhash.h
├── unicodeobject.h
└── weakrefobject.h
0 directories, 80 files
Lib: Python 自帶的所有標準庫,都是用 Python 語言編寫的??梢钥吹接形覀兘洺J褂玫念愃朴?base64,os 這樣的 Python 標準庫
? cpython-2.5 tree -L 1 Lib
Lib
├── BaseHTTPServer.py
├── Bastion.py
├── CGIHTTPServer.py
...
├── base64.py
...
├── hashlib.py
├── heapq.py
...
├── md5.py
...
├── optparse.py
├── os.py
├── os2emxpath.py
├── pdb.doc
├── pdb.py
├── pickle.py
├── pickletools.py
...
├── random.py
├── re.py
├── repr.py
...
├── socket.py
├── sqlite3
...
├── subprocess.py
...
├── xml
├── xmllib.py
├── xmlrpclib.py
└── zipfile.py
39 directories, 193 files
Modules: 該目錄也是包含了 Python 自帶的的模塊,和 Lib 目錄不同的是,Modules 下的模塊都是用 C 語言編寫的,是那些對速度要求非常嚴格的模塊。比如時間相關的 datetime,timeing 等模塊
? cpython-2.5 tree -L 1 Modules
Modules
├── Setup.config.in
├── Setup.dist
...
├── _randommodule.c
├── _sqlite
...
├── cPickle.c
├── cStringIO.c
...
├── datetimemodule.c
...
├── getpath.c
...
├── md5.c
├── md5.h
├── md5module.c
...
├── python.c
├── readline.c
├── resource.c
...
├── timemodule.c
├── timing.h
├── timingmodule.c
...
├── zipimport.c
├── zlib
└── zlibmodule.c
5 directories, 121 files
Parser: 該目錄包含了 Python 解釋器中的 Scanner 和 Parser 部分(詞法分析和語法分析),還包含類似于 YACC 這樣的能根據 Python 語言的語法自動生成 Python 語言的文法和詞法分析器的工具。
? cpython-2.5 tree -L 1 Parser
Parser
├── Python.asdl
├── acceler.c
├── asdl.py
├── asdl_c.py
├── bitset.c
├── firstsets.c
├── grammar.c
├── grammar.mak
├── grammar1.c
├── intrcheck.c
├── listnode.c
├── metagrammar.c
├── myreadline.c
├── node.c
├── parser.c
├── parser.h
├── parsetok.c
├── pgen.c
├── pgenmain.c
├── printgrammar.c
├── spark.py
├── tokenizer.c
├── tokenizer.h
└── tokenizer_pgen.c
0 directories, 24 files
Objects: 和 Include 目錄對應,這個目錄包含了所有 Python 的內建對象 C 語言實現代碼,還包含了 Python 在運行時需要的所有的內部使用對象的實現。
? cpython-2.5 tree -L 1 Objects
Objects
├── abstract.c
├── boolobject.c
├── bufferobject.c
├── cellobject.c
├── classobject.c
├── cobject.c
├── codeobject.c
├── complexobject.c
├── descrobject.c
├── dictnotes.txt
├── dictobject.c
├── enumobject.c
├── exceptions.c
├── fileobject.c
├── floatobject.c
├── frameobject.c
├── funcobject.c
├── genobject.c
├── intobject.c
├── iterobject.c
├── listobject.c
├── listsort.txt
├── longobject.c
├── methodobject.c
├── moduleobject.c
├── object.c
├── obmalloc.c
├── rangeobject.c
├── setobject.c
├── sliceobject.c
├── stringlib
├── stringobject.c
├── structseq.c
├── tupleobject.c
├── typeobject.c
├── unicodectype.c
├── unicodeobject.c
├── unicodetype_db.h
└── weakrefobject.c
1 directory, 38 files
Python: 該目錄包含了 Python 解釋器中的 Compiler 和執行引擎部分,是 Python 運行的核心所在。
? cpython-2.5 tree -L 1 Python
Python
├── Python-ast.c
├── asdl.c
├── ast.c
├── atof.c
├── bltinmodule.c
├── ceval.c
├── codecs.c
├── compile.c
├── dup2.c
├── dynload_aix.c
├── dynload_atheos.c
├── dynload_beos.c
├── dynload_dl.c
├── dynload_hpux.c
├── dynload_next.c
├── dynload_os2.c
├── dynload_shlib.c
├── dynload_stub.c
├── dynload_win.c
├── errors.c
├── fmod.c
├── frozen.c
├── frozenmain.c
├── future.c
├── getargs.c
├── getcompiler.c
├── getcopyright.c
├── getcwd.c
├── getmtime.c
├── getopt.c
├── getplatform.c
├── getversion.c
├── graminit.c
├── hypot.c
├── import.c
├── importdl.c
├── importdl.h
├── mactoolboxglue.c
├── marshal.c
├── memmove.c
├── modsupport.c
├── mysnprintf.c
├── mystrtoul.c
├── pyarena.c
├── pyfpe.c
├── pystate.c
├── pystrtod.c
├── pythonrun.c
├── sigcheck.c
├── strdup.c
├── strerror.c
├── strtod.c
├── structmember.c
├── symtable.c
├── sysmodule.c
├── thread.c
├── thread_atheos.h
├── thread_beos.h
├── thread_cthread.h
├── thread_foobar.h
├── thread_lwp.h
├── thread_nt.h
├── thread_os2.h
├── thread_pth.h
├── thread_pthread.h
├── thread_sgi.h
├── thread_solaris.h
├── thread_wince.h
└── traceback.c
0 directories, 69 files
修改 Python 源代碼并編譯安裝
為了觀察 Python 的執行過程,我們經常需要修改 Python 源代碼,改變一些執行邏輯,添加一些日志輸出,然后重新編譯安裝 Python 并運行觀察驗證結果。編譯安裝可以按照以下步驟:
./configure --prefix=$(pwd)
make && make install
注意,我在 Mac OS X Yosemite 10.10.3 上編譯失敗了,日志顯示:
? cpython-2.5 make
gcc -c -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Modules/python.o ./Modules/python.c
clang: error: unknown argument: '-mno-fused-madd'
make: *** [Modules/python.o] Error 1
gcc 識別不了相應的一個 編譯參數,搜索了一下,原因應該是 XCode 的版本和當時的 2.5.6 不兼容,所以果斷選擇了在 Ubuntu 14.04 上編譯安裝 Python,很快就通過了。
總結
以上是生活随笔為你收集整理的python源码剖析新版_Python 源码剖析之基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网抢答器_基于童芯派的抢答器V1.0
- 下一篇: withMisfireHandlingI