第二章 Python如何運(yùn)行程序
本章和下一章將給出程序執(zhí)行的簡(jiǎn)要說(shuō)明
Python解釋器簡(jiǎn)介
多數(shù)時(shí)都是將Python作為一門(mén)編程語(yǔ)言介紹的,但是,從目前的現(xiàn)實(shí)來(lái)講,Python也是一個(gè)名為解釋器的軟件包(好像跟R語(yǔ)言差不多)。解釋器是一個(gè)讓程序運(yùn)行起來(lái)的程序。當(dāng)你編譯了一段Python程序,Python解釋器將讀取程序,并按照其中的命令執(zhí)行,得出結(jié)果。實(shí)際上,解釋器是代碼與機(jī)器的計(jì)算機(jī)硬件之間的軟件邏輯層。(負(fù)責(zé)執(zhí)行代碼,讓機(jī)器能明白代碼的意思)
當(dāng)Python包安裝在機(jī)器上后。它會(huì)生成一些組件:至少包括一個(gè)解釋器和一套支持庫(kù)。根據(jù)使用情況的不同,Python解釋器可能采取可執(zhí)行程序的形式,或者是作為連接到另一個(gè)程序的一系列庫(kù)。(要么自己解釋,要么找別人)根據(jù)選用的Python版本不同,解釋器本身可以用C程序?qū)崿F(xiàn),或一些Java類(lèi)實(shí)現(xiàn),或者其他形式。無(wú)論什么形式,編寫(xiě)的Python代碼必須在解釋器中運(yùn)行。
程序執(zhí)行
編寫(xiě)或運(yùn)行Python程序的意義是什么呢?這取決于你是從程序員角度還是Python解釋器的角度去看待這個(gè)問(wèn)題。無(wú)論從哪一個(gè)角度來(lái)看問(wèn)題,這都會(huì)提供給你一個(gè)觀察Python編程的重要視角。
程序員視角
就最簡(jiǎn)單的形式而言,一個(gè)Python程序僅是一個(gè)包含Python語(yǔ)句的文本文件,例如,一個(gè)命名為script0.py的文件

這應(yīng)該是最簡(jiǎn)單的Python腳本,但它是一個(gè)功能完整的Python程序。
這個(gè)文件包括兩個(gè)Python的print語(yǔ)句,在輸出流中簡(jiǎn)單的打印一個(gè)字符串(偉大的hello world)
和一個(gè)數(shù)學(xué)表達(dá)式的結(jié)果(2的100次方)。不用為這段代碼的語(yǔ)法擔(dān)心,以及為什么在Python中可以計(jì)算出2的100次方而不溢出
可以用任何自己喜歡的文本編譯器創(chuàng)建由這樣的語(yǔ)句所組成的文件。按照慣例,Python文件是以.py結(jié)尾的。從技術(shù)上講,這種命名方案在被導(dǎo)入時(shí)才是必須的(導(dǎo)入概念下一章講),但絕大多數(shù)Python文件為了統(tǒng)一都是以.py命名的
當(dāng)你版這些語(yǔ)句輸入到本地文件后,必須告訴Python去執(zhí)行這個(gè)文件。也就是說(shuō),從頭至尾按照順序一個(gè)接一個(gè)的運(yùn)行文件中的語(yǔ)句,正如下一章你將看到的,可以通過(guò)命令行,從IDE中去點(diǎn)擊圖標(biāo)或者其他標(biāo)準(zhǔn)技術(shù)來(lái)運(yùn)行費(fèi)Python程序,順利的話,在執(zhí)行文件時(shí),將會(huì)看到這兩個(gè)打印語(yǔ)句的結(jié)果顯示在屏幕的某處,一般默認(rèn)是顯示在運(yùn)行程序的那個(gè)窗口(我這個(gè)不是,我用的IDLE)

對(duì)于一個(gè)新手,這對(duì)掌握一些程序執(zhí)行的腳本概念已經(jīng)足夠了(圖一樂(lè)也就圖一樂(lè))
Python的視角
上一節(jié)的簡(jiǎn)要介紹對(duì)于腳本語(yǔ)言是相當(dāng)標(biāo)準(zhǔn)的,并且通常絕大多數(shù)Python程序員只需要知道這些就足夠了。在文本文件中輸入代碼,之后再解釋器中運(yùn)行這些代碼。然而,當(dāng)Python運(yùn)行時(shí),透過(guò)表面,還有一些事情發(fā)生。盡管了解Python的內(nèi)部并不是Python編程必須的需求,但是對(duì)于Python運(yùn)行時(shí)結(jié)構(gòu)有一些基本的了解可以幫助你從宏觀上把握程序的運(yùn)行
但Python運(yùn)行腳本時(shí),在代碼開(kāi)始進(jìn)行處理之前,Python還會(huì)執(zhí)行一些步驟。確切的說(shuō),第一步是編譯成所謂的字節(jié)碼。之后將其轉(zhuǎn)發(fā)到所謂的虛擬機(jī)中
字節(jié)碼編譯
執(zhí)行程序時(shí),Python內(nèi)部(對(duì)大多數(shù)用戶是完全隱藏的)會(huì)將源代碼(文件中的語(yǔ)句)編譯成所謂的字節(jié)碼形式。編譯是一個(gè)簡(jiǎn)單的翻譯步驟,字節(jié)碼是一種低級(jí)的,與平臺(tái)無(wú)關(guān)的表現(xiàn)形式,概括的說(shuō),Python通過(guò)把你的每一條源語(yǔ)言分解為單一步驟來(lái)翻譯成一組字節(jié)碼指令。這些字節(jié)碼可以通過(guò)提高執(zhí)行速度,比起文本文件中原始的源代碼相比,字節(jié)碼的運(yùn)行速度要快的多。
上一段的所提到的這個(gè)過(guò)程對(duì)于你是完全隱藏起來(lái)的。如果Python進(jìn)程在機(jī)器上有寫(xiě)入權(quán)限,暗惡魔它將把程序的字節(jié)碼保存為一個(gè)以.pyc為擴(kuò)展名的文件。在Python3.2以及以后的版本,Python將把.pyc字節(jié)碼存儲(chǔ)在名為_(kāi)_pycache__子目錄的中,這個(gè)子目錄位于與源文件相同的路徑下,新版Python的__pycache__子目錄中的文件命名中包含了編譯它們的Python的版本信息,新的__pycache__子目錄能夠避免將太多文件擠在同一路徑下,而新的字節(jié)碼命名規(guī)范確保了同一臺(tái)電腦上安裝的不同版本的Python所生成的字節(jié)碼不會(huì)相符覆蓋。我們將會(huì)在22章中深入學(xué)習(xí)這種字節(jié)碼文件模型,盡管他們是自動(dòng)生成的,與大多數(shù)python程序無(wú)關(guān),也隨著不同版本的Python有著不同的形式。
Python這樣保存字節(jié)碼是作為對(duì)啟動(dòng)速度的一種優(yōu)化,下一次運(yùn)行程序時(shí),如果你在商場(chǎng)保存字節(jié)碼之后沒(méi)有修改過(guò)源代碼,并且運(yùn)行的是同一個(gè)Python編譯器的版本,那么Python將會(huì)加載.pyc文件并跳過(guò)編譯這個(gè)步驟。工作原理如下:
源文件的改變:Python會(huì)自動(dòng)檢測(cè)源文件和字節(jié)碼文件最后一次修改的時(shí)間戳,確認(rèn)它是否必須重新編譯,如果你編譯后又保存了源代碼,字節(jié)碼將自動(dòng)重新創(chuàng)建
Python的版本:導(dǎo)入機(jī)制同時(shí)會(huì)檢測(cè)是否需要因?yàn)槭褂昧瞬煌腜ython版本而重新編譯
(一看時(shí)間戳,二看版本)
其結(jié)果就是源文件的修改和Python版本的改變都會(huì)觸發(fā)新的字節(jié)碼文件的編譯。
如果Python無(wú)法在機(jī)器上寫(xiě)入字節(jié)碼,程序仍然可以工作,字節(jié)碼會(huì)在內(nèi)存中生成,并在程序結(jié)束時(shí)直接丟棄,然而,由于.pyc文件能夠加速啟動(dòng),最好保證大型程序中能夠創(chuàng)建。
如果Python找到的都是.pyc文件,它也很樂(lè)意運(yùn)行這個(gè)程序,即便沒(méi)有原始的.py源代碼文件(一會(huì)講‘凍結(jié)二進(jìn)制文件’一節(jié)來(lái)解決其他程序發(fā)布的選項(xiàng))
最后請(qǐng)牢記,字節(jié)碼只會(huì)只對(duì)那些被導(dǎo)入(import)的文件而生成,而不是頂層的執(zhí)行腳本(嚴(yán)格來(lái)說(shuō),這是一種針對(duì)導(dǎo)入的優(yōu)化)。此外,文件僅在程序執(zhí)行(或者可能編譯)時(shí)才會(huì)導(dǎo)入,而在交互式命令行中輸入的指令不會(huì)輸入字節(jié)碼。這種利用交互式命令行的編程模式會(huì)在第三章討論
Python虛擬機(jī)(PVM)
一旦程序編譯成字節(jié)碼或者字節(jié)碼從已經(jīng)存在的.pyc文件中載入,之后的字節(jié)碼將發(fā)送到通常稱為Python虛擬機(jī)PVM的程序上來(lái)執(zhí)行。實(shí)際上,他不是一個(gè)獨(dú)立的程序,不需要安裝。本質(zhì)上,PVM就是迭代運(yùn)行字節(jié)碼指令的一個(gè)大循環(huán),一個(gè)接一個(gè)的完成操作。PVM是Python的運(yùn)行時(shí)引擎,它時(shí)常表現(xiàn)為Python系統(tǒng)的一部分,并且是實(shí)際運(yùn)行腳本的組件。從技術(shù)上講,他是Python解釋器的最后一步
圖2-2展示了這里介紹的運(yùn)行時(shí)結(jié)構(gòu)。請(qǐng)記住這些復(fù)雜性都是有意的對(duì)Python程序員進(jìn)行隱藏的。字節(jié)碼的編譯是在自動(dòng)完成的,而PVM也是僅僅安裝在機(jī)器上的Python系統(tǒng)的一部分,所以,了解就好
性能的含義
熟悉C和C++的=這類(lèi)完全編譯語(yǔ)言的讀者或者已經(jīng)發(fā)現(xiàn)Python模式中的一些不同之處,其中之一便是,扎起Python的工作中通常沒(méi)有構(gòu)建或者make的步驟;代碼在寫(xiě)好后立即運(yùn)行,另一個(gè)就是,Python字節(jié)碼不是機(jī)器的二進(jìn)制代碼,字節(jié)碼是特定于Python的一種表現(xiàn)形式。

圖2-2是Python的傳統(tǒng)運(yùn)行時(shí)執(zhí)行模型,你輸入的源代碼轉(zhuǎn)換為字節(jié)碼,之后字節(jié)碼在Python虛擬機(jī)運(yùn)行。代碼自動(dòng)會(huì)被編譯,之后再被解釋
這就是Python代碼無(wú)法運(yùn)行的像C或者C++一樣快的原因,就像第一章描述的那樣,PVM循環(huán)(而不是CPU芯片)仍需解釋字節(jié)碼,并且字節(jié)碼指令比CPU指令需要更多的工作,另一方面,與其它經(jīng)典的解釋器不同,這里仍然有內(nèi)部編譯的步驟:Python并不需要反復(fù)的重復(fù)分析和分解每一行源代碼語(yǔ)句的文本,最終效果就是純Python代碼的運(yùn)行速度會(huì)介于傳統(tǒng)的編譯語(yǔ)言和傳統(tǒng)的解釋語(yǔ)言之間
開(kāi)發(fā)的含義
Python執(zhí)行模型所導(dǎo)致的另一個(gè)結(jié)果是其開(kāi)發(fā)和執(zhí)行的環(huán)境實(shí)際上并沒(méi)有區(qū)別,也就是說(shuō),編譯和執(zhí)行源代碼的系統(tǒng)是同一個(gè)系統(tǒng)·。在Python中,編譯器總是在運(yùn)行時(shí)出現(xiàn),并且是運(yùn)行程序系統(tǒng)的一部分
這將會(huì)大大縮短開(kāi)發(fā)周期,程序在執(zhí)行之前并不需要預(yù)編譯和鏈接;只需要簡(jiǎn)單的輸入并運(yùn)行代碼即可,這同樣讓Python帶上了更濃厚的動(dòng)態(tài)語(yǔ)言色彩,在運(yùn)行時(shí),Python程序去構(gòu)建并執(zhí)行另一個(gè)Python程序是有可能的,而且往往是非常方便的,如:eval和exec內(nèi)置模塊能夠接受并運(yùn)行包含Python程序代碼的字符串。這種結(jié)構(gòu)是Python能夠?qū)崿F(xiàn)產(chǎn)品定制的原因,因?yàn)镻ython代碼可以動(dòng)態(tài)的被修改,用戶可以改進(jìn)系統(tǒng)內(nèi)部的Python部分,而不需要擁有整個(gè)或編譯整個(gè)系統(tǒng)的代碼
從更基礎(chǔ)的角度來(lái)說(shuō),牢記我們?cè)赑ython中真正擁有只有運(yùn)行時(shí):完全不需要初始的編譯階段,所有的事情都是在程序運(yùn)行時(shí)發(fā)生的。這甚至還包括了建立函數(shù)和類(lèi)的操作以及模塊的鏈接。這些事情對(duì)于靜態(tài)語(yǔ)言往往是發(fā)生在執(zhí)行之前,而在Python中是與程序的執(zhí)行同時(shí)進(jìn)行的。
執(zhí)行模型的變體
上一節(jié)介紹了內(nèi)部的執(zhí)行流程,而這種流程也反映了今天Python的標(biāo)準(zhǔn)實(shí)現(xiàn)形式,但這實(shí)際上并不是python語(yǔ)言本身所必須的。正因?yàn)檫@樣待你,執(zhí)行模型也會(huì)隨著時(shí)間而改變。事實(shí)上,現(xiàn)在已經(jīng)出現(xiàn)一些系統(tǒng)修改了圖2-2所描述的情況,
Python的各種實(shí)現(xiàn)
據(jù)我所知,Python語(yǔ)言目前主要有五種實(shí)現(xiàn)方式
CPython:標(biāo)準(zhǔn)Python
最初的,標(biāo)準(zhǔn)的Python實(shí)現(xiàn)方式通常被稱為CPython,這個(gè)名字來(lái)源于它是由可移植的ANSIC語(yǔ)言代碼編寫(xiě)而成的這個(gè)事實(shí)。這就是你從http://www.python.org獲取的,從ActivePython和Enthought的發(fā)行版中得到的,以及絕大多數(shù)Linux和Mac OS X機(jī)器上自動(dòng)安裝的Python。與其他的替代系統(tǒng)相比,他的運(yùn)行速度更快,最完整,最新,而且也最健全。
JPython:基于Java的Python
目標(biāo)是讓Python代碼能夠腳本化Java應(yīng)用程序。它實(shí)現(xiàn)了與Java的無(wú)縫集成。系統(tǒng)本質(zhì)是將圖2-2最右邊的兩個(gè)方框(我畫(huà)的圓)中的內(nèi)容替換為基于java的等效實(shí)現(xiàn)。,由于python代碼被翻譯為Java字節(jié)碼,因此在運(yùn)行時(shí)看起來(lái)就像真正的Java程序一樣
IronPython:基于.NET的Python
其設(shè)計(jì)目的是讓Python程序可以與Windows平臺(tái)上的.NET框架以及與之對(duì)應(yīng)的LLinux上開(kāi)源的Mono編寫(xiě)的應(yīng)用相集成,IronPython如需Python程序同時(shí)扮演客戶端和服務(wù)器端的角色,與.NET語(yǔ)言進(jìn)行來(lái)回訪問(wèn),以及在Python代碼中利用諸如Silverlight框架的.NET技術(shù)
Stackless:注重并發(fā)的Python
針對(duì)并發(fā)性而優(yōu)化的一個(gè)增強(qiáng)版本實(shí)現(xiàn),不會(huì)再C語(yǔ)言調(diào)用棧上保存狀態(tài),這使得更容易移植到較小的棧構(gòu)架中,提供了更高效的多處理選項(xiàng),并且促進(jìn)了向協(xié)程這樣的新穎的編程結(jié)構(gòu)的出現(xiàn)
PyPy:注重速度的Python
我啃的這本書(shū)雖說(shuō)是最新版,去年出版,但也正是以Python3.3寫(xiě)的,書(shū)中介紹pypy支持2.7,還未支持3.X,查了下百度百科,最新的(2018.12.15)PyPy版本是PyPy3 v6.0.0,兼容Python3.5.3??梢赃\(yùn)行在Linux的32位和64位、MacOSX和Windows的32位平臺(tái)中。
現(xiàn)在Python到了3.8,能不能用上不好說(shuō)。
pypy是CPython標(biāo)準(zhǔn)的另一個(gè)實(shí)現(xiàn),它更注重性能,它提供了一個(gè)帶有即時(shí)編譯器的Python快速實(shí)現(xiàn),能夠在安全環(huán)境中運(yùn)行不信任代碼的“沙箱”模型的工具,
PyPy是原先的Psyco即時(shí)編譯器的繼任者,并將Psyco納入一個(gè)追求速度的純Python實(shí)現(xiàn)。及時(shí)編譯器事實(shí)上只是PVM的一個(gè)擴(kuò)展,它將你的字節(jié)碼中的部分直接轉(zhuǎn)換為運(yùn)行速度更快地二進(jìn)制機(jī)器碼。這一切發(fā)生在你的程序運(yùn)行階段,而非運(yùn)行前的編譯階段。
21章的時(shí)候我們還會(huì)見(jiàn)到這個(gè)(如果有時(shí)間最近啃寫(xiě)這本書(shū)的話(慶余年真好看))
執(zhí)行優(yōu)化工具
CPython和前一節(jié)介紹的大部分實(shí)現(xiàn)變體都是以相似的方式實(shí)現(xiàn)Python語(yǔ)言的,通過(guò)吧源代碼編譯為字節(jié)碼,然后在合適的虛擬機(jī)上執(zhí)行這些字節(jié)碼。還有一些其他的系統(tǒng),包括Cython混合語(yǔ)言,Shed Skin C++轉(zhuǎn)換器,以及PyPy與Psyco中的即時(shí)編譯器,則試著優(yōu)化了基本的執(zhí)行模塊,這些系統(tǒng)并不是你現(xiàn)階段學(xué)習(xí)Python的必備知識(shí),但是簡(jiǎn)要的了解他們?cè)趫?zhí)行模型中所處的位置能夠幫助你解開(kāi)執(zhí)行模型的神秘面紗
Cython:Python和C的混合體
它為Python代碼配備了調(diào)用C函數(shù)以及使用變量、參數(shù)、和類(lèi)屬性聲明的能力。Cython代碼可以編譯成使用python/C API 的C代碼,最后可以再完成編譯,盡管與標(biāo)準(zhǔn)Python并不完全兼容,但對(duì)于包裝外部的C庫(kù)以及提高Python的C擴(kuò)展的編碼效率都很有用
Shed Skin:Python到C++的轉(zhuǎn)換器
這是一個(gè)新興的系統(tǒng),它采用了一種不同的Python程序執(zhí)行方式,嘗試將Python代碼翻譯為C++代碼,然后使用機(jī)器中的C++編譯器將得到的C++代嗎編譯為機(jī)器代碼。通過(guò)這種方式,它已一種與平臺(tái)無(wú)關(guān)的方式來(lái)運(yùn)行Python代碼
我上當(dāng)了,好像不支持Python3.X
Psyco:原先的及時(shí)編譯器
書(shū)上一大長(zhǎng)串子,不想寫(xiě)了。
過(guò)時(shí)了,要淘汰了,淹沒(méi)在歷史的洪流里了,PyPy是它的繼任者,你說(shuō)什么時(shí)候的吧。
這是一個(gè)能夠讓程序運(yùn)行的更快的擴(kuò)展字節(jié)碼執(zhí)行的模塊組件
凍結(jié)二進(jìn)制文件
有時(shí)候人們需要一個(gè)真正的Python編譯器,實(shí)際上他們需要的是一種能讓python里的程序生成獨(dú)立的二進(jìn)制可執(zhí)行代碼的簡(jiǎn)單方法。這是一個(gè)比執(zhí)行流概念更接近于打包發(fā)布的概念,但是兩者之間或或少有些聯(lián)系。你可以通過(guò)網(wǎng)絡(luò)獲取第三方工具將Python轉(zhuǎn)為可執(zhí)行程序,他們?cè)趐Python世界中稱為凍結(jié)二進(jìn)制文件,這些程序可以不安裝Python環(huán)境而獨(dú)立運(yùn)行
凍結(jié)二進(jìn)制文件能夠?qū)⒊绦蛭募淖止?jié)碼,PVM以及任何程序所需的Python支持文件捆綁在一起形成一個(gè)單獨(dú)的文件包,這個(gè)過(guò)程存在著一些不同的變體,但最終的結(jié)果是一個(gè)可執(zhí)行的二進(jìn)制程序,如Windows的exe文件
凍結(jié)二進(jìn)制文件與真實(shí)的編譯器輸出結(jié)果有所不同,他們通過(guò)虛擬機(jī)運(yùn)行字節(jié)碼,因此,除了必要的·初始改進(jìn),凍結(jié)二進(jìn)制文件和最初的源代碼程序運(yùn)行速度完全相同。凍結(jié)二進(jìn)制文件并不?。ㄓ袀€(gè)PVM),但是以現(xiàn)在的標(biāo)準(zhǔn)來(lái)看,其實(shí)也不是特別大。
對(duì)于接受著,代碼都是隱藏起來(lái)的,并且無(wú)需安裝,可以直接運(yùn)行。
未來(lái)的可能性
盡管未來(lái)的實(shí)現(xiàn)方式有可能從某種程度上改變Python的運(yùn)行時(shí)結(jié)構(gòu),但就接下來(lái)一個(gè)時(shí)期來(lái)看,字節(jié)碼編譯仍然將會(huì)是唯一標(biāo)準(zhǔn),字節(jié)碼的可移植性和運(yùn)行時(shí)的靈活性對(duì)于很多python系統(tǒng)來(lái)說(shuō)是很重要的特性,此外,未來(lái)實(shí)現(xiàn)靜態(tài)編譯,而增加類(lèi)型約束聲明將會(huì)破壞這種靈活性,緊湊,簡(jiǎn)明以及所有代表Python編碼精神的特性。由于Python本身高度動(dòng)態(tài)的本質(zhì),今后的任何實(shí)現(xiàn)方式都可能保留諸多當(dāng)前的PVM的產(chǎn)物。
本章小結(jié)
嘮一下這一章學(xué)了什么吧,什么是Python解釋器,運(yùn)行Python程序的程序;Python將源代碼翻譯成字節(jié)碼,字節(jié)碼能跨平臺(tái),所有Python有很好的移植性,又因?yàn)槭亲止?jié)碼,所以性能不如C的二進(jìn)制機(jī)器碼,字節(jié)碼存儲(chǔ)扎起.pyc文件中,文件名有Python的版本號(hào),.pyc帶有時(shí)間戳確定是否修改,在版本改變時(shí)或者源文件修改并與.pyc文件時(shí)間戳不同時(shí)字節(jié)碼文件就是那個(gè).pyc文件修改,字節(jié)碼文件比源代碼執(zhí)行速度快,因?yàn)樯倭艘徊睫D(zhuǎn)換為字節(jié)碼,在運(yùn)行時(shí),字節(jié)碼文件發(fā)送到虛擬機(jī)中,負(fù)責(zé)解釋編譯字節(jié)碼。源代碼到字節(jié)碼再到PVM,執(zhí)行過(guò)程只有執(zhí)行時(shí),不需要預(yù)編譯和鏈接。大大縮短開(kāi)發(fā)周期。
為了各種各樣的事情,如配合JAVA,提升速度,多進(jìn)程等,出現(xiàn)各種實(shí)現(xiàn)方式,其中CPython是標(biāo)準(zhǔn)實(shí)現(xiàn),其他實(shí)現(xiàn)方式都是改變字節(jié)碼,虛擬機(jī)。
還有一些執(zhí)行優(yōu)化工具,但書(shū)上介紹幾個(gè)對(duì)于Python3.X的支持不太好,就不說(shuō)了。
凍結(jié)二進(jìn)制文件,就是將Python程序轉(zhuǎn)換為可執(zhí)行程序,將一堆東西打包,字節(jié)碼文件,pvm,還有python的相關(guān)支持文件合在一起,然后變成一個(gè)不需要安裝,可以直接執(zhí)行的程序,接收者庫(kù)看不見(jiàn)代碼(不要源代碼,有字節(jié)碼夠用了),不要Python環(huán)境(我打包進(jìn)去了)。
未來(lái)優(yōu)化方向如果要保留現(xiàn)在的Python特性應(yīng)該沒(méi)什么可以改的了(應(yīng)該)
然后是抄寫(xiě)并背誦本章習(xí)題
本章習(xí)題
1.什么是Python解釋器?
Python解釋器是運(yùn)行你所編寫(xiě)的Python程序的程序。
2.什么是源代碼?
源代碼是為程序所寫(xiě)的語(yǔ)句:它由文本文件中的文本組成,通常以.py作為后綴名。
3.什么是字節(jié)碼?
字節(jié)碼是Python將程序編譯后所得到的低級(jí)形式。Python將字節(jié)碼自動(dòng)保存到后綴名為.pyc的文件中。
4.什么是PVM?
PVM是Python的虛擬機(jī),他是Python的運(yùn)行時(shí)引擎,能解釋編譯得到的字節(jié)碼。
5.請(qǐng)列舉兩個(gè)或多個(gè)Python標(biāo)準(zhǔn)執(zhí)行模型的變體的名字。
Psyco、Shed Skin以及凍結(jié)二進(jìn)制文件都是執(zhí)行模型的變體。除此之外,在接下來(lái)的兩個(gè)問(wèn)題中提到的其他Python實(shí)現(xiàn),以代替字節(jié)碼和虛擬機(jī)或是添加工具和JIT的形式對(duì)Python的執(zhí)行模型進(jìn)行時(shí)改進(jìn)。
6.CPython。JPython以及IronPython有什么不同?
CPython是Python語(yǔ)言的標(biāo)準(zhǔn)實(shí)現(xiàn)。JPython和IronPython分別是Python程序在Java和.NET環(huán)境的實(shí)現(xiàn),它們都是Python的代替編譯器。
7.什么是Stackless和PyPy?
Stackless是一種針對(duì)并發(fā)性而增強(qiáng)的Python版本,而PyPy是針對(duì)速度而增強(qiáng)的Python實(shí)現(xiàn)。PyPy作為Psyco的繼任者,融合了Psyco中的JIT概念。
(下一章的東西好多啊,第一次讀的時(shí)候感覺(jué)都是廢話,第二次感覺(jué)實(shí)在太多坑了,我準(zhǔn)備寫(xiě)下一章前又讀一次感覺(jué)又都是廢話,許多坑都是如果你不知道會(huì)直接放棄學(xué)習(xí)(開(kāi)局直接裂開(kāi)了,玩不下去了,就好像安裝完環(huán)境寫(xiě)下hello world直接報(bào)錯(cuò)了,學(xué)個(gè)屁?。懒四撬兑膊皇?。下一章兩萬(wàn)字打底把,我太難了)