计算机的三个根本性原则
- 计算机是执行输入、运算、输出的机器
- 程序是指令和数据的集合
- 计算机的处理方式有时与人的思维习惯不同
计算机的五个基本组件
- 运算器:CUP的核心
- 控制器:时钟信号发生器,集成在CPU中
- 存储设备:内存
- 输入设备
- 输出设备
计算机的工作原理
- CUP在时钟信号的控制下,解释、执行存储在内存中的程序,按照程序中的指令把内存或I/O的数据输入到CPU中,在CPU中对数据进行运算,再把运算结果输出到内存或者I/O中
硬件的电路连接
机器语言与汇编语言
程序像河水般流淌
- 顺序执行
- 最基本的程序流程,由CPU的硬件功能实现。PC(Program Counter)寄存器中存储了下一个执行指令的内存地址。PC寄存器中存储的内存地址值会随着程序的执行自动更新。
- 分支与循环
- 在高级语言中使用程序块表示,在机器语言和汇编语言中通过跳转指令表示,在硬件上则是通过将PC寄存器上的值设置为要跳转的目的地的内存地址来实现。
- 中断处理(Interrupt)
- 由于外部原因使正常的流程中断,中断完后再返回到之前的流程的过程就是中断处理流程。用现实中的例子来对比就是正坐在办公桌前处理文件的时候,突然电话响了,就要放下手头的工作去接电话,接完电话再回头继续之前的工作。
- 计算机使程序的流程突然跳转到程序中的指定地方,这样的地方被称为中断处理例程(Routine)或者中断处理程序(Handler),这种跳转是通过CPU所具备的硬件功能实现的。
- 对比中断与监听的区别
- 接电话是中断
- 与人在线聊天是监听
- 事件驱动(Event Driven)
- 用户在应用程序中点击鼠标或者按下键盘等操作称为”事件”(Event)
- 由操作系统负责检测事件,操作系统调用程序事先定义好的特定函数通知应用程序事件的发生。
- 应用程序接收到操作系统的通知后根据事件类型做出相应的处理。
- 这样的机制就是事件驱动,本质上就是一种特殊的条件分支,以操作系统的通知为判断条件,根据通知内容决定程序的下一步流程。是一种适用于GUI的编程风格(人机交互就是典型的事件驱动)。
算法
- 算法就是结合计算机的特性,用程序来表现现实世界中对问题的处理步骤。有表示程序整体大流程的算法,也有表示程序局部小流程的算法。
- 算法要点
- 算法中解决问题的步骤是明确且有限的
- 计算机不依靠直觉,而是机械地解决问题
- 步骤明确,不依赖直觉
- 步骤机械,不需要思考
- 使步骤终止的原因明确
- 了解并应用典型算法
- 利用好计算机的处理速度
- 人无法遍历穷举,但是计算机可以
- 计算机的直觉就是遍历
- 算法优化就是提前排除不可能的答案,减少遍历次数
- 找出数字间的规律
- 对计算机而言,所有的信息都是数字,构造算法的核心就是找出数字间的规律
- 先在纸上考虑算法
数据结构
- 结合计算机的特性,用程序来表现现实世界中的数据结构
- 数据结构要点:
- 变量与内存的关系
- 变量是数据的容器
- 计算机所处理的数据都被存储在内存的IC(Integrated Circuit,集成电路)中。一般的计算机中,内存内部被分割成了若干个存储数据的单元,每个单元可以存储8bit的数据(8bit = 1Byte)。为了区分各个单元,每个单元都被分配了一个编号,这个编号即是”内存地址“
- 硬件上是通过指定内存地址找到对应的内存区域,从而获取里面存储的数据,进行处理。因为依靠指定内存的方式编写程序很麻烦,所以高级编程语言都是使用变量把数据存储进内存,或者从内存中把数据读出来
- 变量是程序中数据存储的最小单位,每一个变量都对应着一块物理上的内存空间
- 数组是数据结构的基础
- 内存中存储数据的空间就是连续分布的,数组反映了内存的物理机构本身。
- 数组是为了存储多个数据而在内存上集中划分出来的一段连续的存储空间,并为这段空间整体赋予了一个名字
- 只有连续才能使用索引,索引表示的是相对起始内存空间的偏移量
- 典型数据结构
- 数组直接利用了内存的物理机构,其他数据结构都是从逻辑上改变了内存的物理结构
- 栈 Last In First Out
- 需要定义一个数组和一个变量,数组所包含的元素个数,就是栈的大小。变量中存储一个索引,指向存储在栈中最顶端(的空位置,可以存储数据),这个变量被称为”栈顶指针”。添加数据时,栈顶指针指向新增的数据,同时更新栈中所存储数据的总数。删除变量时,栈顶指针指向被删除数据的下一个数据,更新栈中所存储数据的总数。
- 队列 First In First Out
- 需要定义一个数组、一个存储头部数据对应索引的变量,一个存储尾部数据对应索引的变量。逻辑上就是一个首尾相连的数组
- 链表
- 树
- 图
- 变量与内存的关系
面向对象
- 面向对象通过把组件拼装到一起构建程序。类(Class)就是程序的组件(Component)。汇集到类中的函数和变量统称为类的”成员”
- 面向对象就是顺应人的常规思维习惯(大件的物品都是由许多小的组件组装起来的),对现实世界建模,目的是提升程序的开发效率和可维护性,适用于大型程序的开发
- 面向对象与面向过程
- 非面向对象的编程,可以使用流程图表示程序的运行过程。流程图是表示处理过程的流程,因此把非面向对象称为”面向过程”
- 面向对象编程,通过对象间的消息传递来驱动程序,使用UML中的”时序图”和”协作图”表示程序的运行过程。
- 面向对象的基本特征
- 继承:复制已有的类,在复制的类中添加新的成员,生成新的类
- 封装:隐藏类中没有必要展现给调用者的成员
- 多态:针对同一种消息,不同的对象可以进行不同的操作
- 类与对象
- 类是对象的定义,对象是类的实例(Instance)
- 类的三种使用方法
- 调用类所持有的成员
- 在类的定义中包含其他类(组合)
- 通过继承已存在的类,定义出新的类
- Java与.Net
- 这两个都是位于操作系统之上,通过隐藏操作系统的复杂性从而提示开发效率的程序集,这样的程序集被称为框架(Framework)。框架由两部分构成,一部分是负责执行程序的”执行引擎“,另一部分是作为程序组件集合的”类库“。
- Java框架支持Java、Kotlin、Android等编程语言
- .Net框架支持C#、Visual Basic.Net、Visual C++等编程语言
数据库
- 数据库(Database)就是数据(Data)的基地(Base)
- 数据文件、DBMS、应用程序
- 数据库的实质是某种数据文件。
- 数据库应用程序时为了便于操作数据文件而编程的程序。
- 为了提高效率,数据库应用程序操作数据库时是一般使用现有DBMS(数据库管理系统)去间接操作数据文件。
- 数据文件、DBMS、应用程序三者构成了数据库系统三要素。
- 小型系统中,把三要素全部部署到一台计算机上,就形成”独立型系统“
- 中型系统中,把数据文件部署在一台计算机上,使数据文件被部署了DBMS和应用程序的多台计算机共享,就形成”文件共享型系统“
- 大型系统中,把数据文件和DBMS部署在一台(或多台)计算机上,用户从另外一些部署着应用程序的计算机去访问,这样的系统被称为”客户端/服务器型系统“。
- 把部署着数据文件和DBMS的服务器(Server)与部署着应用程序的客户端(Client)用互联网连接起来,就形成了”Web系统“
- 数据库设计
- 业务决定需要哪些的数据(确定字段)
- 确定数据的属性(字段类型、长度、默认值…)
- 拆表和整理数据实现规范化
- 使用主键和外键建立表与表的关系
- 键(Key)是表中反映表关系的字段
- 主键(Primary Key)能够唯一地标识表中的某条记录
- 外键(Foreign Key)是为了建立表与表之间的关系,而在表中添加的其他表的主键
- 当表与表之间出现”多对多”关系时,一般会在两张表间加入一张连接表(Link Table),把多对多关系拆解成两个一对多关系
- 检索数据
- 索引(Index)是一提升数据检索效率的机制。(对应书本的目录)
- 为字段建立索引后,DBMS就会创建一张索引表,存储着字段的值以及字段所对应记录的位置。
- 由于索引表中的数字段更少,因此可以更快速地对数据进行排序和检索。
- 查询数据时,DBMS先在索引表中进行数据的检索和排序,再根据索引表中记录的位置信息从主表中查询完整的记录。
- 使用索引后需要同时维护主表与索引表,会降低新增或修改数据的效率。因此只有那些需要频繁地进行检索和排序的字段,才需要设置索引。
- SQL
- 应用程序使用SQL(Structural Query Language)向BDMS发送指令,对数据库进行CRUD(CREATE、REFER、UPDATE、DELETE)操作。
- 事务控制
TCP/IP
- LAN(Local Area Network)局域网构成
- 计算机上的网卡(Network Interface Card)
- 插在网卡上的网线
- 把网线汇集起来的集线器(Hub),联通局域网内部的各台计算机
- 负责将局域网连接到互联网的路由器(Router)
- IP
- IP地址的作用是对计算机进行分组管理,便于网络通信时迅速找到目的地
- 设定了IP地址的计算机被称为”主机”(Host)
- IP地址由表示分组(即LAN)的网络地址和,和表示各台计算机(Host)的主机地址构成
- 子网掩码用于标识IP中哪部分是网络地址。子网掩码的格式是(255.255.255.xx),将所有数字用二进制表示,值为1的部分对应网络地址,值为0的部分对应主机地址
- DHCP(Dynamic Host Configuration Protocal)动态主机设置协议
- 记录着可以被分配到LAN内计算机的IP地址范围和子网掩码的值
- 自动给LAN内的计算机分配可用的IP
- 路由器
- IP地址中的网络地址部分可以代表一个组(LAN)中的全部计算机。互联网就是用路由器把多个LAN连接起来的一张大网
- 路由器是LAN通往互联网的入口(Gateway),设置IP地址时,”默认网关”通常就是路由器的IP
- 路由器中记录了一张路由表,工作原理就是查看被附加到数据上的IP地址中的网络地址部分,只要数据不是发给LAN内计算机的,就发送到互联网。
- route print 命令可以查看路由表
- tracert “要访问的计算机IP或域名” 可以跟踪路由转发过程
- DNS(Domain Name System)域名系统
- 由于IP地址难以记忆,因此通常使用更容易记忆的域名去访问服务,DNS的作用就是将域名解析为IP地址
- 命令行状态下,输入 nslookup 指令可操作DNS服务器。再输入要解析的域名,就可以看到解析后的IP地址
- ARP(Adress Resolution Protocol)地址解析协议
- 将IP与于MAC地址建立映射,实现IP地址到MAC地址的转换
TCP(Transmission Control Protocol)传输控制协议
- IP协议用于指定数据发送的目的地,并通过路由器转发数据
- TCP协议用于与目的地建立连接,可靠地进行通信
数据加密
- 加密的基本手段
- 对编码进行变换,即将构数据的编码变换为其他数值。反转这种变换过程,加密后的数据就可以还原。
- 对称加密
- 加密和解密的过程中使用相同的密钥
- 非对称加密
- 密钥分为公钥和私钥,公钥用于加密,私钥用于解密
- RAS算法
- 数字签名
- 确保数据的完整性,传输过程中没有被篡改
- 对全文数据按一定的算法计算出”信息摘要”
- 发送者使用私钥对信息摘要进行加密,得到信息摘要密文,发送
- 接收者使用公钥对信息摘要密文进行解密,得到信息摘要
- 接收者按同样的方法对全文数据进行计算。
- 将自己计算出的”信息摘要”与发送者发过来的”信息摘要”进行比对,二者一致就证明文件没有被篡改过
- 合理的密钥应该具备的条件
- 长短适中
- 可以反复使用
- 可以通过某种通信手段交给接收者
- 通信双方以外的人难以用它来解密
- 加密的基本手段
XML
- 通过添加标签为数据赋予意义的行为称为”标记”
- 给赋予数据意义的行为定义规则的语言,就是”标记语言”。可使用的标签种类决定了标记语言的规范。
- XML是Extensible Markup Language的缩写,即可扩展标记语言
- XML是元语言
- XML仅仅限定了进行标记时标签的书写格式(书写风格),并没有限定标签的使用方式。可以通过自定义标签种类创造出一门新的标记语言,这种用于创造语言的语言被称作”元语言”。
- XML的作用
- 为信息赋予意义
- 通用的数据交换格式
- XML命名空间
- 同样名称的标签,不同的人有不同的解读,为了比避免同形异义词带来的混乱,诞生了命名空间,用于修饰限定标签名字以及标签所代表的含义。
- 通过把”xmlns = 命名空间的名字 “作为标签的属性,就可以为标签设定命名空间。通常使用全世界唯一的标识符作为命名空间名称。互联网中,公司的URI就是最直观的唯一标识,因此目前看到的xmlns后面都是各种url地址。
- XML文档结构
- 完整的XML文档包括XML声明、XML实例和XML文档类型描述(Document Type Definition,缩写为DTD)。
- DTD的作用是定XML的实例结构,XML实例内容进行严格约束(标签名称等)
- 更加复杂的文档结构约束技术是 XML Schema(比DTD更加细化,可以对数据类型、数字位数等进行约束)
- 解析XML的规范
- DOM(Document Object Model) 将整个xml以DOM树的形式加载进内存
- SAX(Simple API for XML) 逐行读取xml