《程序是怎样跑起来的》学习笔记

《程序是怎样跑起来的》学习笔记

    • 前言
    • 1. 对程序员来说CPU是什么
      • 1.1. CPU的内部结构解析
      • 1.2. CPU是寄存器的集合体
      • 1.3. 决定程序流程的程序计数器
      • 1.4. 条件分支和循环机制
      • 1.5. 函数的调用机制
      • 1.6. 通过地址和索引实现数组
      • 1.7. CPU的处理方式其实很简单
    • 2. 数据是二进制数表示的
      • 2.1. 用二进制数表示计算机信息的原因
      • 2.2. 什么是二进制数
      • 2.3. 移位运算和乘除运算的关系
      • 4. 便于计算机处理的"补数“
      • 2.5. 逻辑右移和算数右移的区别
      • 2.6. 掌握逻辑运算的窍门
    • 3. 计算机进行小数运算时出错的原因
      • 3.1. 将0.1累加100次也得不到10
      • 3.2. 用二进制数表示小数
      • 3.3. 计算机运算出错的原因
      • 3.4. 什么是浮点数
      • 3.5. 正则表达式和EXCESS系统
      • 3.6. 在实际的程序中进行确认
      • 3.7. 如何避免计算机计算出错
      • 2.8. 二进制数和十六进制数
    • 4. 熟练使用有棱有角的内存
      • 4.1 链表使元素的追加和删除更容易
      • 4.2 二叉查找树使数据搜索更有效
    • 5. 内存和磁盘的亲密关系
      • 5.1 不读入内存就无法运行
      • 5.2 虚拟内存把磁盘作为部分内存来使用
      • 5.3 节约内存的编程方法
    • 6. 亲自尝试压缩数据
      • 6.1 文件以字节为单位保存
      • 6.2 用二叉树实现霍夫曼编码
    • 7. 程序是在何种环境中运行的
    • 8. 从源文件到可执行文件
      • 8.1 计算机只能运行本地代码
      • 8.2 程序加载时会生成栈和堆
    • 9. 操作系统和应用的关系
    • 10. 通过汇编语言了解程序的实际构成
      • 10.1 函数的调用机制
      • 10.2 函数内部的处理
      • 10.3 始终确保全局变量用的内存空间
      • 10.4 临时确保局部变量用的内存空间
      • 10.5 循环处理、条件分支的实现方法
      • 10.6 了解程序运行方式的必要性
    • 11. 硬件控制方法
    • 12. 让计算机“思考”

前言

《程序是怎样跑起来的》是日本作者矢泽久雄的著作。这本书我已经是第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. 让计算机“思考”

你可能感兴趣的:(计算机基础,程序是怎样跑起来的)