Python、編譯解釋、動態庫靜態庫、編譯過程、頭文件了解一下
學習Python這門語言首先要了解 什麽是編譯與解釋,什麽是連接,什麽是動態庫與靜態庫,
什麽是編譯:
編譯就是先把高級語言設計的程序翻譯成二進制的機器語言,然後CPU直接執行機器碼就可以了。一把翻譯再執行
編譯型語言在於速度快。
什麽是解釋:
解釋就是在程序運行時,才把高級程序語言一條一條地翻譯成二進制的機器語言。邊運行邊翻譯成二進制機器語言。所以速度沒有編譯來得快。邊執行邊翻譯
解釋型語言的優點在於可以跨平臺。
Python語言的優點:
可移植性、可擴展性、可嵌入性
簡單、優雅、明確
開發效率高,有強大的第三方庫
Python語言的缺點:
速度慢
代碼不能加密
多線程不能利用多核(GIL的存在)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
靜態庫Lib和動態庫DLL:
1)首先什麽是庫:
庫(Lib)是一段編譯好了的二進制代碼,加上頭文件可以供別人使用。編譯程序是需要時間的!然後什麽是編譯呢?
為什麽要用到庫:有些情況代碼需要提供給別人使用,但是我們不希望別人看到源碼。可以以庫的形式進行封裝,只暴露頭文件。而且庫文件是已經編譯好的二進制文件,編譯的時候只需要link一下。
但是Link的方式有兩種:一種是靜態link,一種是動態link。
2)靜態庫Lib:(linux下叫作 .a)
靜態庫在編譯的時候會被拷貝一份到目標程序裏,是目標程序的一部分。
這樣做的好處在於減少目標程序對外部的依賴性。
壞處是目標程序變得太大了。
3)動態庫DLL:(linux下叫作 .so)
動態庫在編譯的時候,並不會被拷貝一份到目標程序中,目標程序存儲的是指向動態庫的引用。等到目標程序運行的時候,動態庫才會真正被加載進來。
動態庫的好處在於,不用拷貝到目標程序中,不影響目標程序的體積。同一份動態庫,可以被多個程序使用。所以動態庫又叫作共享庫。編譯時才載入的特性,可以隨時對動態庫進行替換,更新。不需要重新編譯代碼。
動態庫的缺點在於:會帶來一部分性能損失。也使得目標程序太過於依賴外部環境。一旦環境缺少動態庫或者庫的版本不正確。就會導致程序無法正常運行。
4)總結:
動態庫和靜態庫都是共享程序代碼的一種方式。二者區別在於鏈接階段,靜態庫被復制到程序當中,和程序運行的時候沒有關系。而動態庫在鏈接階段沒有被復制到程序中。而是程序在運行的過程中,由系統動態加載到內存中。
動態庫的優點在於還需要一次加載到內存中,不同程序可以共享內存中同一動態庫的副本。因此節省了很多內存。
庫是共享程序代碼的方式,將特定功能模塊化成庫的格式,方便分享與使用。
動態庫和靜態庫都是閉源庫,只能拿來滿足某種功能的使用。不會透露內部具體的代碼信息。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
編譯的過程:
這裏以C語言為例,因為Python就是用C語言編寫的嘛。Python解釋器是用來執行.py文本文件的。
編譯分為4個過程:1)預處理Preprocessing、2)編譯Compilation、3)匯編Assemble、4)鏈接Linking
1)預處理Preprocessing:
預處理用於將所有的#include頭文件以及宏定義替換成其真正的內容,預處理之後得到的仍然是文本文件,但文件體積會大很多。
預處理之後的程序還是文本,可以用文本編輯器打開。
2)編譯(Compliation):
這裏的編譯不是指程序從源文件到二進制程序的全部過程,而是指將經過預處理之後的程序轉換成特定匯編代碼(assembly code)的過程。
這個過程.c文件被匯編成.s文件。
3)匯編(Assemble):
匯編過程將上一步的匯編代碼轉換成機器碼(machine code),這一步產生的文件叫做目標文件,是二進制格式。
這一步會為每一個源文件產生一個目標文件.obj。
4)鏈接(Linking):
鏈接過程將多個目標文以及所需的庫文件鏈接成最終的可執行文件(executable file)。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
關於頭文件:
頭文件和庫其實不太一樣。
其實頭文件的主要作用在於多個代碼文件全局變量(函數)的重用、防止定義的沖突,對各個被調用函數給出一個描述,其本身不需要包含程序的邏輯實現代碼,它只起描述性作用,用戶程序只需要按照頭文件中的接口聲明來調用相關函數或變量,鏈接器會從庫中尋找相應的實際定義代碼。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
相關連接:
Python是一門什麽樣的語言:https://www.cnblogs.com/gaojun2017/p/6274540.html
動態庫和靜態庫詳解:https://www.cnblogs.com/striveLD/p/5752010.html
C語言編譯過程詳解:https://www.cnblogs.com/CarpenterLee/p/5994681.html
Python解釋器:http://man.chinaunix.net/develop/python/python2.3tut/tut/node4.html
頭文件與庫的區別:https://blog.csdn.net/mormont/article/details/53009795
什麽是.obj文件:https://www.cnblogs.com/ShadowHanlder/p/4410213.html
Python、編譯解釋、動態庫靜態庫、編譯過程、頭文件了解一下