《程序是怎样跑起来的》读书笔记

/ 0评 / 0

最近读了《程序是怎样跑起来的》一书,在此做些简单的记录,方便日后回顾。


文章目录 显示

简介


简评

本书的核心问题是“从用户双击程序图标到程序开始运行之间到底发生了什么?”,回答是“机器语言程序被加载到内存中,由 CPU 进行解析和运行,进而计算机系统整体的控制和数据运算也开始运行。”作者对发生过程涉及到的相关计算机知识进行了比较全面的讲解,图文并茂,通俗易懂(像是在做阅读理解)。

作为一本计算机系列的科普书籍,该书既适合对计算机了解甚少的小白读者入门,也适合具有一定计算机基础的读者查漏补缺。我觉得在有一些实操经历后再来回顾理论知识可能会感受颇深:)。

当然,它也有着科普书的“通病”:很难做到深度。所以想要进行更加深入的了解,推荐阅读《深入理解计算机系统》《计算机组成原理》。此外,可能因为翻译的问题,书中也有少量地方难以理解,可以查询网上的博客辅助阅读。

对我来说,印象比较深刻的内容包括函数的调用机制二进制中小数的处理(浮点数的表示)程序的运行机制,以及一些基本概念的定义

后面的笔记可以略过,一不小心从简单记录变成详细记录了:)


笔记

无论任何事情,了解其本质非常重要。只有了解了本质才能提高利用效率。这样一来,即使有新技术出现,也能很容易地理解并掌握。

对程序员来说 CPU 是什么

导读

CPU 的内部结构

CPU 是寄存器的集合体

种类 功能 数量
累加寄存器( accumulator register ) 存储执行运算的数据和运算后的数据 1
标志寄存器( flag register ) 存储运算处理后的 CPU 的状态 1
程序计数器( program counter ) 存储下一条指令所在内存的地址,决定着程序的流程 1
基址寄存器( base register ) 存储数据内存的起始地址 1+
变址寄存器( index register ) 存储基址寄存器的相对地址 1+
通用寄存器( general purpose register ) 存储任意数据 1+
指令寄存器( instruction register ) 存储指令。CPU内部使用,程序员无法通过程序对该寄存器进行读写操作 1
栈寄存器( stack register ) 存储栈区域的起始地址 1


- 机器语言指令的主要类型和功能

类型 功能
数据转送指令 寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作
运算指令 用累加寄存器执行算术运算、逻辑运算、比较运算和移位运算
跳转指令 实现条件分支、循环、强制跳转等
cal / ret 指令 函数的调用/返回调用前的地址

条件分支和循环机制

函数的调用机制

数据是用二进制数表示的

用二进制数表示计算机信息的原因

便于计算机处理的“补数”

掌握逻辑运算的窍门

计算机进行小数运算时出错的原因

用二进制数表示小数

计算机运算出错的原因

什么是浮点数

熟练使用有棱有角的内存

内存的物理机制很简单

内存的逻辑模型是楼房

简单的指针

数组是高效使用内存的基础

栈、队列以及链表

内存和磁盘的亲密关系

导读

不读入内存就无法运行

磁盘缓存与虚拟内存

节约内存的编程方法

磁盘的物理结构

压缩数据

文件以字节为单位保存

RLE算法的机制

哈夫曼算法的基础

程序是在何种环境中运行的

运行环境 = 操作系统 + 硬件

Windows 克服了 CPU 以外的硬件差异

不同操作系统的 API 不同

提供相同运行环境的 Java 虚拟机

BIOS和引导

从源文件到可执行文件

计算机只能运行本地代码

编译器负责转换源代码

仅靠编译是无法得到可执行文件的

启动及库文件

DLL文件及导入库

可执行文件运行时的必要条件

程序加载时会生成栈和堆

有点难度的Q&A

操作系统和应用的关系

操作系统功能的历史

系统调用和高级编程语言的移植性

Windows操作系统的特征

通过汇编语言了解程序的实际构成

汇编语言和本地代码是一一对应的

不会转换成本地代码的伪指令

汇编语言的语法是“操作码+操作数”

对栈进行 push 和 pop

函数调用机制

函数内部的处理

始终确保全局变量用的内存空间

临时确保局部变量用的内存空间

了解程序运行方式的必要性

硬件控制方法

支撑硬件输入输出的IN指令和OUT指令

外围设备的中断请求

文字及图片的显示机制


推荐

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注