Pyc 是什麼東東,Pyc東東
在眾多語言中, 最終我們可以將語言分為編譯性語言和解釋性語言兩種
編譯性語言,也就是機器語言, 是機器能讀的懂的語言, 像C語言, 其實進階語言都是基於C語言的基礎之上啟動並執行
解釋性語言, 不同於編譯性語言,其在運行時逐行編譯,然後載運行,像java ,其第一步通過 javac 將其編譯為位元組碼, 然後才運行。
像python這種語言, 首先是將代碼編譯為pyc 檔案(這種編譯過程對我們不可見) , 然後將pyc檔案交給解譯器去執行。
Python 運行過程:當python運行時,將編譯的結果儲存在記憶體中的PyCodeObject 中, 當python運行結束時, Python解譯器將PyCodeObject寫回到
Pyc檔案中,
當python程式第二次運行時, 首先程式會在硬碟中尋找pyc檔案, 如果找到,則直接載入, 否則,重複上面的過程。
所以我們這樣來定義PyCodeObject和Pyc , Pyc是P有CodeObject的一種持久化的儲存方式。
Pyc 檔案只有在被其他模組匯入的時候才能產生。
解釋性語言和編譯性語言的區別
電腦不能直接理解進階語言,只能直接理解機器語言,所以必須要把進階語言翻譯成機器語言,電腦才能執行進階語言編寫的程式。翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。編譯性語言編譯型語言寫的程式執行之前,需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,比如exe檔案,以後要啟動並執行話就不用重新翻譯了,直接使用編譯的結果就行了(exe檔案),因為翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程式執行效率高。解釋性語言 解釋則不同,解釋性語言的程式不需要編譯,省了道工序,解釋性語言在運行程式的時候才翻譯,比如解釋性java語言,專門有一個解譯器能夠直接執行java程式,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就要翻譯一次,效率比較低。指令碼語言 指令碼語言是解釋性語言。指令碼語言一般都有相應的指令碼引擎來解釋執行。它們一般需要解譯器才能運行。所以只要系統上有相應語言的解釋程式就可以做到跨平台。指令碼語言是一種解釋性的語言,例如vbscript,javascript,installshield script等等,它不象c\c++等可以編譯成二進位代碼,以可執行檔的形式存在。JAVA語言 java語言是解釋性語言。java很特殊,java程式也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯稱為位元組碼,然後用解釋方式執行位元組碼。Java既可以被編譯,也可以被解釋。通過編譯器,可以把Java程式翻譯成一種中間代碼 - 稱為位元組碼 - 可以被Java解譯器解釋的獨立於平台的代碼。通過解譯器,每條Java位元組指令被分析,然後在電腦上運行。只需編譯一次,程式運行時解釋執行。 Java位元組碼使“寫一次,到處運行”成為可能。可以在任何有Java編譯器的平台上把Java程式編譯成位元組碼。這個位元組碼可以運行在任何Java VM上。例如,同一個Java程式可以運行在WindowsNT、Solaris和Macintosh上。編譯器與解譯器的區別 編譯型與解釋型,兩者各有利弊。前者由於程式執行速度快,同等條件下對系統要求較低,因此像開發作業系統、大型應用程式、資料庫系統等時都採用它,像C/C++、Pascal/Object Pascal(Delphi)等都是編譯語言,而一些網頁指令碼、伺服器指令碼及輔助開發介面這樣的對速度要求不高、對不同系統平台間的相容性有一定要求的程式則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。編譯性語言 不如解釋性語言跨平台性好? 編譯性語言例如c語言:用c語言開發了程式後,需要通過編譯器把程式編譯成機器語言(即電腦識別的二進位檔案,因為不同的作業系統電腦識別的二進位檔案是不同的),所以c語言程式進行移植後,要重新編譯。(如windows編譯成ext檔案,linux編譯成erp檔案)。 解釋性語言,例如java語言,java程式首先通過編譯器編譯成class檔案,如果在windows平台上運行,則通過windows平台上的java虛擬機器(VM)進行解釋。如果運行在linux平台上,則通過linux平台上的java虛擬機器進行解釋執行。所以說能跨平台,前提是平台上必須要有相匹配的java虛擬機器。如果沒有java虛擬機器,則不能進行跨平台