计算机的本质
- 人们使用计算机的初衷就是快,能够比人做的更快。
- 计算机的本质是利用了光速,已知世界中光速最快,其实质是利用了通电后磁场建立的速度,也就是光速
- 人们采用了最简单的方式去利用光速,那就是二进制
- 二进制的本质就是通电和断电,用0和1表示,现实中是利用高电位和低电位标识0和1,毕竟断电了就无法构建磁场了
闲谈扩展:
- 据说高维空间(大于三维空间)光速会更快,也就是说高维空间的计算机速度更快,更有无限可能,但空间维度理论是否合理还存在争论
- 改变利用光速的方式,可以提高效率,比如使用其他进位制,而非二进制
对于如何利用光速来制作机器(也就是计算机),历史上前辈们给出了无数答案,最终胜出的是冯·诺依曼体系结构
冯·诺依曼体系结构
冯·诺依曼理论的要点是:数字计算机的数制采用二进制,计算机应该按照顺序执行程序。
如图1-1所示,冯·诺依曼定义了计算机的三大组成部件:
- I/O设备:负责数据和程序的输入输出
- 存储器:存储程序和数据
- 处理器:分成运算器和控制器,运算器负责数据的加工处理,控制器控制程序的逻辑
计算机科学的历史就是一直围绕着这三大部件,从硬件革命到软件革命的发展史。从软件革命的历史来看,计算机科学一直围绕着数据、逻辑和界面三大部分演变,数据对应着存储器、逻辑对应着处理器、界面对应着I/O设备。
软件和硬件
聪明的人们把计算机分成了两大部门,硬件和软件
- 硬件:提供运算的载体,本质是提供了光速运行通路,是物理的,一旦生产成功是不变的
- 软件:提供运算的方式或模型,本质是规定了光速的运行方式或运行路径,是逻辑的,可以随时改变
有意思的是硬件就像是人的躯体,软件就像是人的思维
这样硬件其实是限制了运行速度,软件提供了无限可能,变与不变之间构成了一种哲学美。
软件的本质
软件=算法+数据
描述算法的载体叫做编程语言
编程语言按对人类语言的友好程度依次分为:
- 机器指令:就是0和1
- 汇编语言:对机器指令的抽象
- 面向过程语言:对汇编语言的抽象,最具代表性的是c语言
- 面向对象语言:用人类的视角看世界,把万事万物理解为对象和对象的联系,最具有代表性的语言是Java语言
- 汇编语言和机器指令被成为低级语言,其他语言被成为高级语言
数据在计算机中都是0和1的存在,按结构形式可以分为两类:结构化数据和非结构化数据
结构化数据:
- 文本
- 电话号码
- 邮箱
- 表格
- JSON
- HTML
- ……
非结构化数据:
- 视频
- 音频
- 图片
- ……
有意思的是,算法就像是人的思维模型,数据就像是思维的产物,知识。
汇编语言对冯·诺依曼结构的抽象
汇编语言是对冯·诺依曼结构最为直接的抽象,在汇编语言中只有三种操作对象:寄存器、存储器和I/O设备。
寄存器是处理器的主要组成部分,这些寄存器分别承担着运算器和控制器的角色,比如指令寄存器(IR,InstructionRegister)和段寄存器 (SR,Segment Register)负责程序的逻辑处理,而累加寄存器(AR,Accumulator Register)则负责程序的运算。
汇编就是对0和1机器指令进行了封装和抽象,定义了一组常用的操作,并用命令代替。
面向过程语言对冯·诺依曼结构的抽象
在计算机科学的发展史上,计算机软件科学的发展围绕着这样一个趋势:如何对数据、逻辑和界面进行更深层次的抽象,使得人类可以更方便的控制存储器、处理器和I/O设备,从而极大的提供人类的生产效率。C语言是对冯·诺依曼体系结构的最高层次的抽象,C语言让程序员可以从容的控制存储器、处理器和I/O设备。
C语言从数学层面,把汇编语言进一步封装和抽象,利用数学这一工具,提供面向过程的编程方式。
其核心思想是,过程和函数。把事情分解成多个步骤,即一个过程,每个步骤用一个函数代替,函数只关注输入和输出。
面向对象语言对冯·诺依曼结构的抽象
由于现实中的问题太复杂了,有些问题完全按过程拆分,超出了人脑的极限,于是,人类视角看待世界的方式——面向对象语言出现了。
面向对象就是把万事万物看成一个又一个的对象,世界上只存在对象和对象之间的联系,用类和方法来表示,同时定义了对象的继承、封装等等概念。
面向对象最为代表性的语言是C++和Java,C++是对C的扩展,在C的基础上提供了面向对象的能力,C++兼具面向过程和面向对象两种编程思想,但是C++的语法糖过于复杂,对程序员的要求极高。后人设计了Java简化了C++的语法糖,提高了安全性。
最大的软件是操作系统
由于硬件是一堆通电了的机器,想让他按照人类的想法运作还是比较麻烦的,一种好的方式是提供操作系统。
操作系统是一个管理者,它管理硬件,并虚拟出一个友好的用户界面,为人类提供服务。
操作系统的发展史:
- 命令行模式,比如Doc,Unix,Linux等
- 图形界面模式:比如MacOS,Windows,Android,IOS等
C语言的天下
由于所有的操作系统都是C语言编写的,故当下是C语言的天下。几乎所有的语言语法都继承了C的语法,几乎完全一致,故C语言是必学语言。
软件的分类
- 最底层的是操作系统软件
- 然后是基础软件,如:数据库,编译器,中间件等等
- 然后是应用软件,我们平时使用的多是应用软件
- 现在应用软件上又出现了小程序
应用软件按行业又分为:
- 特殊行业软件,如:医疗,汽车,航天,卫星等等
- 大众行业软件,如,office,微信,支付宝等等
应用软件按架构可以分为:
- C/S架构:客户端/服务器软件
- B/S架构:浏览器/服务器软件
常用的高级语言
- C++:目前多用于底层开发或嵌入式开发,如编译器,数据库,操作系统,游戏引擎或嵌入式软件开发
- Java:世界上使用人员最多的后端编程语言,几乎覆盖了所有使用场景,首屈一指的编程语言,涵盖桌面、服务端、移动端、大数据等多个场景,是国内企业的首选
- js:浏览器唯一运行语言,这个绝对是世界上使用人数最多的编程语言,覆盖了前端100%的场景(浏览器,App,物联网等等),值得一提的是nodejs的出现让支持后端编程成为了可能。
- go:分布式系统开发,尤其是云计算,可以比C++节省6倍的代码,分布式系统开发占有绝对地位
- python:脚本语言的代表,在数据处理,人工智能行业具有代表性
- 其他不多介绍,常用编程语言至少50种,世界上编程语言不少于两千种。