《编码的奥秘》---学习编程一年半的体会

本人在校大学生,从大一下学期开始自学编程(JAVA)。到如今2018年7月2号也过了一年半的时间了。期间作过不少应用程序(PS:大多数都是作着玩的),好比作一个GUI聊天室(JAVA)、Android应用、Unity3D游戏(C#)、SSH整合开发一个WEB系统(完整版)等…虽然我这些都作过,可是…其中原理我却了解甚少,好比说JAVA的虚拟机的内存释放(垃圾回收器)、socket的链接过程(TCP三次握手以及四次挥手)、HTTP协议,这些东西我都不是很了解。web

看过一篇文章,具体内容忘记了。说的是遇到一个解决数据库链接太慢的问题,有三种人去解决。我只记得2种人,由于太有比较意义了。第一种是经过网络抓包工具分析获得瓶颈,而后把问题解决了。另外一种人是对这种数据库的经验已经很丰富,而后改了配置文件把问题解决的。固然在这个问题中,后者能够迅速的把问题解决,可是若是换了一个数据库,也许第二种人就不知道该怎么解决问题了。(PS:本人就属于第二种人,应用知道不少,理论懂得甚少。)这实际上是很是不利于本身之后的发展的,IT新技术出来的太快了。本身也学过不少什么听上去吊吊的技术,也搭建起来了,手机上能够访问,一切正常。可是在这个过程当中遇到的BUG基本上都是经过百度查找“得来”的答案。因此本身想了挺多以后,也是拿起来底层理论开始进行系统性的学习。最后这本书的博客只做为随笔,说给本身听,如有“有缘人”看到且看且珍惜吧。数据库


编码的奥秘全书总结

这本书很通俗易懂,跟看故事书同样。从手电筒到ASCII编码,从十进制到二进制再十六进制,从组合电路到8080芯片,从开关到控制台汇编程序。这一个历通过程写的算是淋漓尽致了。编程


加法器

  • 加法器
    • 半加器(结果是xor,进位是and)
    • 全加器(考虑低位进位)

半加器逻辑图以下:
这里写图片描述
全加器逻辑图以下:
这里写图片描述网络

用加法器实现减法的方式是经过原码、反码、补码实现。socket

步骤是:svg

  1. 求减数的补码
  2. 被减数与第一步的结果相加
  3. 对第二步结果+1
  4. 减去最高位

(PS:以上步骤针对于被减数大于减数的状况下)工具


同步计数器

D型边沿触发器和时钟实现同步计数器(CP)学习

D型边沿触发器特性表(PS:上升沿有效,也就是上升沿的时候输出取反,现态为0,次态则为1)以下:
这里写图片描述
逻辑图以下:
这里写图片描述
波形图(PS:图片顺时针旋转90°就会获得0000->0001-…->1111的序列)以下:
这里写图片描述编码


RAM存储器

获得8位锁存器后。这样就获得拥有4根地址线的16x1的RAM存储器了。操作系统

D型触发器特性表:
这里写图片描述
D型触发器和写入信号实现8位锁存器:
这里写图片描述
经过3-8译码器选择写入数据,经过8-1选择器实现输出数据,获得8x1存储器:
这里写图片描述
再经过2-1译码器,获得16x1存储器
这里写图片描述

经过前面的实现咱们能够获得一个方程:RAM阵列的存储容量=2的地址线的根数

经过这个咱们就能够用16根地址线跟8个数据输入获得一个64Kx8的RAM
这里写图片描述

至于为何是易失的,是由于继电器的电源来自于给这个RAM提供电源的设备(咱们在这里称这个设备为总电源吧)。读到后面会知道,如今的计算机的RAM不用继电器,而是采用别的技术来实现,不过仍是易失的就对了。


自动操做

接下来是自动操做。实现原理很简单,咱们用一个振荡器来驱动一个16位计数器,计数器输入到64Kx8的RAM从而读取到RAM中的数据,最后再经过加法器跟锁存器实现读取RAM自动进行加法运算的操做。

不废话。上图:
这里写图片描述
发现灯泡亮的意义不大,改进这样就能够将锁存器的值经过在W=1时存入RAM中
这里写图片描述

到目前为止,咱们一直“强调”着电路的实现。如今咱们把这些实现当作细节忽略
这里写图片描述

这里,咱们定义几个指令:

  1. Load 装载
  2. Add 相加
  3. Store 保存
  4. Halt 中止

经过这4个指令就能够这一项操做,而且中止

如今,咱们将抽象的实现这个电路:
这里写图片描述
这个时候,咱们只要把咱们须要的操做存放到代码的RAM中便可实现自动操做

咱们理解完高字节与低字节以及加法减法的设计后,咱们又抽象出一个电路:
这里写图片描述
第一个锁存器保存指令代码,第二个锁存器保存地址的高字节,第三个锁存器保存地址的低字节。第二和第三个锁存器的输出组成了数据RAM 阵列的16位地址。

这个时候咱们发现,用2个RAM太浪费了。可不能够只使用一个RAM呢?

因为咱们已经知道每条指令都占3个字节,因此是能够的,只要在原来电路的基础上作一点改进:
这里写图片描述

这样,咱们就能够经过控制面板向RAM写入程序。此时PC计数器开始从程序入口地址开始计数,经过代码和地址锁存器的共同做用执行所编写的程序

到此为止,咱们已经作出一个经过 计数器(PC) 就可让所编写的程序自动执行。不过咱们发现:咱们该如何规定程序入口呢?再是当咱们计算机开机的时候PC是从什么位置开始呢?因此,咱们引入一个 jump指令,而PC从什么位置开始咱们先不作回答(由于与本课程无关,答案是从BIOS的ROM开始执行)。

由于咱们增长了一个jump指令,因此须要改进的是PC计数器的一个取值。以下:
这里写图片描述
经过这种设计,咱们就能够更改PC的值。让程序自动执行。(PC是一个振荡器,这与RAM的W输入不一样)

到这里,咱们的一个小型CPU已经被设计出来,并且这个CPU还与内存有着很是紧密的联系


从算盘到芯片

一个发展过程,不作阐述。


两种典型的微处理器

8080和6800PC机。位数不一样,一个8位,一个16位。咱们知道8位能够经过转换实现16位、32位、64位以及更高的的位数的处理。经过高低位字节实现。

8080是第三代微型处理器。8位。
6800是第三代微型处理器。16位。

因为每一个不一样的处理器都有对应不一样的指令集,因此不作阐述。咱们须要学习的是8086PC的指令集,通常汇编语言的教程都是用8086微型处理器,也是16位


ASCII码和字符映射

ASCII 码是 7位 编码。
Unicode 采用 16位 编码,每个字符须要 2个 字节。

这里是有历史缘由的。由于大多数国家用 7位 编码都不足以存储信息。因此每一个国家都有本身的编码集

这样会致使一个问题:在一个txt文本中既写中文又写阿拉伯文,而txt的编码集设置为 GB2312 中国编码集。保存后,读取时会发现阿拉伯文变成乱码

因而Unicode出来了,将全部国家语言统一块儿来。此后又在Unicode的基础上为了提升效率而提出 UTF-8 的标准。


总线链接

总线是提供给计算机中每块电路板的数字信号的集合,这些信号能够分为 4类:

  • 地址信号。这些信号由微处理器提供,经常使用来寻址RAM单元,也可用来寻址链接到计算机上的其余部件。
  • 数据输出信号。也由微处理器提供,用来写入数据到RAM或其余设备。要仔细推敲输入(input)和输出(output)的含义。数据输出信号是从微处理器输出,变成RAM和其余设备的数据输入信号。
  • 数据输入信号。是由计算机的其他部分提供,由微处理器读入的信号。数据输入信号一般来自于RAM的输出,也即表示微处理器读入存储器内容。可是其余部件也提供数据输入信号给处理器。
  • 控制信号。由各类各样的信号组成,一般与计算机的特定处理器的控制信号一致。控制信号可来自于微处理器或从其余部件传送到微处理器。例如,微处理器可用一个控制信号来指示它要写一些数据到某一存储器地址。

这里的总线,并非指地址总线、数据总线、控制总线,从数据输入输出的做用就能够看出。由于数据输入能够来自于其余设备(如键盘,而不是单一从的RAM获取输入),会响应中断信号


从操做系统开始到图形革命的内容自行理解吧~