秉心識本源,於事少凝滯。-- 《信行遠修水筒》git
要想徹底的瞭解一個系統惟一的方法就是去閱讀這個系統的源代碼實現!這個原則對於一個iOS程序員也是如此。很幸運的是咱們如今處於一個開源代碼迸發的美好時代(這裏要感謝理查·馬修·斯托曼以及他的GNU計劃),不少優秀的庫都以源代碼的形式呈現給你們,甚至連iOS這種封閉的系統也迫於某種壓力開放了部分源代碼(雖然開放的部分並不必定和真實的相同),這也已經足以給了咱們不少熱情去窺探其內部的一些實現機制。目前網絡上也有很是多的基於蘋果的開源而介紹OC2.0的runtime原理以及runloop實現機制以及類的+load方法執行時機等等方面的文章。程序員
當咱們但願走更遠時就會發現有一座大山阻擋着咱們的去路。由於系統的閉源特性使得咱們沒法閱讀到其中全部的源代碼以及核心實現。那麼是否咱們就只能裹足不前了呢?github
回答是NO!編程
源代碼有高級形式的源代碼也有低級形式的源代碼。當咱們被高級形式的源代碼所阻時,低級形式的源代碼卻依舊爲咱們敞開着大門,就看你願不肯意去找那把鑰匙並打開它。低級形式的源代碼是什麼呢? 答案就是機器指令!!數組
咱們知道凡是知足某個操做系統ABI規則的應用程序源代碼最終都會編譯和連接爲某種特定格式的一條條機器指令並在CPU上執行。若是說程序的高級語言實現對於一個程序員來講是它的源代碼的話,那麼對於CPU來講一個程序的機器指令序列就是它的源代碼。只不過機器語言對於不少人來講異常的晦澀難懂而已。網絡
很高興的一件事情就是雖然機器語言晦澀,咱們的前輩們發明出了一種所謂機器語言的助記語言:彙編語言app
彙編語言中的每條命令雖然幾乎和每條機器指令一一對應,可是卻加強了程序的可讀性,使得咱們面臨的再也不是一串乾巴巴的二進制數字了。君不見目前不少的反編譯工具以及即便是XCODE上咱們都能看到彙編語言的場景。正是由於彙編語言的出現使得咱們在閱讀和分析源代碼上就進了一大步!編程語言
當你精通匯編語言時!你看到的全部代碼都將是源代碼!函數
有人說彙編語言相對於高級語言來講依然晦澀難懂,但這其實並非絕對的。曾記得中國第一代程序員的求伯君以及雷軍這些前輩們最先接觸的就是彙編語言,並且他們也都是用匯編語言進行程序編寫的。就由於彙編語言離機器語言太近了,因此你們都會有一種望而生畏的感受。誠然這些低級語言並無像咱們使用的高級語言那樣更加符合天然語義和語法規則,可是它的優勢就是很是的直接和單純。當你深刻的應用它時就會發現彙編其實並無那麼的複雜。在一個程序的機器指令中,大部分的指令代碼所作的事情除了計算外就是將數據在寄存器與寄存器之間以及寄存器與內存之間進行移動。在高級語言中咱們能夠定義很是個性化的變量以及無限制的變量,而在低級語言中咱們則只能使用那幾個有限的寄存器來做爲臨時變量,以及像訪問數組那樣去訪問內存地址。工具
下面的一張圖能夠看到實現一個累加功能代碼片斷的機器語言和彙編語言以及高級語言之間的差異:
看上面的代碼時也許你對高級語言所表達的意義一目瞭然,而對於彙編語言的表達也許仔細多讀幾遍就能瞭解其意義,而對於機器語言則多是一頭霧水了。
說了這麼多,也許有人會問彙編語言和我想要深刻iOS系統底層有什麼關係!
好問題! 答案就是iOS系統的封閉性,使得咱們沒法窺探到不少系統的底層實現, 而且當咱們被某種問題或者某個實現原理所困擾卻不得其法時,就能夠經過對系統進行反編譯而獲得彙編語言來了解和閱讀其實現原理;當咱們面臨突如其來的運行時崩潰時,就能夠經過閱讀彙編語言來了解其產生的緣由;當咱們的crash並無上下文時,就能夠經過彙編語言來定位和解決問題;當咱們想解決某個問題而想作動態下發補丁時咱們也能夠藉助彙編語言來完成;當咱們想在越獄的機器上hook住某些應用時咱們能夠經過彙編語言來完成功能;當咱們想最大的優化咱們的系統以及某些關鍵部分的代碼的性能時咱們能夠藉助彙編語言;當咱們想當一個黑客時咱們能夠藉助彙編語言...,咱們能借助彙編語言作的事情實在是太多太多了。 如今的應用編程語言都是愈來愈向高級語言發展,而呈現出簡單化、智能化從而致使進入的門檻愈來愈低。越高級的語言由於其封裝性就越離底層實現原理越遠,你所能窺探的東西就越少,所以低級語言仍是很是具備頑強的生命力和存在必要性的。君不見iOS所開源的runtime的源代碼裏面關於objc_msgSend函數的實現就是用匯編語言來編寫的!這樣的目的就是讓這個函數的性能獲得最大的優化。
因此說掌握和了解彙編語言知識不只是進入iOS系統底層而且也是進入全部系統底層的一把鑰匙,當你精通或者瞭解一些基礎的彙編語言知識和技巧時,你就打開了通往一切都是源代碼的大門。值得一提的就是我並不打算詳細的去介紹關於彙編的一切,其實咱們只要瞭解一些基礎的彙編知識就能很是方便的幫助咱們解決不少的事情。
敬請期待下一篇:深刻iOS系統底層之指令集介紹
一直想寫一些關於系統底層方面的知識點,而且醞釀了好久。後來也跟其餘人交流,你爲什麼不出一個系列呢? 沒必要要一次性把全部的東西都寫完後才發表。我據說後以爲很是的有道理,所以我想在這裏分享一些介紹iOS系統底層的一系列文章。這是第一篇開頭的引子,雖然本身的水平也很通常,可是想一想本身仍是有一些積累的,即便是有問題或者是有錯誤也能夠發表出來供你們評論和指責嗎。最終的目的是你們共同進步,只要達到了這一點我也就知足了。後續的日子我將會爭取每週在這個系列中對iOS系統底層進行一系列的展開,先列出一個大概的綱要,固然也許後續會有變化:
目錄