了解编程语言得从硬件开始

从冯诺依曼结构开始,这时候计算机的基本框架已经基本确定下来,内存、硬盘、cpu。

  1. 内存对逻辑门电路进行了封装以实现电子存储, 仓库里老一点的内存条拿到放大镜下看,可以看到如屏幕像素点一样横竖排列的一个一个的凸起点,每个点即一个完整电路, 每个电路存一位。
  2. cpu也差不多,通过逻辑电路来执行计算,cpu指令来调用逻辑电路,现代的cpu中直接将某个指令通过复杂的电路焊在cpu电路板上,以提高执行效率。 这里讲一个区块链的货币,某个挖矿者的直接将算法焊成了电路,这样的执行效率是普通机器挖矿效率的十几倍,这个币也就迅速贬值, 从一开始这个币的挖矿算法没设计好,被硬件电路化。 加密机也是一样,加解密算法焊在电路上,这也是公司机房里加密机的用处。
  3. 硬盘有机械、固态之分。 机械里面是一个圆盘、一个灵活活动的柱子加磁头,用磁点的正负极来标识数据,即0或1。 固态用某个点里面是否有电子来标识0、1 。 机械硬盘的圆盘可以拆下来当镜子用,上面一摸会掉粉粘手。

硬件扩展

  • 内存存放的是程序、数据, 用矩阵电路实现,所以拔电即数据丢失, 但访问速度很快,并可以随意跳跃访问,把电路连到点上就可以访问了。 所以内存又叫随机访问存储器。
  • 硬盘用做持久化,读取速度不会很快,如机械硬盘转的再快、磁柱移的再快,它也没有电信号快。 效率大概是内存的千分之一到万分之一。 硬盘读连续存储点会快很多倍,磁头少移动,没有随机访问的能力。
  • cpu处理指令的,现在的cpu有几百个指令,也就是所有的软硬件操作,根源都是基于这几百个指令,真正往底层就这么点东西。 指令则是有逻辑电路实现,cpu里就是一排排电路焊在电路板上。
  • 我们常常听说的手机里cpu的物理极限,纳米极限, 这个极限的意思是固定面积电路板的极限,cpu中两个电路太靠近了会互相干扰,导致的数据错误率到了不能接受的地步。 cpu中的效率是由电路数量决定的,不加又不行。 应用科学会最终受制于基础科学,能带领基础科学突破的才是真大佬, 和三体里讲述的一样,基础科学受限,即使应用科学发展出巅峰的太空舰队,三体基础科学压制,一个水滴机器轻松团灭太空舰队。
  • 为什么使用二进制,一个是物理硬件上的限制,无论硬盘、内存都只需要处理两种状态,设计相对其他进制简单且出错率更低, 二则是数学上的, 逻辑学上用true\false表示世界万物,而且这门学说在数学上已经完全成熟,所有的理论都已通透, 每个逻辑门里的电路则是对逻辑学的实现, 而二进制就可以表示true\false两种状态 ; 同时电信号在网线中传输是会有比较强的干扰, 用两种状态更容易处理修复。 计算机初期有过3进制4进制的机器,后来被证明不如二进制而放弃。 未来会不会有3进制、4进制,肯定会有的,毕竟进制越高运行效率、存储效率、传输效率都是成倍的上升, 但是以目前的材料科技、数学理论来说,2进制还是最合适的。

编程语言

了解了硬件,编程语言就比较好理解,语言本质是根据需要进行一层一层的封装,一层一层的抽象,越上层的抽象越高级。

  • 最开始的编程是直接写二进制,程序员对照cpu中所有的指令的二进制码,最终将二进制喂给cpu,二进制码也称为机器码,因为机器是完全可以理解的, 或者说机器码直接可以对应成电路运行。 这些指令总共有几个百,常用的几十个。
  • 直接写二进制很麻烦,且非常容易出错,所有就抽象出了汇编语言,给每个指令一个助记符(如add代表加操作),或者是一个助记符 代表多个组合指令, 但是机器是无法理解助记符的,所以软件上就多了一层,“解释器”, 解释器把用汇编助记符写的代码转换为二进制机器码,喂给cpu。 汇编比直接写机器码程序的运行效率会低吗,会的,只要是抽象,就会有损耗,组合指令在某次运行时多少会有些用不上, 但是这个损耗对提升的编程效率来说可以忽略。 就像java中使用spring会有数倍的损耗,但是spring提供的规范性、校错性、高效开发性,这些损耗是可以接受的。
  • 再后来汇编已经满足不了日益增长的编程需求,所以就又有更高一层的抽象,如C语言,更加抽象的助记符,一个助记符代表更多的指令组合的组合的组合,同时把已经写好的程序打包成库,可以用更少的代码来编写完成目标程序。 截止目前,从编程语言的角度来说C语言是已经封装到了最高一层。
  • C语言把该抽象的都抽象了,后面还可不可以继续抽象, 可以的, 实在的东西抽象完了,还可以抽象思想、隐藏细节、跨平台等等, 经过了几层抽象之后终于Java要出场了, Java通过虚拟机层来做到隐藏细节、跨平台,通过抽象的面向对象思想来定义Java程序基本的写法。 面向对象到底是什么,是一层抽象,其意义就如汇编出现的意义一样,让编程简单化,仅此而已。
  • 再往上,Java语言本身有进行的更高抽象, 各种框架的出现,其中最牛逼的Spring,Spring中又有IOC、AOP两宝,再往后又有为微服务而生的SpringBoot 。

扩展

  • 越往底层东西越少,编程语言的最底层是几百个机器码指令。
  • 但是编程需要效率,而提高效率的方式就是封装抽象,越高层的抽象越复杂,而使用起来也越简单越高效。
  • 所有编程语言、框架的出现都是为了提高效率,编程效率、运行效率、维护效率。
  • 我们使用如Java高层抽象的语言,为什么还需要了解向下层的抽象。 我觉得是抽象层之前并没有完全彻底的抽象,越往上越复杂,抽象难度越高。 我们不需要记机器码,这一层它就抽象的很彻底,因为抽象起来简单。 原则上来说也不用了解Java虚拟机字节码,不需要了解GC,甚至不需要了解虚拟机, 那是不可能的 ^_^。