秉心识本源,於事少凝滞。-- 《信行远修水筒》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系统底层进行一系列的展开,先列出一个大概的纲要,固然也许后续会有变化:
目录