1. 程式人生 > >Python、編譯解釋、動態庫靜態庫、編譯過程、頭文件了解一下

Python、編譯解釋、動態庫靜態庫、編譯過程、頭文件了解一下

ack 第三方庫 轉換 ado 學習 執行 article 共享 CP

學習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、編譯解釋、動態庫靜態庫、編譯過程、頭文件了解一下