原创

计算机基本原理


  • 计算机为什么能读懂机器码(二进制码)

结论:计算机是个巨大的状态机!计算机不能读懂机器码!它只会执行!

机器码只是些0和1的组合,这些组合对应着各种寄存器或者某些逻辑电路的状态。设置这种状态的机器码叫做CPU指令,不过也许叫做opcode更精确。

0和1与高低电平的关系。0和1本身并非客观存在,而是对于某种客观存在的主观抽象。换句话说,0和1只是高低电平的代名词。在计算机里,它们就是高低电平的抽象。它们只是用来表示高低电平的。*所以不是先有0和1,而是先有高低电平。然后为了表示上的方便,用0和1去代替高低电平。所有0和1的地方,都可以机械地用高、低电平去进行替换!*至于0、1与高电平、低电平的对应关系,不是绝对的,只要一致就行了。举例:十进制数“5”用二进制来表示则是“0101”,假设高电平用1来表示,低电平用0来表示,那么5的二进制表示也可以写成 “低电平 高电平 低电平 高电平”或者“低高低高”,但显然“0101”更方便。

CPU“内置”指令集,这些指令集其实是一些硬件结构来的。只要传递一个指令(0和1的组合),CPU就会依赖于它的电路来解码(高低电平),然后操作对应的寄存器或者某些电路,然后这一时刻的CPU就是某一个状态,这个状态会依据输入的指令和当前状态来迁移到下一个状态,至于如何迁移,这就是指令对应的电路的设计了。另一些“电路”负责从内存中取下一条指令。

这一切都是数电的逻辑而已,压根不需要学模电。自己用一些数字电路芯片接线就可以搭出一个逻辑电路,就是性能低了点而已。CPU就是这么“搭”出来的,不过是用硬件描述语言而不是直接手工接线。

实际上,利用Verilog HDL 等硬件描述语言再加上FPGA 芯片,自己也可以实现一个CPU,具体可以参考MIPS CPU的规格说明和指令集。这个CPU的性能比自己用数电芯片手工接线的要快,不过还是比不上桌面CPU。但原理基本是一样的。

首先我们要理解问题。问题是“为什么计算机能读懂机器码”。 这里有几个关键的概念: “计算机”、“能”、“读”、“懂”、“机器码”。

问为什么能之前,要记得先问是不是能。 计算机是不是能读懂机器码?

那我们要先定义什么是“懂”。什么程度才算“懂”。这里我就简单理解为“理解机器码的含义”。 有时候我们是不需要懂的,例如为什么1+1=2,我们不需要懂,但是仍然可以计算出1+1=2,因为这是规则,规定好的。因为我也可以规定1+1=3,1+1+1=2,反正就是个符号。我规定了3就是两个手指头,2就是三个手指头,这样也可以的。

接着是“读”,计算机的底层结构是一些门电路,也就是说,输入高电平(或低电平)会输出高电平(或低电平)。这就是所谓的读。 那么什么是机器码,上面也说了,机器码是只是高低电平的抽象表示。

那么这个问题,可以等价地转换为其他的问题,例如: “为什么图灵机能读懂0和1的组合?” 这是从高级别的抽象层次去理解问题的。 还可以是“为什么门电路能读懂高低电平?” 要从哪个层次去理解问题,就看你的需求了。

计算机的根本,要从图灵机的原理说起,图灵机你可以简单地理解为一台机器,有输入端和输出端,内部能存储一些状态,内置了一些状态迁移的规则。其实就是状态机啦。输入端(输出端)能读取(输出)1或0的串。输入的0或1的组合,可以改变及机器内部的状态。然后根据输入和内部状态,去查规则表,输出另一些0或1的串。

根据这个思想,这种状态机,自己用个switch语句就能写出来,或者用查表法,别笑,虚拟机就是这么搞出来的。当然我们也能用门电路搭建出来。但是效率比较低,而且挺复杂的,如果你不搞EE,只是CS方向的话,模电原理可以忽略不计,我们用现成的数电芯片来搭建,常用的就是74系列的芯片,它们集成了一些逻辑门,用起来方便一点。逻辑门应该不用我多说了吧,这些在布尔代数里都有相应的抽象概念。就是与或非之类的。

这些芯片有一些管脚,一些输入管脚,一些输出管脚,有一张真值表,输入一些高低电平的组合,就会根据真值表,输出另外一些高低电平的组合。如果把几个这样的芯片组合起来,根据它们的真值表,设计好自己的状态集以及状态迁移规则,就会得到一个状态机。

这个数字钟的输入端是用钮子开关来做的。也就是说,人机交互的接口是这个钮子开关,钮子开关的开合改变了输入端口的高低电平,几个钮子开关的状态的排列组合,就是所谓的指令集。但人不擅长2进制,2进制的指令也不好记,如果我们在人机接口加个中间层,把手动输入变成中间层的输出,就可以极大地增强这台机器的抽象能力。如果我们把这些2进制指令给个名称,那就是简陋版的汇编语言。这个中间层可以是简陋的T9键盘,方便设置数字钟的数字。我们可以在人和中间层之间添加任意多个中间层,中间层越多,抽象能力越强,当然性能也就越低。这也说明了为什么虚拟机就是比物理机要慢一些,高级语言写的程序理论上就是比低级语言写的程序慢一些。因为抽象能力越强,需要做的状态转换就越多。有些状态是冗余的。只是为了方便人的使用而做的“语法糖”(这里借用了语法糖一词)。

我们还可以将一些指令做成独立的硬件结构,例如加法器,我们在算术上是怎么进行二进制加法运算的,就可以如法炮制在这些逻辑电路中。当我们根据一个冯诺依曼体系结构构建了必要的模块,组合起来之后,它就是一台计算机。

说到这里,其实应该很容易明白了,还是那句话,计算机不懂机器码,它内部有几张“真值表”,这些真值表组合成了状态转换规则。计算机只是负责根据输入的高低电平,“查表”转换输出高低电平而已。

  • 流的概念

我们知道,计算机底层存储结构是二进制码,也是是高低电平。计算机中的流其实是一种信息的转换。它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。

  • 计算机底层选用二进制的原因:

  1. 技术上容易实现。用双稳态电路表示二进制数字0和1是很容易的事情。

  2. 可靠性高。二进制中只使用0和1两个数字,传输和处理时不易出错,因而保障计算机具有很高的可靠性。

  3. 运算规则简单。与十进制数相比,二进制的运算规则要简单得多,这不仅可以使运算器的结构得到简化,而且有利于提高运算速度。

  4. 与逻辑量相吻合。二进制数0和1正好与逻辑量“真”和“假”相对应,因此用二进制数表示二值逻辑显得十分自然。

基础
计算机组成原理
  • 作者:管理员(联系作者)
  • 发表时间:2020-03-19 10:20
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 微信公众号

    评论

    留言