《程序是怎样跑起来的》学习笔记
前言
《程序是怎样跑起来的》是日本作者矢泽久雄的著作。这本书我已经是第3遍看了,每次看都会有些不同的感受。这本书适合有一定编程基础后再来看,适合进一步提升编程技能的初级程序员。每次看,对某一些章节会有新的体会,故记录下来,以后有新的感受再补充进来。
1. 对程序员来说CPU是什么
1.1. CPU的内部结构解析
控制器:负责把内存上的指令和数据读入寄存器,并根据执行的执行结果控制计算机。
运算器:运算从内存读入寄存器的数据。
寄存器:暂存指令和数据的的地方,可看做内存的一种。
时钟:发出CPU开始计时的时钟信号,时钟信号频率越高,CPU运行越快。
1.2. CPU是寄存器的集合体
程序是把寄存器作为对象描述的。
程序计数器:决定程序流程;存储下一条指令所在内存的地址
标志寄存器:存储运算处理后的CPU的状态
基址寄存器:存储数据内存的起始地址
变址寄存器:存储基址寄存器的相对地址
累加寄存器:存储执行运算的数据和运算后的数据
指令寄存器:存储指令。CPU内部使用,程序员无法通过程序对该寄存器进行读写操作。
栈寄存器:存储栈区域的起始地址。
通用寄存器:存储任意数据
1.3. 决定程序流程的程序计数器
1.4. 条件分支和循环机制
1.5. 函数的调用机制
【机器语言中call指令】
- 函数调用使用的是call指令,而不是跳转指令
- 在将函数入口地址设定到程序计数器之前,call指令会把调用函数后要执行的指令地址存储在名为栈的主存内。
【机器语言中的return指令】
- 函数处理完成后,再通过函数的出口来执行return命令。
- return命令的功能是把保存在栈中的地址设定到程序计数器中。
【跳转指令和call&return指令的区别】
- 跳转指令不涉及栈
- call和return涉及栈
1.6. 通过地址和索引实现数组
1.7. CPU的处理方式其实很简单
2. 数据是二进制数表示的
2.1. 用二进制数表示计算机信息的原因
字节是信息的基本单位
2.2. 什么是二进制数
2.3. 移位运算和乘除运算的关系
- 左增右减
- 可以替代乘除法
4. 便于计算机处理的"补数“
计算机在做减法时,实际上内部在做加法运算。
【补数】
- 表示负数
- 补数就是用正数表示负数
- 补数的计算方式:取反加1
- 将二进制数的值取反加1的结果,和原来的值相加,结果为0。即一个数和它的补数相加为0。
2.5. 逻辑右移和算数右移的区别
左移时逻辑左移和算数左移都只需要在空出来的低位补0即可;右移时算数右移和逻辑右移有区别。
逻辑右移:移位后,需要在空出来的高位补0。
算数右移:移位后,需要在空出来的高位补符号位的值(0或者1),正数补0,负数补1。
2.6. 掌握逻辑运算的窍门
3. 计算机进行小数运算时出错的原因
3.1. 将0.1累加100次也得不到10
3.2. 用二进制数表示小数
3.3. 计算机运算出错的原因
3.4. 什么是浮点数
浮点数:用符号、尾数、基数和指数这四部分来表示的小数。
3.5. 正则表达式和EXCESS系统
3.6. 在实际的程序中进行确认
3.7. 如何避免计算机计算出错
- 回避策略
- 小数转换为整数
- BCD方法
2.8. 二进制数和十六进制数
4. 熟练使用有棱有角的内存
4.1 链表使元素的追加和删除更容易
4.2 二叉查找树使数据搜索更有效
5. 内存和磁盘的亲密关系
5.1 不读入内存就无法运行
5.2 虚拟内存把磁盘作为部分内存来使用
5.3 节约内存的编程方法
- 通过DLL文件实现函数共有
- 通过调用_stdcall来减小程序文件的大小
6. 亲自尝试压缩数据
6.1 文件以字节为单位保存
6.2 用二叉树实现霍夫曼编码
7. 程序是在何种环境中运行的
8. 从源文件到可执行文件
8.1 计算机只能运行本地代码
8.2 程序加载时会生成栈和堆
栈:用来存储函数内部临时使用的变量(局部变量),及函数调用时所用的参数的内存区域。
堆:用来存储程序运行时的任意数据及对象的内存区域
相同点:内存空间都是程序运行时得到申请分配
不同点:栈的数据的内存空间由编译器自动申请和释放,不需要程序员负责;堆的内存空间需要根据程序员编写的程序,来明确申请和释放,这就极容易造成内存泄漏。
9. 操作系统和应用的关系
10. 通过汇编语言了解程序的实际构成
本书最重要的一章,可以多看几遍。
10.1 函数的调用机制
10.2 函数内部的处理
函数的参数是通过栈来传递,返回值是通过寄存器来返回的。
10.3 始终确保全局变量用的内存空间
10.4 临时确保局部变量用的内存空间
10.5 循环处理、条件分支的实现方法
高级语言的循环处理和条件分支在汇编语言里面都会用到cmp指令和跳转指令。
10.6 了解程序运行方式的必要性
11. 硬件控制方法
12. 让计算机“思考”
后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技
,扫描下方二维码或者搜索每日学一技
关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!