困擾多年的問題,Python到底是語言,還是工具,哈佛教授完美詮釋

來源:互聯網
上載者:User

標籤:net   簡單的   引用   源碼   分享圖片   接下來   tsp   foo   python實現   

然而,這是一句非常模稜兩可的話。這裡的"Python"到底指的是什嗎? 是Python的抽象介面嗎?是Python的通用實現CPython嗎(不要把CPython跟Cython搞混了)?亦或者指的完全是其他的東西呢?可能我另外指的是Jython,或者IronPython,或者是PyPy。也或者轉而談論的又是RPython或者RubyPython(這兩者是完全不同的東西)。

上面提到的那些技術經常被提起和引用, 它們的使用目的和情境是完全不一樣的(至少,它們的操作方式是完全不一樣的)

自從我使用Python工作以來,我已經用過了各種各樣的.*ython工具了。但是直到最近我才花時間去理解到底它們是幹嘛的,它們是怎樣工作的,為什麼它們是不可或缺的。

在這篇文章裡面,我會介紹各種Python的實現,最後以對PyPy的介紹結尾, 因為我個人認為它是Python的未來。

所有的都從理解什麼是"Python"開始。

如果你對機器碼,虛擬機器之類的很熟了,你可以跳過開頭,直接從 "即時編譯: PyPy和它的未來" 這部分開始看起。

Python是解釋型的還是編譯型的?

這是個Python新人都會迷惑的問題。

首先需要明了的是Python只是一個介面。有一個關於Python應該做什麼以及怎麼做的具體說明(就像其他任何介面一樣 ),並且對應的有很多具體的實現(也像其他介面一樣)。

其次需要知道的是“解釋型”和“編譯型”是具體實現的特性,而不是介面的特性。

所以,這個問題本身就沒有組織好。

Python是解釋型還是編譯型的?這個問題真的沒有組織好。

對使用最廣泛的實現(CPython:用C實現的,通常簡單的說成Python,若你不知道我所說的這些,那很肯能你在使用的就是CPython)而言,這個問題的答案是:解釋型,但帶有一些編譯型特徵。CPython把Python源碼編譯*成位元組碼,之後再解釋這些位元組碼,執行之。

*注意:這個編譯不是通常意義上的編譯。通常我們說的編譯,是指把進階語言代碼轉換成機器碼。但這裡的編譯實際上是另一種意義上的編譯。(譯者,這句話不是很懂,原文是it is a ‘compilation’ of sorts,不知作何解,求教各位讀者。)

再詳細看下上面的答案吧,這有助於我們理解本文中後面會講到的幾個概念。

位元組碼 vs. 機器碼

瞭解位元組碼和機器碼(或者native code)的區別是很重要的,最好的辦法或許是看看例子:

C代碼被編譯成機器碼,將在處理器上直接執行。每一條指令控制CPU工作。
Java代碼被編譯成位元組碼,將在Java虛擬機器(JVM)這個抽象的電腦上執行。每一條指令由JVM處理,JVM同電腦本身之間互動。
簡而言之:機器碼快的多,但位元組碼更易遷移,也更安全。

機器碼隨機器的變化而變化,但位元組碼在所有的機器上都是一樣的。有人可能會認為機器碼是對特定環境最佳化了的。

回到CPython,工具鏈的執行過程如下:
CPython編譯你的Python原始碼,產生位元組碼。
位元組碼隨後在CPython虛擬機器上執行。

初學者常常因為看到.pyc檔案而假設Python是編譯型的。這也有一些合理性:.pyc檔案正式之後要解釋的位元組碼檔案。所以,你若之前運行過你的Python代碼,產生了.pyc檔案,再次運行時就要快得多,因為不需要再次編譯產生位元組碼了。

可選的虛擬機器:Jython,IronPython等

正如我之前所述,Python有很多實現。前面也提到,CPython是最通用的。這是一個用C實現的,被認為是”預設“的實現。

但其他的呢?其中最顯赫的之一就是Jython,一個用Java實現的採用了JVM的實現。CPython產生在CPython虛擬機器上啟動並執行位元組碼,而Jython產生在JVM上啟動並執行java位元組碼(這同編譯Java程式產生java位元組碼的過程是一樣的)。


”為啥你要用其他的實現?”,你可能會如此發問。好吧,對開發人員而言,不同的實現對不同的技術難題的支援程度不一樣。

CPython中很容易為你的Python代碼寫C擴充,因為最終都是由C解譯器執行的。另一方面,Jython則使得和其他java程式共同工作很容易:無需其他工作,你就可匯入任何Java類,在你的Jython程式中使用其他Java類。(題外話,若你沒有認真思考,這一段會很難。此時我們已經在討論把不同語言的代碼混在一起,並編譯成同一程式。(Rostin 提出混合Fortran和C代碼編程已經有一段時間了。所以,這並不新鮮,但仍然很酷。))

下面是一個例子,一段合法的Jython代碼:

[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51

>> from java.util import HashSet

>> s = HashSet(5)

>> s.add("Foo")

>> s.add("Bar")

>> s

[Foo, Bar]

IronPython是另一很流行的Python 實現,完全用C#實現,針對.NET平台。她運行在可以叫做.NET虛擬機器的平台上,這是微軟的 Common Language Runtime (CLR),同JVM相對應。

你可能會說,Jython:Java::IronPython:C#。它們各自運行在相同的虛擬機器上,你能從你的IronPython中匯入C#的類,從你寫的Jython代碼中帶入Java類,等等

你完全可以不用任何非CPython的實現就能完成你手上的任何工作。但是使用這些技術也是有很多的好處的,大部分取決於你現在所使用的技術棧。 你使用了很多基於JVM的語言?Jython就是為你準備的。使用的都是.NET世界的語言?那麼你應該試試IronPython了(或許你已經在用了)


順便說一下(儘管這不是使用不同的實現的理由),注意Python的各種實現在對待你的Python源碼的時候所做的處理方式是完全不一樣的。然後這些差異是很小的,由於這些實現都在不停的發展改進中,隨著時間的推移,這些差異會慢慢融合和相容。比如,IronPython預設情況下使用Unicode字串,但是在2.x版本的CPython中預設是ASCII字串(如果使用了非ASCII字串,會拋出一個UnicodeEncodeError錯誤),但是在3.x版本裡面CPythong已經預設支援Unicode字串了。

即時編譯: PyPy和它的未來

我們已經有了一個使用C寫的Python實現,一個用Java寫的,一個用C#寫的。接下來就是:用Python寫的Python實現(有心人可能會注意這句話有點問題,是個死迴圈,^_^)

接下來我們看下什麼地方容易搞混淆。首先,我們討論下即時編譯器JIT

JIT: 為什麼會有這個?它的原理是什嗎?

大家都知道本地機器碼的速度比位元組碼的速度快很多。那麼,如果我們能將一些位元組碼直接編譯成本地機器碼再去運行它會怎樣呢?我們必須花費一些代價(比如時間)在編譯位元組碼到本地機器碼上,如果最終的已耗用時間更快,那麼這個代價就是值得的。這就是JIT編譯器的動機,一種混合瞭解釋器和編譯器好處的技術。簡單來講,JIT就是想通過編譯技術提升指令碼解譯器系統的速度

喜歡這篇文章的話,轉寄+評論哦!讓大家看看你獨特的見解哦!

好了給大家送上這一篇文的福利 加我QQ群:836962007 即可擷取哦!

困擾多年的問題,Python到底是語言,還是工具,哈佛教授完美詮釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.