简单理解计算机
之所以想写这篇文章,是因为在直播时看到了一些学习主播学习编程的过程,很有意思,就有了文章的灵感。另一方面是想给更多不了解计算机的人做一些基本的普及,或者给想学计算机的人一点入门思路。
计算机本质上是反应电路状态的机器,之所以能够计算,是因为控制器中电路状态的改变,改变的方法就是逻辑门电路的设计。
人能够制作出现代如此抽象的艺术,是一个工程上的奇迹,更是因为科学把技术手段进行层次上的分类,每个研究团体只需要研究范围内可控制的问题,一台复杂的系统就可以按照抽象的计划工作了。
在初学编程的时候,在互联网上的海量编程教程中,很少有人能完全的解释计算机底层运算的逻辑。更多教程的是从更细节的部分开始的,比如,对一个还不懂编程语言是什么的人,首先教的是进制位的转换,再就是上手去理解内存结构,基本的语法内容、函数、类这些写法。这些问题理解起来是困难的,尤其是还不理解计算本质的时候。
一方面我觉得,会编写程序类似于编写Word文档,在职场上已经成了必备的技能。另一方面,编程语言能够为我们提供一种理性的逻辑思考的能力,因为计算机总是离不开模型、离不开数据结构。
确实没有人能完全的掌握计算机中的每个细节,但随着我对编程与计算机不断的深入理解,我发现一些教程中存在的问题很严重,他们试图在教会一门技术的过程中,没有解释最基本的运作原理,即为什么程序能够执行。
本文期望用最简单语言理解计算机原理,另一方面也是给自己做个笔记。
框架问题
每种程序语言中有很多框架,这种框架的意思是,提供了一些在某方面业务上常用的功能,使用者只需要调用这部分代码的函数,就能实现想要的功能。框架提供了诸多方便,他让程序编写者不必深入的理解每一个领域的细节,为开发提高了效率,也确定了某种标准。比如在移动开发领域,由Android或者Ios提供的开发套件,就是一种框架,能让开发者在基于这种标准快速的开发出应用,如果从零开始,那对程序员的要求很高,甚至很难去理解。框架为编程工业的发展添上了翅膀。
汇编问题
每种编程语言最后都会变成汇编语言吗?一部分语言会直接会“翻译”成控制器需要的机器指令,另一部分语言将由中间形态的转译过程,比如Fortarn和C语言本质上是为了解决编写汇编写起来的繁琐过程,C是提高效率的工具。到了现在,C语言反而变成了低级的语言,因为C语言中只有函数,没有更高级的抽象语法和自动管理的特性。
编程的发展就是从汇编开始的,现代编程语言的作用就是提供特定的推理系统,使用更简单的方式管理汇编产生的单条语句的执行。比如函数和类的出现是为了提高编写效率,为程序逻辑提供更好的支撑。
编译器问题
现代主要有两种编译方法,一种是静态语言的的编译器工具,另一个是动态的解释器。静态编译比较好理解,就是程序的指令过程需要一次性编译好,它的数据结构,一次成型,运行的过程中指令没有改变的可能。动态解释器在很多语言当中可以理解为虚拟机,比如Java的程序就是需要在操作系统上安装它的JVM才能运行。JAVA生成了只有JVM才能执行的中间码形态,并且它具有实时的特点,即它的数据结构是可以改变的。
编程语言问题
这是程序开发者必须要学的一种语言系统,编程语言提供了字节码按照特定组织结构运行的功能。本质上,编程语言就是不断嵌套的函数,比如,循环的语法结构是编译器在编译或者执行阶段生成对应数量的执行命令,开发者只需编写少量的代码就能做到大批量的运行命令。编程语言是组织命令的艺术,它的核心是编译器和解释器。
编译器或者解释器最重要的功能就是提供语法解析,再转换为执行的字节码。在考虑编程语言中一定要考虑的就是内存的问题,比如一个变量的存储,本质上是在内存的位置上改变一段电路集合的状态,这种状态就意味着这是一段数据。再就是现代编程语言提供的对象也比较重要,对象其实是一种数据结构,它在内存上的表现就是一大段指令或数据。
内存意味着有限,这种有限指的是,在内存中存储一个数据,它的存储大小都是一样的。01100100(数字100的8位形式) 和11001000(数字200的8位形式)的比较,在生活中,我们基于科学的主观认为,200大于100,但在计算机的存储中,它们表示所需要的电位都是一样长的。只需要将这些二进制想象成内存上一行一行的存储粒,内存便是一个存储二进制的矩阵工具。
操作系统问题
编程语言依赖编译器,而编译器或解释器依赖操作系统或者指令架构(也有单片机应用不依赖操作系统)。操作系统是管理的艺术,它要匹配各种处理器的指令架构,一旦涉及到指令架构,这是决定程序能不能运行的根本性因素,这里指的是最底层的应用程序。因为一些编程语言具有跨平台的特性,因为它在虚拟机上运行。
操作系统管理着计算机所有硬件的部分,类似于集成管理。还提供软件的部分,比如通过软件划分出的虚拟内存结构,虚拟磁盘的结构。操作系统在集成之后,为上层应用程序提供了接口。比如显卡程序控制着显示器的电路矩阵,应用程序需要在显示器上显示图形,一般来说,在通用计算中,它需要调用操作系统提供的显示接口,将需要显示的数据逻辑“推入”到显卡程序中,经过显卡程序的处理,就能显示图形了。
另外,操作系统在表现上看到的是提供者,比如我们的软件运行都要基于操作系统(单片机不需要操作系统),实际上操作系统是为各种程序提供接入功能,即操作系统管理程序在内存中和中央处理器中允许存在哪些数据。这就诞生了异步、多线程执行的一种可能。
操作系统看起来就是一个比较重要的应用程序,它在计算机开机的一刹那就开始读取磁盘中的操作系统程序了,计算机的设计就是从第一个磁盘的位置找指令执行。通过执行的程序加载更多的程序复制到内存中。
网络问题
操作系统中的网络,网络是一种信息二进制信息流。操作系统提供着网络接口,一般我们写应用只需调用这个开放的接口就能实现网络的收和发,网络其实也是一种读写的程序,即从网络驱动的存储中读取和写入字节,这个和操作系统的应用程序将硬盘中的数据读取和写入是一样的原理。
移动和复制问题
在计算机中存在着数据传输的概念,比如我们常用的移动、复制、下载、上传问题。本质上这些词语封装的是一种数据生成的技术,计算机系统没有真正的复制和下载,这些概念其实是生成。即所有电信号的产生都是由控制器生成的信号,再去覆盖硬件存储的状态位。
另外推荐一本书:《丹尼尔·希利斯讲计算机》
之所以想写这篇文章,是因为在直播时看到了一些学习主播学习编程的过程,很有意思,就有了文章的灵感。另一方面是想给…