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