Mark24
思考-计算机本质和程序本质
一、计算机的本质
- 数学理解 lambda算子(?)
- 哲学理解 图灵机
-
具体实现角度理解——CPU工作原理:
以现在CPU的工作原理理解(站在图灵机的实现角度理解)
CPU的硬件电路主要实现了四类基本操作 不论CPU内部有多少寄存器、还有几百条指令集,总之可以归纳为以下四类:
- 数据传输 —— 内存数据、外部IO
- 运算 —— 实现布尔运算、数值运算(主要是加法,减法是另一种加法)
- 跳转 —— 实现循环、goto、控制流
- call/return —— 实现子函数、中断
延伸:
- 编程语言的衍生: 四类命令基础之上发展出汇编语言、C语言、高级语言等等
- 程序的衍生: 程序就是内存、计算、再把数据返回内存。数据和程序都是内存中的01010101 数据,到底是程序还是数据,取决于我们如何看待他们 —— 这个意思是我们在程序中如何解释这个数据。
二、程序的本质
1.站在CPU执行的微观角度理解陈顼
程序的意义,首先要理解计算机的本质,计算机的本质是图灵机的实现,所作的事情本质上是一切围绕:
- CPU寻址从内存读取数据
- CPU对数据处理
- 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之后,他不存在真正的兼容问题,也没有大分裂。
这归根结底是生态的问题。还是一切围绕解决问题。