读《深入理解计算机系统》(一)

从开始iOS程序开发到现在,干的工作也不少了,大体无非就是那几种,画页面,写工具,造轮子,优化APP性能等等的工作,说实话到现在为止也没时间学习底层,好好研究算法这些,心里还是有些不安的。总想着找时间学学新技术加强下水平。

最近在读《深入理解计算机系统》这本书,朋友推荐的,豆瓣评分九点几分,相当不错。看了一周,有些收获,记录下来以后回看。

   

一。计算机是如何运行我们的OC呢?或者说是如何运行高级编程语言呢?

 

我们都知道计算机运行是靠二进制来计算,计算机的CPU是由很多的晶体管,二极管,单片机组成的,当我们在代码中写下x=2,y=3,z=x+y,NSLog(@“%@”,z);的时候,我们知道在内存中开辟了3个空间,一个是x,他的值是2,同理y是3,还有一个是z,是指针,没有输入值。但是下面我又打印了z的值,是需要先计算然后把这个值给z的。

这时候CPU就要计算了,CPU中有一个叫加法器的东西,首先把x的值取出来是2,转换成2进制是10,然后是y的二进制值是11,计算出的结果是5,也就是101,这样就计算出了这个值。

但是计算机是属于电子器件,它怎么来表示101也就是5这个值呢?电子件,当然是通过电压来控制了,这里要说一下为啥计算机来用二进制计算,我们生活中用十进制不是很方便么?要知道计算机的CPU是由无数个晶体管组成的,如果使用十进制来计算,就要有1-10个开关来控制1-10这10个数来进行加减法的运算,如果用二进制呢。是不是就减少了很多个开关的组成,但是同样组成的运算结果就会多很多倍。计算2+3的时候,表示2的这个开关给1v电压,表示3的这个开关给1v电压其他的给0v就行了。如果计算的是2+3+9+100+22,CPU的加法器就会采用一种级联的机制,先计算2+3的结果,然后传到下一个加法器跟9计算,再往下一个加法器传这样,逐级相加就得出了结果。

 

那么在电路中逻辑是如何实现的呢?比如我们写一段代码printf("xxxx");我们把它分解一下,由两部分组成,一个是单词printf。一个是打印的内容xxxx。xxxx这个字母是可以通过Unicode编码找到对应的二进制的值的,同理汉字也是一样,再说这个printf。高级语言编译运行能被电路识别运行的步骤是在倒数第二步转换成汇编语言的,c语言是比汇编语言高一级的封装,比如我计算加法的时候,计算中的“+”就是汇编中的ADD,计算机电路识别到了ADD后直接调用加法器,而c语言把ADD封装成了一个“+”所以我们可以直接写2+3.同理,printf也是对汇编语言中的打印print的一层封装,在电路运行的时候识别了汇编的print,也就执行了打印,即把存储的xxxx的内存全给打印。

 

再比如我执行了一个for循环的逻辑,for循环转换成汇编,汇编理解我的意思后在内存中会循环调用for循环当前的tag值所指向的内存的值来执行循环内的逻辑。

 

以上就是我所理解的计算机是如何运行高级程序语言的、一些浅见,如有不对请大神指正。

 

扫下面的二维码关注iOS程序开发交流公众号,大家有问题可以留言,没事可以多多交流学习哈:

 

其他文章请查看个人博客:http://zhangqq166.cn/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值