1.计算机的三大原则

输入、运算、输出、指令、数据、计算机的处理方式、计算机不断进化的原因

  • 在GBK编码下,一个汉字占用2个字节。而在UTF-8字符编码下,一个汉字占用3个字节
  • 什么是编码?

通常将为了便于计算机处理而经过数字化处理的信息称作编码。
计算机内部会把所有的信息都当成数字来处理,尽管有些信息本来不是数字。
由于表示字符的数字是“字符编码”,用于表示颜色的数字是“颜色编码”。

计算机的三个根本性基础

从大约50年前的第一代计算机到现在,计算机并没有发生什么本质性的改变

  • 计算机是执行输入、运算、输出的机器
    • 输入、运算、输出是硬件的基础
    • 计算机的硬件由大量的IC组成(集成电路,Integrated Circuit),每块IC上都带有许多引脚,这些引脚有的用于输入,有的用于输出。IC会在其内部对外部输入的信息进行运算并把运(计)算结果输出到外部
    • 计算机就是一台简单的机器,因为它只能做这三件事,但是,输入、运算、输出三者必须成套出现,缺一不可
  • 程序是指令和数据的集合
    • 程序其实非常简单,只不过是指令和数据的集合
    • 无论程序多么高深、多么复杂,其内容也都是指令和数据。指令就是控制计算机进行输入、运算、输出的命令
  • 计算机的处理方式有时与人们的思维习惯不同(计算机的处理方式往往不符合人们的思维习惯)
    • 对计算机来说什么都是数字,用数字表示所有信息,这就是一个很具有代表性的计算机式的处理方法,这一点也正是和人类的思维习惯最不一样的地方

2.试着制造一台计算机吧

1.CPU是计算机的大脑,在其内部可对数据执行运算并控制内存和I/O。
2.内存用于存储指令和数据。
3.I/O负责把键盘、鼠标、显示器等周边设备和主机连接在一起,实现数据的输入域输出。

4.只要用电路把CPU、内存以及I/O上的引脚互相连接起来,为每块IC提供电源,再为CPU提供施工信号,硬件上的计算机就组装起来了。
5.所谓时钟信号,就是由内含晶振的、被称作时钟发生器的元件发出的滴答滴答的电信号。
6.CPU必须有时钟信号才能工作,因为时钟信号用来同步CPU中各种门电路,可以认为时钟脉冲来一下,CPU就动一下。而时钟脉冲的存在就是给一个时钟周期让各种门电路完成运算(其实就是一个一个电容的充电放电的转换,但这个转换也需要时间,因为是电容状态的变化)。但CPU动一下不见得就能执行完一条指令,实际上需要动很多下才能执行完一条指令。

7.CPU上数据总线的条数(带宽),或者CPU内部参与运算的寄存器的容量,都可以作为衡量CPU性能的比特数

3.体验一次手工汇编

1.汇编指令按功能可以分成运算、与内存的输入输出和与I/O的输入输出这3类,因为计算机能做的也只有输入、计算、输出这3种
2.Z80 CPU中的主要指令
指令的种类 | 助记符 | 功能
运算指令 | ADD A, num | 把数值 num 加到寄存器 A 的值上
| ADD A, reg | 把寄存器 reg 的值加到寄存器 A 的值上
| SUB num | 从寄存器 A 的值中减去数值 num
| SUB reg | 从寄存器 A 的值中键入寄存器 reg 的值
| INC reg | 将寄存器 reg 的值加 1
| DEC reg | 将寄存器 reg 的值减 1
| AND num | 计算寄存器 A 的值和数值 num 的逻辑积
| AND reg | 计算寄存器 A 的值和寄存器 reg 的值的逻辑积
| OR num | 计算寄存器 A 的值和数值 num 的逻辑和
| OR reg | 计算寄存器 A 的值和寄存器 reg 的值的逻辑和
| XOR num | 计算寄存器 A 的值和数值 num 的逻辑异或
| XOR reg | 计算寄存器 A 的值和寄存器 reg 的值的逻辑异或
| SLA reg | 对寄存器 reg 的值进行算术左移运算
| SRA reg | 对寄存器 reg 的值进行算术右移运算
| CP num | 比较寄存器 A 的值和数值 num 的大小
| CP reg | 比较寄存器 A 的值和寄存器 reg 的值的大小
内存与CPU之间的输入输出指令 | LD reg, num | 把数值 num 写入到寄存器 reg 中
| LD reg1, reg2 | 把寄存器 reg2 的值写入到寄存器 reg1 中
| LD (num), reg | 吧寄存器 reg 的值写入到地址 num 上
| LD (reg1), reg2 | 把寄存器 reg2 的值写入到存放在寄存器 reg1 中的地址上
| PUSH reg | 把寄存器 reg 的值写入到栈中
| POP reg | 把由栈顶读出的数据存放到寄存器 reg 中
I/O与CPU之间的输入输出命令 | IN A, (num) | 从地址 num 中读出数据,存放到寄存器 A 中
| IN reg, (C) | 从存储在寄存器 C 中的地址上读出数据,存放到寄存器 reg 中
| OUT (num), A | 把寄存器 A 的值写入到地址 num 上
| OUT (C), reg | 把寄存器 reg 的值写入到存储在寄存器 C 中的地址上
程序流程控制指令 | JP num | 把程序的流程跳转到地址 num 上,接下来从那个地址上的指令开始执行
| CALL num | 调用存放在地址 num 上的子历程
| RET | 从子历程中返回
| HALT | 终止CPU的运行

3.内存存放着程序,程序是指令和数据的集合,I/O中临时存放着用于周边设备进行输入输出的数据
4.CPU的寄存器不仅能存储数据,还具备对数据进行运算的能力,CPU带有什么样的寄存器取决于CPU的种类
5.寄存器的用途取决于它的类型,有的指令只能将特定的寄存器指定为操作数;举例来说:A 寄存器也叫做“累加器”,是运算的核心;F 寄存器也叫做“标志寄存器”,用于存储运算结果的状态,比如位是否发生了进位、数字代销的比较结果等;PC 寄存器也叫做“程序指针”,存储这指向CPU接下来要执行指令的地址。PC 寄存器的值会随着时钟信号自动更新,可以说程序就是依靠不断变化的PC寄存器的值运行起来的;SP 寄存器也叫做“栈顶指针”,用于在内存中创建出一块称为“栈”的临时数据存储区域。

6.操作数必须是已存储在CPU寄存器中的数字,这是汇编语言的规定
地址 汇编语言 机器语言

00000000 LD A, 207 00111110 11001111
OUT (2), A
LD A, 255
OUT (2), A

LD A, 207
OUT (3), A
LD A, 0
OUT (3), A

LOOP: IN A, (0)
    OUT (1), A
    JP LOOP

一条汇编指令翻译成机器码后背CPU执行需要若干个时间中期(电位的变化执行步骤),比如 LD A, num 需要7个时钟周期,OUT (num), A 需要11个时钟周期,通过计算我们可以估计出程序执行所需的耗时

4.程序像河水一样流动

流程图(Flow Chart)、顺序/分支/循环、事件驱动。CPU在同一时刻只能解释、执行一条指令,把指令和作为指令操作对象的数据排列起来就形成了程序,CPU就是在时钟信号发生器产生的时钟信息的脉冲下,从内存中读出指令然后一条一条指令的解释、执行,指令可以是分支、循环或者是让CPU休眠。
PC寄存器(Program Counter,程序计数器)负责存储下一条即将执行指令的内存地址,PC寄存器的值会自动更新

2种特殊的程序流程:
中断处理(Interrupt): 计算机使程序的流程突然跳转到程序中的特定地方,这种跳转是通过CPU所具备的硬件功能实现的
事件驱动(Event Driven): 操作系统通知应用程序发生的事件,应用程序根据事件的类型作出相应的处理,这种机制就是事件驱动

5.算法

算法(Algorithm):被明确定义的有限个规则的集合,用于根据有限的步骤解决问题
程序是用来在计算机上实现现实世界中的业务和娱乐活动的,为了达到这个目的,程序员需要结合计算机的特性,用程序来表示现实世界中对问题的处理步骤流程。

6.数据结构

变量是数据的容器,变量的实质是按照变量所存储数据的大小被分配到的一块内存空间
数组是一种直接利用计算机的内存物理结构(线性的)的最基本的数据结构,凭借数组可以实现各种各样的算法,但是在现实世界中也有一些数据结构仅凭数组是无法实现的,这个时候就需要通过程序从逻辑上改变内存的物理结构,比如典型的数据结构有:
栈(Stack):Stack的本意是干草堆,从下往上堆,然后从上往下取,Last In First Out.
队列(Queue):等待做某事而排成的队,First In First Out.
链表:链表可以灵活的改变数据的排列结构而不用拷贝大量的数据,只需要将指针进行置换
二叉树:特殊的链表,一样是结构体、指针、自我引用

数据结构的基础是数组

程序是“指令”和“数据”的集合,在古老的C或BASIC等语言编程时,用“函数”表示指令,用“变量”表示数据,所以对于C/BASIC而言,程序就是函数和数据的集合。随着程序变大,用到的函数和变量也剧增,于是一种新的编程方法就被发明处理了,即把程序中有关联的函数和变量灰机到一起编程组,这里的组就是类,这就是面向对象编程,面向对象编程的程序就是类的集合。

7.面向对象

对于类的使用者而言“类看起来是什么样子的”这种关于规范的描述通常被称为“接口”(Interface)

类的创建者视角和使用类视角

程序员是工程师,工程是一种亲身参与的活动而不是一门学问,不实际的应用就不能充分的掌握
面向对象编程就是通过把组件拼装到一起进行编程的方法

8.一用就会的数据库

键用于设定表和表之间的关系(Relationship),而索引是提升数据检索速度的机制
表中的每一行都称为记录,也被称为行或元祖(Tuple),字段有时也被称为列或属性(Attribute)
数据库规范化:将大表拆分成多张小表,在小表之间建立关系,形成结构更加优良的数据库,要点在于避免重复存储相同的数据
表达一对多和多对多关系的表是连接表(Link table)
优先设计数据库,然后再设计用户界面

9.通过 7 个简单的实验理解 TCP/IP 网络

  1. 网络环境:
    LAN-Router-Internet

  2. CSMA/CD(Career Sense Multiple Access with Colllision Dectection,带冲突检测的载波监听多路访问) 的工作方式:
    CSMA-CD

    CSMA/CD 只是一种适用于 LAN 的机制
    可以用被称作 MAC(Media Access Control) 地址的编号来指定电信号的接受者,在每一块网卡所带用的 ROM(Read Only Memory,只读存储器)中都预先烧录了一个唯一的 MAC 地址。
    MAC 地址是网卡的硬件层面的标识,而 IP 地址是一台计算机的软件上的编号。
    通常把设定了 IP 地址的计算机称为“主机”(Host),路由器也算是计算机的一种,所以它们也有 IP 地址。在 TCP/IP 网络中,传输的数据都会携带 MAC 地址和 IP 地址这 2 个地址。
    IP地址(0.0.0.0~255.255.255.255)的第 1 段到第 3 段的数值标识公司,第 4 段的数值代表公司内部的计算机。通常把 IP 地址中标识分组(即 LAN)的部分称作“网络地址”,表示各台主机的部分称为“主机地址”。
    子网掩码,如 255.255.255.240,其作用是标识出在 32 比特的 IP 地址中,从哪一位到哪一位是网络地址,从哪一位到哪一位是主机地址。255.255.255.240 用二进制表示是 11111111.11111111.11111111.11110000,子网掩码中,值为 1 的那些位对应着 IP 地址中的网络地址,后面值为 0 的那些则对应着主机地址。
    4 个二进制数可以表示的范围从 0000 到 1111,共 16 个数,头尾的 0000 和 1111 具有特殊用途,所以该 LAN 下最多配置 14 台主机,范围从 0001 到 1110,而这其中又有一台路由器,所以最多放置 13 台计算机。
    LAN 局域网内的主机在启动时会自动的去 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 服务器获取 IP 地址和子网掩码,DHCP服务器上记录着可以被分配到 LAN 内计算机的 IP 地址范围和子网掩码的值。
    在 LAN 的主机配置中,有一个叫“默认网关”,通常会把路由器的 IP 地址设置为默认路由,也就是路由器是 LAND 通往互联网世界的入口(Gateway),路由器的 IP 地址可以从 DHCP 服务器获取,DNS 服务器的 IP 地址也可以从 DHCP 服务器获取。DHCP 一般不会在 linux 上单独使用,一般在路由器和三层交换上搭建。
    在分组管理下,IP 地址中的网络地址部分可以代表一个组中的全部计算机,互联网真是由路由器把多个 LAN 连接起来所形成的一张大网。
    路由器是决定数据传输路径的设备,虽然看起来是个小盒子,但实际上是一台神奇的计算机,分布在世界各地的 LAN 中的路由器相互交换着信息,这些信息是“路由表”,这是这些信息的交换才使得互联网可以连通,一台路由器的路由表中只会记录通往与之相邻路由器的路径
    在互联网的世界中,到处传输的都是附带了 IP 地址的数据,但是能作为数据最终接受者的网卡的,还是 MAC 地址。于是计算机中就加入了一种程序用于实现 IP 地址和 MAC 地址的转换,这种功能被称作 ARP(Address Resolution Protocol,地址解析协议),ARP 协议会使用广播消息询问 LAN 中的每台主机是否有匹配的 IP 地址从而获取到相应的 MAC 地址。为了加速 ARP 会提供缓存的功能。
    IP 协议用于指定数据发送目的地的 IP 地址以及通过路由器转发数据。而 TCP 协议则通过数据发送者和接受者相互回应对方发来的确认信号进行可靠地传输数据,这样的数据传送方式称作“握手”(Handshake)。TCP协议还规定,发送者要先将大数据分割以“包”(Packet)为单位的数据单元,然后再发送,而接受者要把收到的包拼装在一起还原出原始数据。
    Handshake
    操作系统将实现了 TCP 和 IP 等协议的程序作为自身的一部分功能提供,遵循约束表现在统一数据的格式上。
    Packet
    硬件上发送数据的是网卡,在网卡之上是设备驱动程序(用于控制这类硬件的程序),设备驱动程序之上是实现了 IP 协议的程序,IP 程序之上则是实现了 TCP 协议的程序,再往上才是应用程序,比如 Web 或电子邮件。TCP 协议事宜被称作“TCP端口号”的数字识别上层的应用程序,有一些是预先定义好的,比如 Web 使用 80 段坤,电子邮件使用 25 端口(用于发送)和 110 端口(用于接收)。
    TCP-IP

10.试着加密数据吧

信息摘要是指从作为数字签名对象的文件整体中计算出的数值,加密过的信息摘要就是数字签名
虽然存在各种各样的加密技术,但是其中的基本手段无外乎还是字符编码的变换。
可以用 XOR 运算法则来进行加密,而 XOR 加密后的密文又可以用 XOR 解密成明文
对称加密:加密和解密使用相同的秘钥
非对称加密:加密和解密使用的秘钥是不同的。使用私钥加密,公钥可以解密;使用公钥加密,私钥可以解密。
MD5(Message Digest5) 信息摘经过精心的设计,使得两段明文即使只有略微的差异,计算出来的摘要也是不同的

11.XML 究竟是什么

XML 是 Extensible Markup Language(可扩展标记语言)的缩写,所谓标记语言,就是可以用标签为数据赋予意义的语言
HTML(Hypertext Markup Language) 就是一种标记语言,通常把通过添加标签为数据赋予意义的行为称为“标记”,为这种给数据赋予意义的行为定义规则的语言就是“标记语言”。HTML 是用于编写网页的标记语言,更简单地说法就是 HTML 决定了 可用于编写网页的标签。
可使用的标签的种类决定了标记语言的规范。
XML不会规定特定的标签,相反是允许使用者自由的创建标签,这就是“可扩展”,XML 仅仅限定了进行标记时标签的书写格式。通过定义要使用的标签种类,就可以创造一门新的标记语言,这种用于创造语言的语言被称作“元语言”。
HTML 中规定的各种标签只能用来指定信息的呈现样式,而不能标识信息的含义,因为 HTML 中并没有标识这些信息含义的标签,而 XML 可以,XML 的主要用途是为在互联网上交换的信息赋予意义。
HTML 是给人看的,XML 是给计算机看的
XML
XML 是 W3C(World Wide Web Consortium,万维网联盟)机构制定的通用标准,是不依赖于特定厂商的。而 CSV(Comma Separated Value,逗号分隔值) 也是一个长久以来被作为通用数据交换格式的一个规范。
在 CSV 中只记录了信息本身,而并没有为各个信息赋予意义。同时 XML 的标签太多了会占用更多的存储空间、更长的传输和处理时间
XML 的命名空间,用来避免同名标签的语义冲突,用 xmlns=”” 来标识
Valid XML Document,有效的 XML 文档是指在 XML 文档中写有 DTD(Document Type Definition,文件类型描述)信息,于 DTD 相同,还有一个名为 XML Schema 的技术也可用于定义 XML 的结构。
处理 XML 文档的通用程序组件有 W3C 标准的 DOM(Document Object Model,文档对象模型)以及由 XML-dev 社区开放的 SAX(Simple API for XML)。无论是 DOM 还是 SAX,都只是组件的规范,实际的组件是由某个厂商或社区提供的。(这就是接口规范的好处)
用 XML 可定义出各种各样的标记语言,如 SOAP(Simple Object Access Protocol,简单对象访问协议),可用于分布式计算。所谓分布式计算,就是把程序分散部署在用网络连接起来的多台计算机中,使这些计算机相互协作,充分发挥计算机整体的计算能力。SOAP 可以使在 A 公司计算机中的 A 程序,可以调用运行在 B 公司计算机中的 B 程序(混合私有云?)。
SOAP
XML 是通用的,但它不是万能的,XML 中的 X 还可以看做是 eXchangable(可交换的)
只要用<![CDATA[]]>把内容括起 来,就可以在里面直接使用“<”“>”“&” “””和 “’”这 5 个特殊符号了。这种写法适 用于要书写大量特殊符号的场景

12.SE 负责监管计算机系统的构造

SE(System Engineer,系统工程师):调查、分析客户的业务内容、计算机系统的基本设计、确定计算机系统的规格、估算开放费用和开发周期、项目管理、软件开发管理、计算机系统的维护管理;倾听需求、书写策划案、硬件、软件、网络、数据库、管理能力。
程序员:制作软件(编程);编程能力、算法和数据结构、关于开发工具和程序组件的知识
瀑布模型:
需求分析:系统策划文档、系统功能需求需求规格文档
外部设计:外部设计文档(用户视角)
内部设计:内部设计文档(开发者视角)
程序设计:程序设计文档
编码实现:模块设计文档、测试设计文档,模块,就是拆解出来的构成程序的要素,只要经过了充分的程序设计,编程就变成一项简单的工作
测试:测试报告,必须定量的用数字表示出测试结果
部署、维护:部署手册、维护手册,维护是指定期检查计算机系统能否正常中(比如检查错误日志)

所谓设计,就是拆解
从需求分析到程序设计,所进行的工作都是拆解业务,把计算机系统所代替的手工业务拆解为细小的要素。变编码实现到部署、维护阶段,所进行的工作则是集成,把拆解后的细小要素转换成程序的模块,再把这些模块拼装在一起构成计算机系统。
庞大复杂的食物往往无法直接做出来。人们往往把庞大复杂的食物先分解成细小简单的要素来进行设计。
modules
计算机系统的设计就是拆解,以下是几个具有代表性的程序设计方法:
design_methods
只有以易于维护为标准把业务拆解成对象的做法,才是具有专家风范的面向对象法,因为现实世界的业务必定会发生变化
SE 的工作是分析靠手工作业完成的业务,提出能够用计算机解决客户所面临问题的方法。