Python學習之路(0)——python基本瞭解
注:用多了Linux,習慣在Linux下做開發了,整個學習過程都是在Linux下進行的
1.python3還是python2?
我先從Python3學起吧
2.Python編譯
在命令列敲下面的命令:python 檔名.py
python3 hello.py
如圖:
注意:這裡python3是使用python3你的程式碼使用python3的直譯器來解釋,也就是你寫的程式碼是python3的程式碼,而命令python是使用python2的直譯器
3.python直譯器
上述編譯,確切地說應該是解釋,python是解釋性語言,它的直譯器有很多,而在現在的Linux上預設會安裝python2,可以使用以下命令來檢視已安裝python2和python3的版本
其實上述預設安裝的python的官方直譯器Cpython(使用C語言開發的),還有其他型別的python直譯器,但Cpython使用最廣泛
4.Python解釋執行原理
此處轉載自:https://l62s.iteye.com/blog/1481421
這裡的解釋執行是相對於編譯執行而言的。我們都知道,使用C/C++之類的編譯性語言編寫的程式,是需要從原始檔轉換成計算機使用的機器語言,經過連結器連結之後形成了二進位制的可執行檔案。執行該程式的時候,就可以把二進位制程式從硬碟載入到記憶體中並執行。
但是對於Python而言,python原始碼不需要編譯成二進位制程式碼,它可以直接從原始碼執行程式。當我們執行python檔案程式的時候,python直譯器將原始碼轉換為位元組碼,然後再由python直譯器來執行這些位元組碼。這樣,python就不用擔心程式的編譯,庫的連結載入等問題了。
對於python解釋語言,有以下3方面的特性:
- 每次執行都要進行轉換成位元組碼,然後再有虛擬機器把位元組碼轉換成機器語言,最後才能在硬體上執行。與編譯性語言相比,每次多出了編譯和連結的過程,效能肯定會受到影響。
- 由於不用關心程式的編譯和庫的連結等問題,開發的工作也就更加輕鬆啦。
- python程式碼與機器底層更遠了,python程式更加易於移植,基本上無需改動就能在多平臺上執行。
在具體計算機上實現一種語言,首先要確定的是表示該語言語義解釋的虛擬計算機,一個關鍵的問題是程式執行時的基本表示是實際計算機上的機器語言還是虛擬機器的機器語言。這個問題決定了語言的實現。根據這個問題的回答,可以將程式設計語言劃分為兩大類:編譯型語言和解釋型語言。
- 編譯實現的語言,如:C、C++、Fortran、Pascal、Ada。由編譯型語言編寫的源程式需要經過編譯,彙編和連結才能輸出目的碼,然後由機器執行目的碼。目的碼是有機器指令組成,不能獨立執行,因為源程式中可能使用了一些彙編程式不能解釋引用的庫函式,而庫函式又不在源程式中,此時還需要連結程式完成外部引用和目標模板呼叫的連結任務,最後才能輸出可執行程式碼。
- 解釋型語言,直譯器不產生目標機器程式碼,而是產生中間程式碼,這種中間程式碼與機器程式碼不同,中間程式碼的解釋是由軟體支援的,不能直接使用在硬體上。該軟體直譯器通常會導致執行效率較低,用解釋型語言編寫的程式是由另一個可以理解中間程式碼的解釋程式執行的。和編譯的程式不同的是, 解釋程式的任務是逐一將原始碼的語句解釋成可執行的機器指令,不需要將源程式翻譯成目的碼再執行。對於解釋型語言,需要一個專門的直譯器來執行該程式,每條語句只有在執行是才能被翻譯,這種解釋型語言每執行一次就翻譯一次,因而效率低下。
- Java直譯器,java很特殊,java是需要編譯的,但是沒有直接編譯成機器語言,而是編譯成位元組碼,然後在Java虛擬機器上用解釋的方式執行位元組碼。Python也使用了類似的方式,先將python編譯成python位元組碼,然後由一個專門的python位元組碼直譯器負責解釋執行位元組碼。
- python是一門解釋語言,但是出於效率的考慮,提供了一種編譯的方法。編譯之後就得到pyc檔案,儲存了位元組碼。python這點和java很類似,但是java與python不同的是,python是一個解釋型的語言,所以編譯位元組碼不是一個強制的操作,事實上,編譯是一個自動的過程,一般不會在意它的存在。編譯成位元組碼可以節省載入模組的時間,提高效率。
- 除了效率之外,位元組碼的形式也增加了反向工程的難度,可以保護原始碼。這個只是一定程度上的保護,反編譯還是可以的。