门电路是用来承载布尔代数具体实现的某种物理设备(门电路本身是使用电磁继电器、或电子管、或晶体管等其他技术等哪一种方式实现的,那就与我们无关了)。
一款成品电子芯片,假设有N个输入,M个输出。(当然内部肯定是利用布尔代数设计推导出来的门电路封装设计的)
封装之后,就抽象出了输入输出接口的概念,也会有N个输入管角和M个输出管角。
注意看上图:
可以直接设计一个三与门,也可用两个二与门封装成组合成三与门,内部具体实现细节不是在意的重点。
但输入输出关系,却是一致的。
不同的厂家设计的汽车发动机技术也不一样,走线方式等很多内部结构也有区别,但体现在驾驶室中的操作接口,区别不大。
你会开A公司的车,了解了接口,也能很轻松的上手B公司的车。
接口一致,输入输出关系一致,但内部实现原理不一致,这样的例子有很多。
接口往往需要有(普遍统一性、适应性、符合人类的思维),一个产品如果接口友好,消费者体验也很棒。
(与门,或门,非门)这三种门电路,是逻辑电路中最基础的,如同汉字中的偏旁部首,英语中的26个字母,通过这三门的组合,可以组合出任意复杂度的复合门逻辑电路。
这也是门电路的设计艺术,当然更是一门专业技术(计算机软件必须得建立在硬件的基础上,如人的思维意识(灵魂)也得建立在肉身存活的基础上,需要一个载体)。
任何一个逻辑电路,都能从外部和内部两个角度同时观察。
从外部观察:只需要考虑输入和输出的结果规律性。(接口)
从内部观察:就如同上图(右)
接口到底是什么?
接口是一种很笼统的统称,可以很广义的理解为:
开车的时候,油门,刹车,方向盘都属于接口,接口内部是非常复杂的电路和机械装置。
普通使用者需要关心接口内部的实现原理吗?不需要。
生活中的手机,ATM机,微信、支付宝、互联网、插座,计算机操作系统,鼠标、键盘,都可以广义的理解为接口。
任何接口都方便,简化了操作,使用的接口人不必关注接口内部复杂的工作原理,只考虑接口的输入和输出对应关系即可,接口内部工作原理技术实现是相关专业人员去考虑的事情。
从而实现了技术隔离,单一的进行更高级的抽象,门电路的内部结构是(门电路工程师需要考虑设计的)。
冰箱,主机、电视都是经过封装的。
你通过遥控器,按钮,就可以很轻易的控制,不需要懂汽车原理、电视原理、冰箱原理通过接口很简单的去实现自己的目的。
这就可以非常完美解释了为什么有的人哪怕没学过计算机原理,不懂高级语言、编译器,没学过数据结构,依然可以直接学习某种编程语言的程序设计,学几天甚至完成一些连连看,俄罗斯,贪吃蛇的小游戏。
高级编程语言,相当于一种高级接口,越高级的接口抽象,越接近于现实中人类的行为思考方式。
越高级的接口,自然内部封装的越复杂,在高级接口的外边输入一点信息,内部的很多“层”接口会开始工作,最后汇总,把结果输出。
用高级编程语言写代码,感受不到计算机与二进制有什么关系,与非门、与门、或门有什么关系,机器语言中的0和1体现在哪里?
比如C语言代码:printf("我的第一个程序!");
通过C语言写好这句代码,传给到C语言编译器,C语言编译器经过一系列复杂的运算分析,转换输出一个复杂的
机器语言文件。
操作系统把包含这个“机器语言”信息的“文件”移交给计算机中的CPU“开始执行”,“CPU”就是无数非门、与门、或门的集合体。
常常有人把CPU抽象比作成电脑的核心(就如同大脑是人身体的核心,指挥控制调解系统)(党中央?国务院?白宫,发号施令,协调各个地区)
如同无数的细胞组合了人一样。
再通过一系列复杂的过程,显示器就蹦出一句话“我的第一个程序”这几个字。(这个过程是非常复杂的)
从低级到高级的实现过程:
每次设计出一层结构,就封装,留出接口供上一层调用。
上一层封装好之后,留出接口,再给上一层调用。
最上层的一个任务一运行,经过层层接口,传输到最底层。
一个好的封装,才能形成好的接口。
这和带兵打仗是类似的,班长需要知道每个战士的姓名/性格/特长,否则就不知道该派谁去对付对面山坡上的狙击手;
而连长呢,只需知道自己手下哪个班/排擅长什么就行了,安排他们各自去守一段战线;
到了师长/军长那里,他更关注战场形势的转变及预期……没有这种层层简化、而是必须直接指挥到每个人的话,累死军长都没法指挥哪怕只是一场形势明朗的冲突——光一个个打完电话就能把他累成哑巴。
(代入到计算机中,没有这种层层简化,即使要在屏幕上打印一行文字,还得考虑布尔代数,逻辑电路怎么样设计。)
(效率永远上不来)
反过来也对:军长不需要干涉某个步兵班里、几个大头兵之间的战术配合;这不仅耽误他行使身为军长的职责,也会干扰士兵们长久以来养成的默契。
他的职责是让合适的部队在合适的时机出现在合适的战场,而不是一天到晚对着几个小兵指手画脚、弄的他们无所适从。
约束各单位履行各自的职责、禁止它们越级胡乱指挥,这就是封装。
越是上层的高级编程语言:替我们干的事情越多,要实现一个软件功能,代码量越少。
当用高级编程语言做程序的设计时候,可以把精力更多的考虑软件功能如何实现。(业务逻辑)
开发效率:
假设开发某个网站,php做了一个星期,C语言三个月,汇编语言做了两年,机器语言编了十年。
大家以后会接触到API(Application Programming Interface)、SDK(Software Development Kit)、框架、库、类、函数、结构体等一些名词,本质也是接口的意思。
学习计算机的过程中,一方面要了解“底层基础”的本质,另一方面要抽象封装建立更上一层接口的编程思维,建立好之后"忽略、忘记"一些之前的知识。
就像古人用某种办法推导出了圆周率,后人没必要再费劲去推导,可以很方便的使用。
(在计算机中,也有类似的思想,(DRY) Don't Repeat Your self ) 不要重复你自己,不要重复造轮子。
(但对于充满极客精神的好奇宝宝,即使造不出高质量的轮子,也渴望知道轮子的实现原理)
(上学那会,我们就理解了蒸汽机,内燃机的原理,但直到今天我国这方面技术与发达国家还是有一定的距离)
当你要考虑给房子装修的时候,不要总惦记这房子的根基怎么回事,但不代表你不知道它的根基是什么构造。
计算机世界本质上是对现实世界的抽象,每隔一段时间学习完一层结构,我会带领大家把思维梳理总结一下。
看山是山,看水是水;
看山不是山,看水不是水;
看山仍然山,看水仍然是水。
看山是山 :对事物的本义了解。(少年时代)
看山不是山: 是对事情的其他意义深入剖析理解。(中年时代)
看山又是山:是把前两者结合起来。(老年时代)
既能看出它的本质,也能本能的想到它所代表隐意。
第三层境界:看到的山,是一个系统,是一眼洞穿了本质,看到了古今未来。
这里的山可以换成很多东西,亲情,爱情,友情,梦想,计算机,甚至英语、音乐。
返璞归真、大智若愚、大道至简,举重若轻,厚德载物都是类似的意思。
人这一辈子真的越学越无知,越学越谦卑。
多年前,我初学编程的时候,以为掌握了某些编程语言,就可以做这事,那事的时候。
等真正到了之前自己认为的一个平台境界,才发现更广阔的世界,如那只跳出井口的青蛙一样,人类出了地球何尝不是如此。
伟大的科学家牛顿:“在科学的道路上,我只是一个在海边玩耍的孩子,偶尔拾到一块美丽的石子而已,至于真理的大海,我还没有发现呢!”
这句话,今天放到顶尖的科学领域,去问任何一个科学家,我相信它们都会认同。
先想象可以包含人类已知所有知识的一个圆:
当你小学毕业的时候,你了解的知识没有多少:
当你中学毕业的时候,你掌握的知识稍微多了点:
当你获得学士学位的时候,你获得了一项特长:
而硕士学位使得你的特长更加扎实:
通过阅读研究相关的论文你可以了解人类知识的边缘所在:
当你处在人类知识的边缘时,你就需要专注一点进行研究了:
你需要在这个边缘地点进行数年的努力钻研:
直到有一天,你突破了边缘的限制:
那时,你所完成的那个小突破(凹坑)就叫做“博士”:
当然,此时你看到的世界与之前的感觉已经有了大不同:
所以,别忘记了整个图景(不要以个人的经验随意扩大,勿认为你经历的就是整个世界的样子):