编程的本质
编程的本质
我们发明计算机的目的是为了 解决问题 ,特别是解决大量数据的计算问题。 问题的解决之道!
本质上,计算机所能做的只有一件事: 数据处理或数据计算 。核心就是 数据 。我们 输入数据,计算处理他,然后输出结果。 这个就是所有的过程。
输入 |
计算 |
输出 |
这个过程的核心就是数据的计算(处理)。这个处理过程是通过电子电路实现的。比如加法器电路,与或非门等。这个电子电路就是所谓的硬件,也可以说是计算机的CPU。
没有硬件,软件什么也做不了。我们编写软件, 本质上就是输入数据和指令,然后计算机根据指令处理并输出。 一条指令可以说就是CPU的一块电路。所谓的指令集就是电路的集合,也就是一块复杂的集成电路。所谓的FPGA就是门的集合,我们连接门,使他完成相应的功能。编程向两方面发展:硬件模块的封装,如PLD,FPGA;软件模块的封装:从 位-字节-基本数据类型(int,float等)-复杂数据类型(struct,union)-对象,类…发展。
在计算机刚发明的时候,程序员编程都是使用机器语言(机器指令),所以要对所有的指令都非常清楚,并编写一大串的01指令。譬如(假定的):
00100000
01000001
11011010
。。。。。。。
这样的编程很繁琐,于是聪明的程序员发明了汇编语言,他本质上没有多大的改进,只是基本上让一条汇编指令对应一条机器指令。如:
ADD ax,2 ——– 00100010
当汇编器看到ADD ax,2 时,就会把他翻译为00100010。然后计算机运行机器指令。
本质上汇编器就是一个 文本翻译工具。(编译器也是一个文本翻译工具。)
汇编语言也很繁琐,程序员又发明了高级语言,如BASIC、PASCAL、C、COBOL、FORTRAN等。他们编写的代码最终都翻译为机器指令并由计算机运行(机器指令就是硬化的电路)。(如java的JVM就是将字节码翻译为机器指令)。 他们的特点基本是用函数封装的,函数封装了语句,一条语句对应一条或几条机器指令。 翻译的过程是由编译器或解释器完成的。
编译器或解释器扫描程序代码(贪心法),先词法分析转化为一系列的单词和符号,再语法分析看是否符合语言的语法,然后中间代码生成、代码优化,最后生成目标代码,也就是所谓的汇编指令或机器指令。
汇编指令封装了机器指令,高级语言的函数封装了汇编指令。 我们用高级语言编程编程要做的工作就是使用函数,使用封装了机器指令的API函数。 所有的函数都可以成为API,API就像一块电子电路,输入就是函数的参数,输出就是返回值。(.DLL,.lib,so,.a都是函数的封装),所有的编程工作最后都转化为计算机的机器指令。
什么是数据结构?
从计算机底层看,一位就是一个电平值。如RS232电平,逻辑“1”的电平低于-3V,逻辑“0”的电平高于+3V。八位就是一个字节。计算机以字节寻址。一个char类型数据就是一个字节,int一般4个字节,long八个字节。字节封装了位,简单数据类型char,int,folat,指针等封装了位,一个结构Struct封装了简单数据类型,抽象数据类型(类,对象)也封装了简单数据类型。 所谓的数据结构就是数据在内存中的表示,抽象为位,字节,简单数据类型,抽象数据类型(自定义数据类型)等。
(常用数据结构:线性表,栈,队列,树,图等)
什么是算法?
所谓的算法,从底层上看,就是以最精简的机器指令组成程序,他从空间和时间上没有任何的冗余。 从高层上(高级语言)看,也是程序储存空间的最小化和运行时间的最短化。
用高级语言编程本质上就是使用API,封装了机器指令的API。 熟悉这些API即可,本质上不难,关键是时间和毅力的问题。所谓的细节就是使用哪个API函数,以及他们叠加的顺序。不要为细节难倒,从高层上有个整体的概念会感觉好很多。
数据 |
抽象 |
设计 |
程序就是位+上下文环境 。单个的位没有任何意义。
面向过程和面向对象的本质上区别不大。他们都是对于数据和指令的封装(用方法,类和对象)。只不过面向对象封装的多一点点而已。
实质上高级语言编写的程序冗余了很多指令。OOP的目的很大一个就是为了 代码复用 。
通讯就是数据的交流,可以分为有线和无线(电磁波)。就是我发一系列的01数据给你,你再返回一系列的01串给我,双方要按照协议进行。至于所谓的01串代表什么意思,就要靠双方协商的协议和字符编码解释了。
程序的目的就是通过把现实中的问题抽象为计算机能理解的数据结构和算法,并编码实现。
……………….
我靠,写的真累,做饭去了,好饿。随便写的,贻笑大方了。