从 1 加到 100:一道简单的数学题挑战下你的大脑

从 1 加到 100:一道简单的数学题挑战下你的大脑CPU 和内存的工作原理

2017年的第一篇, 写给刚刚踏入计算机编程领域的小白吧。

所谓编程,就是把自然语言的需求翻译成计算机语言, 让计算机去执行。 对于刚入行的人, 理解CPU和内存是怎么在一起工作的, 绝对是基础中的基础。

1

CPU和内存

如果我们简化一下, CPU和内存其实特别简单,内存就是一个个的小格子, 每个格子都有一个编号, 格子中的数据可以被CPU所读写。

从 1 加到 100:一道简单的数学题挑战下你的大脑

CPU 内部的构造超级复杂, 但我们这次只关注两个东西:

一是运算器,可以做各种运算, 但是有个限制,这个运算器不能直接操作内存进行运算, 他在运算时使用的是内部的数据格子(学名叫寄存器), 为了区分开, 我把他们叫做R1,R2,R3,R4,假设只有这么4个, 统称Rx。 

CPU必须把数据装载到寄存器中才能运算。

CPU运行速度快的令人发指, 但是它能做的事情却简单的令人发指, 主要是以下四种:

(1) 从内存的某个格子中读取数据放入自己内部的寄存器Rx

(2) 把Rx的数据写入内存的某个格子中(会把原有数据覆盖)

(3) 进行数学运算和逻辑运算

(4) 根据条件进行跳转

数学运算就是加减乘除, 逻辑运算就是AND , OR 这样的基本运算,没接触过的暂时可以不用深究。

根据条件进行跳转就是从一个指令跳转到另外一个指令, 下文会详述。

2

从1加到100

现在我们试图用一个例子来揭开CPU和内存的神秘面纱, 这个例子就是把1, 2, 3, 4,….. 97, 98, 99, 100 这100个数字加起来 。

如果你看过数学王子高斯小时候的故事, 自然很简单,不就是 101 * 50 = 5050 吗 ?

作为码农, 我们需要用上面的简化计算机来解决这个问题: 我们需要精确的告诉CPU来指令, 让它去完成这个加法运算。

切记切记: 内存只是一个个可以读写的格子, CPU简单到只能做上面描述的4件事。

3

热身

在正式开始之前,我们先来热一下身,把你的思维切换一下, 用这个“简陋的”计算机计算一下 50 + 60 , 我门需要告诉CPU这些指令:

指令1 : 把数字50 放到编号为 #1 的格子里

指令2 : 把数字60 放到编号为 #2 的格子里

指令3 : 把格子#1的数字取出来,暂时放到CPU内部的寄存器R1中

指令4 :把格子#2的数字取出来, 暂时放到CPU内部的寄存器R2中

指令5 :把R1和R2的值相加, 结果放到R1中

指令6 :把R1的结果放到编号为 #1的内存格子里。

真是不容易啊, 因为CPU不能直接操作内存进行加法操作, 需要把数据从内存和CPU之间搬来搬去, 最后才完成了这么一个简单的运算。

4

正式出发

热身完毕,正式出发 !

回到那个从1加到100的题目, 我们的指令如下所示,CPU需要依次执行(除非遇到跳转指令), 直到结束:

指令1 : 把数字0 放到 编号为 #1 的格子里

指令2 : 把数字1 放到 编号为 #2 的格子里

指令3 : 把#1号格子的数取出放入CPU寄存器R1 (即 R1的初始值为0)

指令4 : 把#2号格子的数取出放入CPU寄存器R2 (即 R2 的初始值为1)

指令5 : 把R2的值和100 比较, 如果小于等于100,执行第6个指令, 否则执行第9个指令

指令6 : 把R1和R2的数据加起来, 结果放入R1

指令7 : 把R2的数值加1

指令8:  跳转到第5个指令

指令9: 把R1的值写回到 编号为 #1的格子里

(注:#1号格子的值就是结果)

这里提示一下: R2表示的就是从1到100这些数字,  R1存放的就是中间和。

现在,请你在脑子里边模拟一下这个过程, 看看程序能不能成功结束, 把最终结果放到#1号格子里。

如果觉得脑子不够用, 建议拿一个纸和笔,  把自己当成CPU, 把上面的这些指令手工的执行一遍, 体会一下这个过程。

如果你是非科班出身,并且能迅速的理解上面这些指令是如何完成从1到100的加法的, 恭喜你, 你很适合学习编程, 光明的前途在前面向你招手。

我们上面所说的指令和汇编非常相似, 这是一种非常贴近机器, 非常“低级”的计算机语言。

用这种语言来编写大型程序,会把人活活累死。

当然话也不能那么绝对, 对于那些大神级别的程序员来说, 汇编也是小菜一碟。  Ken Thompson 和 Dennis  Ritchie 不就用汇编写了第一版的Unix操作系统吗?  求伯君不就用汇编写了WPS吗?

对于普通人来说,大神们给我们创造了高级语言让我们使用, 如果我们用高级语言把上面的例子再写一遍, 你应该很容易能看明白了:

从 1 加到 100:一道简单的数学题挑战下你的大脑

不要被之前的“低级”指令吓住, 这才是码农每天打交道的代码,不过这种高级语言写的代码最终也要被编译成“低级”语言代码, 最终交由CPU来执行, 编译后的机器语言,其实和上面的指令差不多。

5

思考

为什么要拿这个例子来挑战小白的大脑呢? 从本质上来说, 码农整天做的就是这样的事情, 告诉计算机使用这些指令去运算, 我们需要养成面向计算机的思维方式。

CPU能干的事情非常有限,笼统来说就是上面那四种, 但是我们现在上网、听歌、看视频、玩游戏,最终都会归结到这些操作中来, 这就是计算的本质。

此外, CPU是如此的冷酷, 以至于你的指令出一点点错误就不给你正确结果, 例如你把第3个指令中的“如果小于等于100”, 不小心写成了“如果小于100”, 

CPU当然不会告诉你程序中有问题,他只会冷冷的执行, 最后你会发现:这结果怎么不对呢?  

还有一个问题,CPU在运行的时候,从哪里取获得那些指令?

估计你已经想到了, 对,就是内存 ,指令也需要在内存中才能够被CPU访问到, CPU从内存读到指令以后,会进行分析(译码) , 看看这个指令是干什么的, 然后再进行运算。

所以我们的内存小格子中不仅仅存放的是数据,还存放着至关重要的程序指令! 我们需要告诉CPU第一条指令在什么地方, 然后CPU就可以疯狂的开始运行了:

从 1 加到 100:一道简单的数学题挑战下你的大脑

这些指令在内存中肯定不是我们看到的自然语言, 而是二进制的表示。

那内存的数据又是从哪里来的?  肯定是硬盘了, 我们写好的程序会放在硬盘上, 在运行的时候才调入内存。 

最后,再次强烈推荐这本帮你透彻理解计算机软硬件到底是怎么结合工作的书籍:

从 1 加到 100:一道简单的数学题挑战下你的大脑

(完)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/37042.html

(0)

相关推荐

  • 数据库设计心得-潇洒不是摆烂小组「终于解决」

    数据库设计心得-潇洒不是摆烂小组「终于解决」1.组名 潇洒不是摆烂 2.组员 黄笑然 陈佳瑶 苏国培 刘玉婷 安游珺 3.项目名 基于模板匹配的票证识别平台 4.项目介绍 我们的项目是基于模板匹配的票证识别平台。随着人工智能技术的发展,OCR技

    2023-06-13
    101
  • js的面试题及答案_js面试题大汇总

    js的面试题及答案_js面试题大汇总本文针对目前常见的面试题,仅提供了相应的核心原理及思路,部分边界细节未处理。后续会持续更新,希望对你有所帮助。 1. 实现一个call函数 2. 实现一个apply函数 3. 实现一个bind函数 4. instanceof的原理 5. Object.create的基本实现原理…

    2023-07-23
    80
  • Python正则表达式:用字符模式匹配和替换文本

    Python正则表达式:用字符模式匹配和替换文本在正式介绍Python正则表达式之前,需要先了解一些正则表达式的基础知识。正则表达式是一种描述字符串结构的方法,帮助我们在文本中查找、匹配和替换特定的字符或字符串。正则表达式通常由字符、元字符和模式组成。其中,字符指的是正则表达式中的普通字母和数字,用来匹配对应的字符或数字。而元字符是特殊字符,具有特殊的含义,常用来描述模式,如通配符、边界、重复等。模式是由字符和元字符组成的匹配规则。

    2023-12-14
    67
  • 原生linux系统_win10安装wsl2

    原生linux系统_win10安装wsl2需要保证 Windows 10 至少为 Windows 10 Fall Creators Update 及之后的版本。 安装之前必须保证为 Windows 10 开启了「Windows Subsystem for Linux」的可选功能。 Windows 用户名不能有空格。(有…

    2023-08-05
    79
  • Ubuntu16.04上安装MySQL(详细过程)「终于解决」

    Ubuntu16.04上安装MySQL(详细过程)「终于解决」
    Ubuntu16.04上安装MySQL(详细过程)Runningluffy 2019-08-09 20:04:29 45035 收藏 149分类专栏: 技术…

    2023-04-16
    113
  • Apache Flink介绍

    Apache Flink介绍Apache Flink介绍 俗话说知子莫若父,要想了解一门技术就要看官方的介绍。Flink官网对Flink的介绍是这样的: Apache Flink is a framework and distr

    2023-03-20
    103
  • 容器化|在 S3 备份恢复 RadonDB MySQL 集群数据[通俗易懂]

    容器化|在 S3 备份恢复 RadonDB MySQL 集群数据[通俗易懂]作者:程润科、钱芬 视频:钱芬 上一篇文章我们演示了如何快速实现 MySQL 高可用集群部署,以及部署集群的校验和卸载方式。本文将演示如何对集群进行备份和恢复。 部署版本为 RadonDB MySQL

    2023-05-13
    96
  • 优化Python def values的技巧

    优化Python def values的技巧Python内置函数是优化Python def values的一个好方法,因为它们通常比手写代码运行得更快且更有效。比如我们要查找列表中是否包含某个元素,使用Python内置函数in可以避免使用循环和判断。

    2024-03-27
    21

发表回复

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