思考-计算机本质和程序本质

一、计算机的本质

  • 数学理解 lambda算子(?)
  • 哲学理解 图灵机
  • 具体实现角度理解——CPU工作原理:

    以现在CPU的工作原理理解(站在图灵机的实现角度理解)

    CPU的硬件电路主要实现了四类基本操作 不论CPU内部有多少寄存器、还有几百条指令集,总之可以归纳为以下四类:

    1. 数据传输 —— 内存数据、外部IO
    2. 运算 —— 实现布尔运算、数值运算(主要是加法,减法是另一种加法)
    3. 跳转 —— 实现循环、goto、控制流
    4. call/return —— 实现子函数、中断

延伸:

  1. 编程语言的衍生: 四类命令基础之上发展出汇编语言、C语言、高级语言等等
  2. 程序的衍生: 程序就是内存、计算、再把数据返回内存。数据和程序都是内存中的01010101 数据,到底是程序还是数据,取决于我们如何看待他们 —— 这个意思是我们在程序中如何解释这个数据。

二、程序的本质

1.站在CPU执行的微观角度理解陈顼

程序的意义,首先要理解计算机的本质,计算机的本质是图灵机的实现,所作的事情本质上是一切围绕:

  1. CPU寻址从内存读取数据
  2. CPU对数据处理
  3. CPU把处理外的数据送回内存
  • 数据的来源可以是 内存、IO、一切外设……
  • 数据的出口可以是 内存、IO、一切外设……

数据可以是数据、可以是字符串、可以是程序代码……他就是内存里面的数据,如何解释取决于数据。这台抽象了,举个例子 :

例如 00100111 这样的二进制数,既可以 视 为 纯 粹 的 数 值 作 加 法 运 算, 也 可 以 视 为“‘”(单 引 号,single quotation)文字而显示在显示器上,或者视为■■□■■□□□这一图 形模式印刷出来。具体进行何种处理,取决于程序的编写方式。

程序就是CPU在执行的指令,目的就是加工数据

2.站在编程语言角度的理解

前面是微观角度理解程序太抽象。

实际上我们的高级语言,本质上就会翻译成汇编语言。而汇编语言的所有操作都是CPU的四类基本控制指令所作的事情。

我们的高级语言,内置了一些程序,比如 Ruby 内置了数据结构、对应数据结构的方法、还有GC、对语言自己的AST自省等?

但是我们的高级语言归根结底,最有效的就是间接、包含的表达控制CPU的操作。 只不过一些操作被抽象了,背后意味着更多程序的执行。

举个例子,生成字符串 “abc”

用汇编,就是使用ASCII码写入内存,数字和字符的映射由硬件驱动程序决定了

用C语言就是使用一段连续内存单元储存 a、b、c

用Ruby(C语言构建的)就会再内存中划分出一个结构体,他有一个初始的长度比如50,储存 “abc”。如果下次储存更多字符,会自动扩容。

但是不论你如何构建,汇编、C语言、Ruby 他们对内存的使用各有不同,依次变复杂变多。但是Ruby的角度不光储存了“abc”,他存储的是一种约定的数据结构,为未来的复用,控制操作保留了空间。

3.一切都是程序

补码引发的思考。就是内存里的 101010,展示成数据,我们可以猜测是有一段汇编程序作了这个事情。

CPU的机器就是一种就有特定功能的机器。程序(控制指令)决定了对数据的解释。

编码方案,就是一种如何诠释内存里数据的转换方式。

C语言里就有例子 printf(“%d”, i) 这背后就有一段汇编程序,尝试把 i 变量内存中的数据,根据 %d 即 自然数的方式进行解释和转化。这背后也是一段程序。他遵循对二进制的解读方式——比如他一定遵循了补码的运算方式。

所以一切的背后都是程序,都是一种约定。

而程序的目的就是数据、以及解读数据。

4.站在目的、主要构成角度理解程序的本质——程序=数据结构+算法

我们从哲学角度理解图灵机、机器角度理解CPU工作细节、语言角度理解编写的程序就是控制指令。

甚至展示字符的背后就是一段程序对内存中二进制的解释。

那么这一切是为了什么呢?

所以站在目的的角度理解程序

现在我们的程序是以图灵机为理论基础、冯诺伊曼机为原型(意味着要遵循存储、读取、运行的基本设计规则——他就是这样的机器,他就是这样工作的)CPU 的内部电路实现的控制指令为基础的,构造出一系列指令操作,为了收集数据、计算数据和输出数据为目的的这么一个东西。

而我们程序写来写去归根结底发挥作用的就是 —— 数据结构+算法

数据结构,就是内存中的数据,我们如何组织它们,理解他们。 算法,就是围绕着解释或者操作这段程序的。

这两部分一拍即合,就像 一个是文字,一个是解释文字的东西,这两个组合起来就创造了意义。

推论:

程序世界再复杂高深的东西都是数据结构的一种体现。

有些领域自成一派,可以理解为出现了特别的独特的数据结构,围绕数据结构的算法。

本质上他们就是一段程序。举个例子:

1.Web程序

web程序就是对 HTTP协议的一种传输处理

2.编译原理

编译原理涉及到很多数据以及算法,围绕着对文本语言的程序处理。 其中涉及到 有限状态及、正则实现、词法分析、语法分析、AST语法树

本质上他是一种领域程序。

像 yacc、lex 就是典型的一种 DSL

3.网络

网络的七层协议里面,各自按照每层的任务对编码进行理解

4.其他程序

  • 图形程序:可以看成是像素点的绘制

  • 编辑器:我研究过Vim实现,他是对光标数据结构的一种实现

  • 游戏:我也简单看过,现在游戏就是在一个游戏的主循环里,控制用户交互和每帧渲染

  • 操作系统: 主要是围绕着控制内存、资源和程序进程的调度等等

三、总结

我最近研究了什么呢?

  • 《计算的本质》Ruby描写的 计算机构造原理与解释

  • 《汇编语言》王爽

  • 《C语言程序设计:现代方法第二版》

  • 《程序如何运行起来的》

  • 《计算机如何运行起来》

  • 《编译原理》

  • 各种对于 词法、语法解析器的 演讲

  • Python解释器原理 的演讲课程

……

虽然这部分工作,阅读资料没有完成。

其实我觉得我已经得出或者跳跃式的顿悟出了自己的结论。

一切会回到起点

程序 = 数据结构 + 算法

所有的程序没有什么高级、低级之分。他们只是一种程序,为了解决问题。 编程语言看似是一个底层,其实他也是一个领域问题。

你在研究编译原理、还是虚拟机构造、还是写web程序…… 不论你在用汇编、还是C语言、还是Lua、还是JavaScript、还是 Ruby……

你在思考的事情,你看待问题的角度都是一样的。

你要做的、思考的、学习别人的代码的…… 永远都要围绕:

一个合适的目标数据,可以描述问题的

这个数据的处理方法、算法、周边围绕的

程序 = 数据+方法

最后,这个程序的目的,就是希望,数据可以对问题进行描述,计算进行表达。 最终解决你的问题。

至此我得出我自己的答案,自己的思考。 我也不需要别人的答案了。

四、额外的思考

现在要学习编译原理?还是写web

归根结底,其实写什么不重要。重要的是,哪些程序可以帮助你解决问题——你的现实问题也算。

有时间懂得多,解决问题思路宽广。

能够补充的是:

动态语言性能和内存适合脚本、web等要求不高的。

基础设施还得靠C,因为研究C之后,他不存在真正的兼容问题,也没有大分裂。

这归根结底是生态的问题。还是一切围绕解决问题。

Mark24

Everything can Mix.