目錄編程
1. 庫(Library)的定義微信
2. 爲何須要庫網絡
3. 庫是如何生成app
4. 庫裏面有什麼框架
5. 庫的分類socket
6. 如何建立庫tcp
7. 什麼是標準庫函數
8. 標準庫的優勢工具
在上一篇文章當中咱們分析了hello world這個程序的第一行,那麼咱們接下就開始看後面的代碼,可能有人會說了,這麼簡單的代碼還有什麼可看的,同窗們,有句話說的很是好,魔鬼在細節,那麼這個魔鬼在這裏就是printf函數。學習
printf人人都會用,從寫hello world就開始用,用了這麼多年簡直是使用最多的函數,調試bug的必備利器,可是,親愛的同窗,你有沒有想過就是這個咱們習覺得常當作空氣同樣存在的的函數究竟是怎麼實現的,它在哪裏被實現的,這個函數的實現文件咱們都沒有看到過,那麼咱們的hello world到底又是怎麼調用到這個函數的呢,printf究竟是怎麼把hello world打在屏幕上讓咱們看的呢,這些你能詳詳細細的說清楚嗎?若是你還不能清楚明白的解釋這些問題,這些問題對你仍是一團迷霧的話,那麼接下來的我會在後面的文章當中一一爲你們詳細講解。
說這些但願你們能保持一顆好奇的心,本質上這也是人類文明得以發展到今天的緣由,若是牛頓對蘋果落地也像你們對printf習覺得常同樣,我想萬有引力定律可能要向後推遲不少年了,牛頓萬有引力的發現絕對是影響人類文明的里程碑事件,具體爲何就不在計算機課程上展開說了,歸納的說就是萬有引力的發現讓人們第一次認識到大天然也是有規律今後解放了長期禁錮歐洲人思想由此誕生了一批猛人極大的推進了文明的發展之類,具體請參考西方歷史哲學史天然科學史等一系列史字結尾的書以及相似課程。在這個快節奏高壓力的現代生活中,不少人已然迷失了本身,雖然外在環境如此寫這些仍是但願你們能在本身心裏能保留一方淨土,在這片淨土上你依然有着這採菊東籬下悠然見南山的悠然自得,在你深夜加班回家後還能擡頭看一看天上的星空,你還能靜下心來好好思考一些問題,請保持珍貴的好奇心。
抒情完畢。
如今是時候給你們介紹一下關於這一主題隱藏在冰山之下的一部分,這一部分叫作C標準庫(C standard library)。
介紹一下標準庫,這個所謂的標準庫但願你們能理解一下,所謂標準庫,首先它是一個庫,那庫又是什麼呢,計算機科學當中有好多術語,一聽上去真的很唬人,這些很唬人的詞每每讓初學者誤覺得這個東西必定很高深,很難,而那些已經理解這些詞語的人爲了讓後來者也認爲這些真的很高深很難因此每每不作任何解釋,其中一些術語你確定很熟悉 好比這裏的庫,socket,面向鏈接,stream等等,我永遠都不能理解爲何國內的做者不論是本身寫的技術書籍仍是翻譯過來的就不能好好解釋一下這些名詞,我以爲計算機學習起來仍是有必定的門檻的,這其中的一部分就在於計算機文化方面,這就相似於咱們很難理解好比零零後喜歡的二次元,裏面有不少術語每每讓人一頭霧水同樣,這些文化上的阻隔會成爲進入這個領域的第一道障礙,在這裏我會盡力用易懂的方式給你們講清楚這些很唬人的詞語究竟是什麼意思。
1. 庫(Library)的定義
讓咱們首先來看看到底什麼纔是庫,總結起來一句話就是:
別人(或者本身)已經寫好的現成可用的一堆可重複使用的代碼
這就是庫定義了,這裏的一堆代碼能夠是針對某個特定功能的代碼,好比專用於數字分析計算的庫,能夠是實現某些功能的框架(至於什麼是框架呢,見文章末尾),好比一些圖形庫,Libevent之類,也是能夠本身積累的一些小工具,好比實現字符串操做之類功能,這些均可以稱之爲庫。我的以爲其本來的英文更形象一下,Library原本就是圖書館,書庫,資料室之類的意思,因此能夠形象的把庫理解爲相關主題的資料,書籍,若是你想了解(使用)一些特定的主題,只須要找相關的書籍資料就能夠了,和這裏的庫的意思是同樣的。
![](http://static.javashuo.com/static/loading.gif)
介紹完了什麼是庫,那麼你可能會想,到底咱們爲何須要用到庫這麼個東西呢,那接下來首先來回答一下這個很重要的問題。
2. 爲何須要庫(Library)
一我的的力量終歸是有限的,咱們每一個人都不是孤島,總須要和其它人一塊兒協做來完成某項工做,對於編程,也是一樣的道理,若是某些咱們須要的功能別人已經實現實現了,咱們直接來用就行了。
爲何須要庫總結下來就是一句話:
站在其它人的肩膀之上
很明顯這裏改編自著名大物理學家牛頓的名言,在被問及爲何能取得如此巨大的成就時,牛頓謙虛的說到本身只是「站在了巨人的肩膀之上」,以牛頓學術成就如此之人尚且須要藉助於其它人的研究成果,做爲平凡的勞苦大衆之廣大碼農更是沒有理由不去借助於其它人的代碼了。
在計算機世界當中,庫,就是其它人的肩膀
咱們使用的C標準庫,程序所運行之上操做系統(從某種角度上看,操做系統也能夠看作庫,由於沒有操做系統的話,若是咱們想運行一個程序還要本身來管理CPU,內存等硬件資源) ,處理網絡數據的TCP/IP協議棧(你在寫socket程序的時候從沒有關心如何處理tcp協議丟包如何處理,如何進行超時重傳等等吧,一樣TCP/IP協議棧也能夠看作是庫),由於TCP/IP協議棧已經把這些最複雜最瑣碎的工做給你完成了,當你在寫本身的程序時只須要專一於完成本身的事情就能夠了,其它的事情交給完成特定功能的庫就能夠了。
因此這下你應該明白了吧,咱們每一個人都不是萬能的,總有咱們擅長的和不擅長的,寫程序也是這樣,好比我須要一些能進行矩陣運算的函數,可是本身實現起來太複雜了,而與此同時又有這樣的能夠進行科學計算的現成的庫,那那咱們爲何不直接使用這些已經歷經考驗的高效優秀的庫呢,使用現成的庫能夠大大加快項目項目的開發進度,目前國內不少互聯網公司,不少項目都是直接使用優秀的開源實現,在此基礎之上實現業務邏輯,從而實現項目的快速開發,快速迭代,這些都是經過藉助其它人的代碼來實現的。因此說,某項本身想要的功能若是其它人已經實現了,並且實現的還不錯,那爲何不直接只是用呢,而是用其它人的代碼可能是是以庫的形式來使用的,因此:
人生苦短,咱們用庫
(注意這裏的意思是讓你們不要去造輪子(庫),可是知道一些輪子是如何造出來的仍是很重要的,好比操做系統,好比計算機網絡,或者對於任何你感興趣的庫我都鼓勵你們去看看究竟是怎麼實現的,可是對於工程項目來講,仍是那句話,不要造輪子,除非當前的輪子已經不適用於你的車速了)
咱們在這一節中瞭解了爲何須要庫,那麼庫是如何生成的呢? 接着往下看。
3. 庫是如何生成
讓咱們先來猜猜,庫是如何生成,既然咱們在上一節中說過,其它人的代碼可能是以庫的形式發佈的,那麼庫就是由代碼生成的。可能不少人都說,這不是廢話嗎,是的,這種看似廢話的推理每每都是直白簡單的,而簡單的東西不容易出錯,這種這種不易出錯的推理正是咱們一步一步進行探索的重要基礎。
說到這裏就不得不說一下源文件和目標文件(Object File)了。
咱們知道,CPU不能執行if...else...,int a = b+c,等等這樣的咱們人類能看懂的程序,CPU能夠執行的偏偏是咱們人類及其不容易看懂的二進制指令01011000等等,從這些基本常識中咱們就能夠知道了,既然咱們寫的是if...else...,int a = b+c等等這樣人類能看懂的程序,並且咱們寫的這些程序CPU還能運行起來,那麼必然須要某個什麼東西把咱們寫的代碼翻譯成CPU能看懂的01二進制指令,,而執行程序翻譯工做的翻譯官就是一個叫作編譯器的東西,咱們寫的程序被編譯器翻譯過來給CPU看的就叫作目標文件(Object File),如圖所示:
![](http://static.javashuo.com/static/loading.gif)
咱們寫的每一個.c文件文件都叫作源文件,每一個源文件別翻譯官編譯器翻譯後生成的文件是目標文件,注意源文件和目標文件是一一對應的。每一個源文件當中就是咱們寫的人類可讀的代碼啦,而目標文件當中對應的就是CPU能夠讀懂的二進制二進制指令啦。你能夠簡單的理解源文件就是中文,而目標文件就是對應的英文,而CPU只能看懂英文(固然,但願有朝一日,CPU也能讀懂中文)。
有的同窗可能會問,那頭文件(include File)呢,請對此還不太瞭解的同窗參考個人上一篇文章叫作《不簡單的Hello World之頭文件》,那裏面會有關於頭文件的詳細描述。簡單的說就是,編譯器不會編譯頭文件,頭文件的處理是一個叫作預編譯器的東西來完成的。編譯器只處理源文件,而後把源文件中的程序翻譯成二進制文件生成對應的目標文件。
既然咱們瞭解了源文件以及對應的二進制指令目標文件,那麼咱們就能夠接下里給你們介紹一位計算機世界當中的幕後英雄了,這也是冰山水面之下的一位重量級選手,它就是連接器(Linker)。從名字當中你應該能猜出來它作什麼的,連接器嘛,主要就是把一些東西給拼裝起來的。連接器拼裝的是什麼呢,連接器拼裝的就是上面咱們介紹的目標文件(Object File)。
![](http://static.javashuo.com/static/loading.gif)
連接器的做用就是把編譯器翻譯的多個源文件生成的多個對應的目標文件打包起來生成一個文件。這就是庫,從這裏同窗們應該看出來了吧,庫裏面包含了咱們源文件裏的全部代碼了,更重要的是,更重要的是什麼呢,同窗們看出來了嗎,更重要的是,這個連接器鏈接好生成的單獨的一個文件庫裏面已經就是CPU能看懂的二進制指令了,有的同窗又會問了,爲何呢,由於連接器鏈接的是目標文件啊,如圖上面圖所示,咱們上面也說過目標文件裏面就是翻譯官編譯器翻譯的CPU能讀懂的二進制文件了,既然庫裏面就已是程序的二進制形式了,因此這裏有一個好處,那就是,當咱們使用庫的時候就省去了編譯這樣一個環節,要知道在大型項目中,編譯時間動不動就是幾十分鐘一個小時,因此提早把一些模塊編譯成庫能夠極大的縮短編譯時間。關於庫是如何生成的,這下你應該看明白了吧。這裏關於連接器的介紹是很隆重的,可是描述是很簡短的,這麼重要的利器只簡單介紹這麼一點這麼能夠呢,太不給連接器(Linker)面子了吧,彆着急,我會在下一篇文章當中用整整一章來給你們詳細講解連接器(Linker),敬請期待。
因爲本篇文章較長,我會分兩篇來介紹本主題,接下來的內容會在下一篇文章中介紹,謝謝你們。