5.计算机发展个人理解-电路终究是电路 软件如何控制硬件 代码如何操作硬件 硬件是怎么执行代码 代码如何执行 软件与硬件如何交互 计算机思维 抽象 封装 规范 屏蔽 协议分层
计算机只是逻辑电路
除了电路还是电路
计算机就是一堆逻辑电路
他并不知道你到底想要干什么,他也不会理解什么是文件,什么是进程
通电的瞬间,就好像你打开开关,灯泡发光一样
所有的一切都是通过通电来启动的 start the world
计算机某些部件,具体到比如某个门电路,有电流通过
这个电流就是0或者1 进而会触发一系列内置的电路导致更大的模块进行电路的通断
他不知道你到底要干什么
只要电源不断开,那么就会有心跳,有心跳就会持续的读取指令
指令也不过就是一块固定格式的电路连接(或者是读取ROM)
将一堆输入线路的电压转换成另一种形式的输出
输出有可能连接着其他的电路模块的输入
所以他会永远的运行下去
只是恰好有了二进制数学,二进制数学又与逻辑建立起来数理逻辑
数理逻辑又跟逻辑电路是相通的
那么我们就可以理解为这堆逻辑电路可以代表着我们想要实现的二进制计算
其实电路仍旧是电路
试想一个问题
软件到底是如何控制硬件的?
你可能会想到,软件是用高级语言编写的,高级语言被翻译成汇编语言,汇编语言会翻译成机器可以是别的机器语言
这样计算机就可以执行了
但是到底是如何控制的?
之所以说软件控制硬件
是不是因为计算机程序作为计算机硬件的输入,然后计算机硬件看似可以理解为经过计算之后,可以得到输出?
看似是这样子的
但是到底是怎么控制的呢?
如果这么想我感觉想不通,软件怎么能控制硬件呢?
如果换一种思维方式或许更好理解
其实跟上一个图是一样的,但是思维方式不一样
此处把计算机硬件作为中心,不是说你把程序输入,而是计算机硬件 读取了计算机程序 然后经过处理,产生了输出
看似一样的不都是计算机程序作为输入 经过计算机硬件产生输出吗
其实差别非常大
上面的图,你可能会理解为软件控制硬件,但是软件如何控制硬件?根本就没有办法控制
下面的图是硬件控制硬件,通过你告诉的方式(计算机程序) 我经过一系列的电路的通断,我产生了指定的结果,因为我本身就是一直在操作电路,硬件自然会产生变化
想一下计算机的启动过程,通电之后,是不是有了心跳之后,就不断地在执行运算,读取指令译码执行等等
最初启动的还不是硬件么
所以,个人理解
对于计算机来说,不存在软件控制硬件
而是硬件 读取了你给出来的指令 控制硬件
软件不过是存储起来的指令,整个计算机只是逻辑电路和等待执行的指令
电路上电之后,跟随频率不断地执行指令,软件就好像是一个无限的纸带,纸带上布满了指令
计算机就这么一条条的不嫌累的执行着,软件只不过是人机交互的方式而已,计算机永远是那个计算机,你操作不了她
计算机重要的思维方式
这几个思维方式看似简单,但是却融入到无数的编写规范设计思维里面了
抽象 封装 接口 规范 解耦
抽象将复杂物体的一个或者几个特性去掉,抽取他们共性的部分,这就是抽象
比如操作系统管理硬件资源,IO设备抽象为文件
比如下图,他们都是形状
抽象的形式是统一
抽象的目的是简化
既然是去掉个性,保留抽取共性,所有的共性组合在一起也就是统一了形式
这种统一后的形式就是一种由各个共性的点组成的一类意识形态上的新事物
这个新事物就共性来说,与原有的事物放到一起进行抽象得到的抽象结果还是这个抽象后的事物本身,对吧
说起来绕口,其实就好像再说杯子和玻璃杯 瓷杯都是杯子一样,虽然这么说有点别扭
所以抽象的形式是统一,得到一种意识形态上的新事物
这些共性的点,对于抽象后的新事物是他的特性
但是这些特性不是具体的
在计算机的世界里面,抽象过后,还必要要实现,计算机不懂得自然语言也没有任何思想
负责抽象的人必须要提供具体的实现
比如操作系统把IO设备抽象为文件,那他就把共性的读写访问方法提供出来,假设是 read 和 write
不管到底是磁盘还是磁带,read就是读取内容,write就是写出内容,到底是怎么实现的,调用者不需要关注
所以抽象最终的目的就是简化
简化后你不用再关注IO设备具体是什么,哪个厂家生产的,使用了什么技术(去掉的特性)
也可以说是屏蔽了底层的实现细节
屏蔽的近义词可以说是封装,把底层的实现细节封装起来,提供统一的访问形式
封装后提供统一访问形式,也就是提供统一的接口 就像上面提到的read write方法
接口可以理解为对接的端口 就好像电脑上预留给投影仪使用的十五针VGA插口一样
既然形式上完成了统一
访问形式上也完成了统一
那么这就相当于一种规范化的形式
所以规范和接口 又有近似的意思
都可以理解为一种约定好的协议,约定好的形式,一种规矩,规矩就可以做到完全的解耦
接口提供访问的具体形式,但是不提供细节
规范指导实现的最终目的与要求,但是不提供细节
有了封装,规范,接口的概念,也就很大程度的完成了解耦
完成了解耦很多时候就可以把问题分层的处理对待
TCP/IP的分层概念就是如此,每一层封装上一层的信息
层与层之间按照约定的规范协议进行对接,各司其职,各层做各层的事情
这样既可以不再一条道走到黑,就好像你回家可能走几分钟坐公交然后坐地铁一样
这些概念
抽象/封装/接口/规范/协议/屏蔽/分层
贯穿了计算机整个的发展
抽象->统一形式->提供统一接口,进而隐藏底细节实现,从而简化了访问
抽象->统一形式->提供统一规范,进而可以解耦独立发展,而且还能够无缝对接
这两种模式最为常见
其实提供统一接口一般是指个体
如果是一个生态链(技术链)上所有的个体,都设定好了指定形式的接口
这就是规范了,有了规范,就很容易出现技术体系
编程语言的发展是不断地屏蔽底层,不断地进行封装
面向对象的程序设计语言中大多数时候你都在做抽象,事物抽象成类
面向接口的编程就是调用者与实现者进行解耦,通过接口进行对接
虚拟机规范只提供要求设计思路,但是不提供具体的实现要求,厂家可以自行定制
虚拟机规范提供了字节码规范,和虚拟机规范,相当于规定了输入和输出
只要按照规范的字节码都可以运行在虚拟机上正确运行,同样的字节码也必然有一致性的结果
servlet规范让servlet和servlet容器各自独立发展,纵然它们相互依存