logo头像

Hacked By Swing

非专业计算机基础 (1)

前言

最近有一些同学来问我关于学习 Python 的问题,考虑到许多都是非专业的同学,我其实在建议的时候也发现了一些问题,比如确实目前没有我认为还可以的相关教程或是资料,许多资料的目的非常不明确,说不清目的是面向非专业还是面向专业,或是整个体系架空,主要就是让你抄代码能够跑起来,但是至于其中的原理就不清不楚的。

这就需要提到我认为非专业同学学习计算机(比如学习 Python,不过我认为这不仅仅是 Python 的问题,很多同学学习 Python 只是因为对于他们来说这是目前大家说的很多,他们听说的一个需要学的东西,而不知道其他还有哪些东西,或者应该怎么学)的一些思路。比如我认为,对于非专业同学学习计算机,和专业同学的区别在于深度而不是广度,不是说你应该完全不看基础,而是应该允许你的基础不够扎实,但是在辅以搜索引擎等辅助措施的情况下,能够有独立解决问题的能力。

所以,出于这个目的,又考虑到目前我还没有见到值得推荐的、和我思路一致的资料,我决定自己来写一些。

关于这个系列

我将以博客的形式来写,博客的内容可能出现错漏,所以存在更新,所以在每一篇中,我将在最后留出更新的部分(即使目前还没有更新),如果有更新,我将写上更新的时间和大致内容,方便自己确定看到的内容是否存在问题。

另外,写这个部分完全属于我的娱乐,所以看心情更新,也不会有确定的内容,内容差不多凭我自己的感觉来,但是总的来说,主要还是写我认为一个非专业的同学想要学习计算机应该学习的一些内容,目标以形成概念和思路,然后细节由自己凭借搜索引擎补齐为主。

什么是计算机

我们首先从最基础的部分开始,什么是计算机?

据我所知,许多非专业的同学对于计算机的了解是极其有限的,所以我决定对这个部分也进行一些讲解。

我们对计算机的印象主要来源于我们的使用,比如我们使用笔记本电脑,手机等等,它们都是计算机。其实计算机的任务就是进行计算,那么为什么“计算”可以完成我们认为不算是计算的许多任务呢?比如我们通过计算机去填表、聊天,这些任务看起来都和“计算”没有什么关系,所以这些事情都是怎么回事?

这将是我觉得需要解决的第一个问题,就是理解“计算”和这些日常生活我们完成的任务的关系。

计算机的组成

现在我们将要用到几个我们经常会听到的一些词汇。

一台计算机中都有哪些部分?我们听说过一些,比如 CPU 、内存、显卡、硬盘,这些都是计算机的组成部分,但是它们各自是起什么作用的呢?

下面我们就来说一说计算机的运行过程,从运行过程,我们就可以了解到这些计算机组成部分各自的作用。

计算机的运行过程

计算机的任务是“计算”,粗略的说,也可以认为是运行程序。一个程序就是一些计算机指令,这些计算机指令,我们往往叫做机器指令,通过运行这些指令,我们的计算机可以完成我们日常中使用到的这些任务。运行每一条指令的过程其实就是”计算“。

所以,计算机的运行过程就是不停执行指令的过程,这些指令都有哪些呢?

举一些例子:

  • 算术运算:加法、减法、乘法、除法、取模(也就是取除法的余数)等
  • ”控制流”指令:“控制流” 即指令的执行顺序,控制流指令即改变指令的执行流程。
  • 内存操作:读取或是写入内存

看到这里可能我们会有一些疑惑:

  • 加法、减法这些运算的内容是什么?比如,加的是什么值?加到哪里?
  • 改变执行流程是什么意思?
  • 内存操作是什么意思?

接下来我们就通过更加细节的解释来解决这些疑惑。

CPU 和 内存

在理解这些问题之前,我们需要来了解一下 CPU 和内存。

CPU 是计算机中的核心部件,它的任务就是执行计算机中的指令,同时,在 CPU 中还有一些数量有限的存储部件,叫做寄存器,寄存器的数量极其有限,差不多是在几十个左右,每一个寄存器可以存储 8 个字节或者 4 个字节的内容 (字节是计算机中的一个计量单位,一个字节为 8 个二进制比特,一个比特就是 0 或者 1 ,我们文件大小的单位比较熟悉,比如一个文件的大小为几 K ,其实就是指千字节,比如 1K 其实是指 1 千个字节,在 Windows 系统上,也会使用 1024 进制,也就是 1K = 1024 字节,但是其实应该是 1000 )。

所以可以看到,一个 CPU 中虽然也可以完成一些存储的功能,但是其实 CPU 中的存储功能极其有限,那么这样有限的存储功能有什么作用呢?

其实这些寄存器的作用是作为运算的操作数,也就是加法的“加数”,乘法的“乘数”等,CPU 在执行指令的时候,必须将需要计算的内容放到寄存器中,才可以进行计算,这就是为什么需要有 “内存操作” 指令,因为在内存中的数据需要先放到 CPU 中的寄存器中,这些指令就是负责将内存中的数据放到寄存器中,然后在计算完成后再将其写回到内存当中。

那么什么是内存呢?其实内存,我们可以认为是一个大的表格,这个表格中的每一个位置都有一个标签,这个标签我们把它叫做地址,其实就是类似于 excel 的表格中的 "A1" "B2" ,不过,在内存中,只有一列(或者一行),所以,地址就只需要用一个数字就可以描述了。

到现在,第一个疑惑就已经解决了,加法、减法等运算的值是寄存器中的值,而寄存器中的值又是从内存中来的。第三个疑惑其实也已经解决了,内存操作,就是将一个大表格(内存)中的值放到 CPU 中的寄存器中或是反过来,将 CPU 中的寄存器放回到大表格的一个过程。

那么第二个疑惑呢?什么是改变执行流程呢?我们需要先了解一下执行流程是什么。

在执行指令的时候,指令从哪里来呢?其实这些指令也在内存中。其实指令也是数据,也就是一些特定的“数字”,比如我们规定,数字 0 代表将第一个寄存器和第二个寄存器的值相加,然后放回到第一个寄存器中,那么这个数字就是这个操作的”机器代码“。

所以,在内存中也可以放入指令。而指令的执行过程,就是连续地执行指令的过程,也就是按照顺序一个一个指令的执行,比如我们有如下的指令(当然,这些指令不可能是计算机中的真实指令):

1
2
3
4
假设我们的 CPU 有一个寄存器,命名为 reg0
地址:指令
0: 做饭
1: 吃饭

这里一共有两条指令,这两条指令的执行过程,就是在执行完 “做饭” 这个指令之后,再执行 “吃饭” 的指令。

但是如果我们的计算机只能执行这样的指令,计算机能做的事情就太有限了,所以我们加入了另外一个指令:

1
2
3
0: 做饭
1: 吃饭
2: 回到步骤 0

现在我们就完成了一个 “循环”,也就是不停的执行 “做饭” ,“吃饭” 的过程,位于地址 2 的这个指令我们叫做 “跳转” 指令,这条指令的作用就是将目前执行的位置改为另一个位置,所以我们现在得到了一个新的执行过程。地址 2 的指令就是控制流指令。

除此以外,还有其他的一些更加复杂的控制流指令,比如如下的 “程序”:

1
2
3
4
0: 检查现在是否是晚上,如果是晚上,则 reg0 中放入 1 ,否则放入 0
1: 如果 reg0 为 0 跳转到地址 3 , 否则不进行操作(也就是继续往下执行)
2: 睡觉
3: 起床

这部分的指令,我们实现了一个简单的 “判断” ,也就是根据不同的情况程序的执行流程不同,位于地址 1 的指令就是控制流指令,只不过这个控制流的改变是有前提的。

这一部分我们介绍了指令的执行流程,如果大家对这个部分还有疑问,在这里有一个很好的游戏可以帮助大家理解指令的执行流程————人力资源机器

这个游戏中,那个小人其实就是 CPU 中的寄存器,你通过编写指令来完整一些任务,地板就是内存,地板上的数字就是地址,如果还有疑问,就玩玩这个游戏吧!

结语

这一篇中,我们介绍了计算机的几个部分,主要是介绍了 CPU 和内存,同时也介绍了计算机中指令的执行过程,通过这一篇,我们应该对计算机的运行过程有了大致的了解。

更新

  • 2020-2-1 20:20 完成第一篇
  • 2020-2-1 23:45 去掉正文的一级标题