Logics - CSAPP C3

在解决完计算机对于表达这个世界后,对于最终使用计算机去解决现实问题,还有一步需要跨越,也就是现实的动态部分。

世界除了有着我们视角的静态三维,还有这它最迷人的动态四维,一般来说以时间代指,时间使得我们世界从大爆炸一步步成为现在的样子,我们常以河流来比喻,就像一股流状态来驱动着所有静态事物的改变。而计算机对于问题的描述当然要模拟这个过程,前人们便去探索我们这复杂世界问题的那些基础部分。

计算机科学家的结论很简洁,一切的过程,用顺序和分支加循环(核心是基于表示的状态的转化)就可以表达,那么对于这个过程的构建就是计算机构建roadmap在解决表示的问题后的首要问题

就如我们有形形色色的方言一样,计算机也有这自己的方言-指令集,虽然最终都是对于顺序和分支的表达,但是有自己不同的语调。而到了高级语言如C层面,借助于先人给我们的抽象层,语言又达到了归一,一方面说明了抽象的强大和意义,另一方面也说明了整个计算机还是同一个浑然的体系。

指令集的构建也是一个探索的过程,有点像鸡和蛋的关系,没有指令集便无法构建出程序,而指令集也需要程序的需要和数字电路能够实现的逻辑去达到一个精妙的平衡点,慢慢相互磨合,便有了当今的风云指令集,8086系,程序从由c到8086汇编最终到一个个2进制位,而机器则是从一个个2进制位的执行,最终完成我们想要的各种操作。

指令集自然要基本的完成对于整个计算机“计算”过程的抽象



在数据在处理器和内存的倒腾中,我们需要一些凭借:
对于x86处理器来说我们需要

程序计数器(PC, Program counter) - 存着下一条指令的地址,在 x86-64 中称为 RIP
寄存器(Register) - 用来存储数据以便操作
条件代码(Codition codes) - 通常保存最近的算术或逻辑操作的信息,用来做条件跳转

简单来说也就是处理器执行 存取,计算(条件),传输的功能,而由此我们汇编语言也就自然而然的有了 指令 操作数1 (,操作数2 ,操作数3) 这样的的一般形式

框架有了,下一步就是约定,寄存器本身结构上没有差异,但是我们可以赋予其含义,以X86系列为例

%rax(%eax) 用于做累加
%rcx(%ecx) 用于计数
%rdx(%edx) 用于保存数据
%rbx(%ebx) 用于做内存查找的基础地址
%rsi(%esi) 用于保存源索引值
%rdi(%edi) 用于保存目标索引值

寄存器作为处理器的亲儿子,有着当前运算最紧要的数据,但是奈何空间价格比与内存差距巨大,最主要的大量数据还是在内存中,而整个过程就是指令集要实现最基本的一个过程,也就是处理器要实现的过程。但是内存又不像寄存器那样直接对应命名,处理这么一片广饶的土地,那么又需要对整个内存进行抽象。简言之,需要“寻址”这个过程的实现(TODO: 寻址展开)

而“计算框架”和“数据”都准备好后,指令集要解决的问题就是“流程”了。
除了自然的通过“跳转”来对流程进行控制,还有一个重要的概念就是“过程调用”,正如我们现实的计算一般,一个计算的流程,往往最多的是类似的各种公式(过程调用)计算,然后再补上特定的整理(流程)计算。而过程调用主要包含三个方面

传递控制:包括如何开始执行过程代码,以及如何返回到开始的地方
传递数据:包括过程需要的参数以及过程的返回值
内存管理:如何在过程执行的时候分配内存,以及在返回之后释放内存

抽象的能力又闪亮登场了,先人们用“栈”这个结构对过程调用完美的进行了抽象,利用栈来完成过程调用 (TODO: 栈展开)

你可能感兴趣的:(Logics - CSAPP C3)