1.Python是一門解釋型語音?
我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋型語音,我就這樣一直相信下去,知道發現了*.pyc檔案的存在.如果是解釋型語音,那麼生成的*.pyc檔案是什麼呢?c應該是compiled的縮寫才對啊!
為了防止其他學習Python的人也被這句話誤解,那麼我們就在文中來澄清下這個問題,並把一些基礎概念給理清.
2.解釋型語音和編譯型語言
計算機是不能夠識別高階語言的,所以當我們執行一個高階語言程式的時候,就需要一個”翻譯機”來從事把高階語言轉變成計算機能讀懂的機器語言的過程,這個過程分為兩類,第一種是編譯,第二種是解釋.
編譯型語言在程式執行前,先會通過編譯器對程式執行一個編譯過程,把程式轉變成機器語言.執行時就不需要翻譯,而直接執行就可以了.最經典的例子就是C語言.
解釋型語音就沒有這個編譯的過程,而是在程式執行的時候,通過直譯器對程式逐行做出翻譯,然後直接執行,最經典的例子是Ruby,還有Python.
通過以上的例子,我們可以來總結一下解釋型語音和編譯型語言的優缺點,因為編譯型語言在程式執行之前就已經對程式做出了”翻譯”,所以在執行時就少掉了”翻譯的過程”,所以效率比較高.但我們也不能一概而論.一些解釋型語音也可以通過直譯器的優化來在對程式做出翻譯時對整個程式做出優化,從而在速度上和編譯型語言比較接近.
此外,隨著Java等基於虛擬機器的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種.
用Java來舉例,Java首先是通過編譯器編譯成位元組碼檔案,然後執行時通過直譯器給解釋成機器檔案.所以我們說Java是一種先編譯後解釋的語言.
3.Python到底是什麼
其實Python和Java/C#一樣,也是一門基於虛擬機器的語言,我們先來從表面上簡單地瞭解一下Python程式的執行過程吧.
當我們在命令列中輸入python hello.py時,其實是啟用了Python的”直譯器”告訴”直譯器”:你要開始工作了.可是在”解釋”之前,其實執行的第一項工作和Java一樣,是編譯.
熟悉Java的同學可以想一下我們在命令列中如何執行一個Java的程式:
javac hello.java
java hello
只是我們在用Eclipse之類的IDE時,將這兩部給融而成了一部而已.其實Python也一樣,當我們執行python hello.py時,他也一樣執行了這麼一個過程,所以我們應該這樣來描述Python,Python是一門先編譯後解釋的語言
4.簡述Python的執行過程
在說這個問題之前,我們現在說兩個概念,PycodeObject和pyc檔案.
我們在硬碟上看到的pyc自然不必多說,而其實PycodeObject則是Python編譯器真正編譯成的結果.我們先簡單知道就可以了,繼續向下看.
當python程式執行時,編譯的結果則是儲存在位於記憶體中的PyCodeObject中,當Python程式執行結束時,python直譯器則將PycodeObject寫回到pyc檔案中.
當Python程式第二次執行時,首先程式會在硬碟中尋找pyc檔案.如果找到,則直接載入,否則就重複上面的過程.
所以我們應該這樣來定位PycodeObject寫回到pyc檔案,我們說pyc檔案其實是PycodeObject的一種持久化儲存方式.