Python解釋器簡(jiǎn)介(1):函數(shù)對(duì)象
在最近三個(gè)月,我和Ned Batchelder用了很多時(shí)間在做byterun。 它是用Python寫(xiě)的Python字節(jié)碼解釋器。做 byterun 的過(guò)程十分有趣,也讓我收獲了很多知識(shí)。在這個(gè)系列文章的結(jié)尾,我將試著讓你相信:你也能輕松愉快地“玩” byterun。但在那之前,我們需要做一些準(zhǔn)備工作:大概了解python內(nèi)部是如何工作的。這樣我們才能理什么是解釋器,它能做什么以及它不能做什 么。
這個(gè)系列文章是面向水平和三個(gè)月前的我相似的讀者。也就是你了解python,但對(duì)它的內(nèi)部工作一無(wú)所知。
提示:本文將基于 Python 2.7 , Python 3 中的解釋器也非常相似。雖然我會(huì)忽略兩個(gè)版本之間的語(yǔ)法和命名差異,但我這個(gè)系列同樣可以試用于 Python3。
Python是如何工作的?
我們將從高層開(kāi)始了解python的內(nèi)部工作。你在你的python REPL里執(zhí)行一行代碼之后,它是如何工作的呢?
- ~ $ python
- Python 2.7.2 (default, Jun 20 2012, 16:23:33)
- [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
- Type "help", "copyright", "credits" or "license" for more information.
- >>> a = "hello"
當(dāng)你敲下return鍵的時(shí)候,python完成了以下四步:詞法分析、句法分析、編譯、解釋。詞法分析的工作就是將你剛才輸入的那行代碼分解為一些符號(hào)token(譯者注:包括標(biāo)示符,關(guān)鍵字,數(shù)字, 操作符等)。句法分析程序再接收這些符號(hào),并用一種結(jié)構(gòu)來(lái)展現(xiàn)它們之間的關(guān)系(在這種情況下使用的抽象語(yǔ)法樹(shù))。然后編譯器接收這棵抽象語(yǔ)法樹(shù),并將它轉(zhuǎn)化為一個(gè)(或多個(gè))代碼對(duì)象。***,解釋器逐個(gè)接收這些代碼對(duì)象,并執(zhí)行它們所代表的代碼。
主要是因?yàn)槲椰F(xiàn)在對(duì)這些步驟一竅不通,所以我并不打算詳解詞法分析、句法分析和編譯。但是,我們假設(shè)這些步驟都正常運(yùn)行,并且能夠提供給解釋器一個(gè)合適的python代碼對(duì)象來(lái)完成解釋工作。
在我們談?wù)摯a對(duì)象之前,我想先解答一些常見(jiàn)的疑惑。我們將在這個(gè)系列文章中講解函數(shù)對(duì)象、代碼對(duì)象以及字節(jié)碼。它們是 完全不同的概念。我們就從函數(shù)對(duì)象談起吧。雖然我們不需要了解函數(shù)對(duì)象到達(dá)解釋器的過(guò)程,但是我想強(qiáng)調(diào)函數(shù)對(duì)象和代碼對(duì)象是截然不同的(另外,函數(shù)對(duì)象超 棒?。?/p>
函數(shù)對(duì)象
你也許對(duì)“函數(shù)對(duì)象”早有耳聞。當(dāng)談到“函數(shù)是***的對(duì)象”或者“Python有著最棒的函數(shù)”時(shí),人們總會(huì)提起它。那我們就來(lái)看一個(gè)函數(shù)對(duì)象吧。
- >>> def foo(a):
- ... x = 3
- ... return x + a
- ...
- >>> foo
- <function foo at 0x107ef7aa0>
“函數(shù)是***的對(duì)象”說(shuō)明函數(shù)是一種對(duì)象。它就如同一個(gè)列表或者舉個(gè)例子來(lái)說(shuō) :MyObject 就是一個(gè)對(duì)象。既然 foo 是一個(gè)對(duì)象,那么我們就能在不調(diào)用它的情況下使用它(也就是說(shuō),foo 和 foo() 是大相徑庭的)。我們能夠?qū)?nbsp;foo 當(dāng)作一個(gè)參數(shù)傳遞 給另一個(gè)函數(shù)或者賦值給一個(gè)新函數(shù)名( other_function = foo )。有了如此棒的函數(shù),一切皆為可能!
在第二部分,我們將著眼于下一層次——代碼對(duì)象。
原文鏈接:http://akaptur.github.io/blog/2013/11/15/introduction-to-the-python-interpreter/