《计算机是如何跑起来的》笔记

备注:本文是《计算机是如何跑起来的》–矢泽久雄 读书笔记

计算机的三个根本性基础

1.1 计算机的三个根本性基础

  1. 计算机是执行输入,运算,输出的机器
  2. 程序是指令和数据的集合
  3. 计算机的处理方式有时和人们的思维习惯不同

1.2 输入,运算,输出是硬件的基础

1.3 软件是指令和数据的集合

  1. 指令就是控制计算机进行输入,运算,输出的命令
  2. 数据分为两类,一类是作为指令执行对象的输入数据,一类是执行结果得到的输出数据
    编程时程序员会为数据赋予名字,成为变量

1.4 对计算机来说什么都是数字

无论处理图片,文字,音频,计算机都会转换为数字来处理

1.5 只要了解了三大原则,即使遇到难题也能轻松应对

1.6 为了贴近人类,计算机在不断进化

2D–>3D, DOS–>WIndows


试着制造一台计算机吧

CPU: Central Processing Unit
IC的一个引脚(两种状态)表示一个比特,8个引脚可组成一个字节.
比特是信息的最小单位,字节是信息的基本单位
I/O可以中断CPU正在执行的程序处理流程


体验一次手工汇编

机器语言:

由二进制数字构成的程序,CPU可以直接对其解释,执行
所有语言,包括汇编语言都需要先转换为机器语言才能被执行
相同的机器语言,只要CPU不同,对其解释也可以不同

3.2 机器语言和汇编语言

机器语言是0,1的组合,人很难看出这些组合代表什么,因此根据表示的指令功能来起一个相似的昵称,并将这个昵称赋予
给0和1的组合,这种类似英语单词的昵称叫做”助记符”,使用助记符的变成语言叫做”汇编语言”.
汇编语言中提供了多少中助记符,CPU就有多少种功能.

3.5 在CPU的资料中,明确写有所有可以使用的助记符,以及助记符转换为机器语言后的数字,因此对照资料可以手动把汇编语言转换为机器语言.

eg: LD A,num 对应 00111110 num LD A,207
就匹配上面的助记符模式,表示把207写入CPU的寄存器A中,转换为机器语言就是 00111110 11001111
其中 11001111是207的二进制


程序像河水一样流动着

4.1 程序的流程分为三种

计算机的运作方式:计算机硬件系统由CPU,IO和内存三部分构成.内存中存储着程序,也就是指令和数据.CPU配合着由时钟发生器发出的时钟信号,从内存中读取指令,然后再依次对其进行解释和执行.

4.4 结构化程序设计

由学者戴克斯特拉提倡的一种编程风格,简单说,近使用顺序,条件,循环表示程序的流程,而不再使用跳转命令.
先前很多程序流程发生错误时会转到执行错误处理的地方,目前用程序块来表示这种错误处理方式机制,就是结构化异常处理,例如 try ~ catch ~ finally
其实我们无意中已经在运用结构化程序设计,只是没有关注到.

4.5 画流程图来思考算法

算法,就是解决既定问题的步骤. 想让计算机解决问题,就需要把问题的解法转化成程序的流程.


与算法成为好朋友的七个要点

5.2 要点1: 算法中解决问题的步骤是明确且优先的
5.3 要点2: 计算机不是靠直觉而是机械地解决问题
5.4 要点3: 了解并应用典型算法

<算法技术手册> [美]海涅曼 著,波利切 著 <算法精解:C语言描述>[美]Kyle Loudon 著

5.5 要点4: 利用计算机的处理速度
5.6 要点5: 使用编程技巧提升程序执行速度
这里有一个关于“哨兵”的使用,可以看下。
5.7 要点6: 找出数字键的规律
所有信息都可以用数字表示–这是计算机的特性之一。因此为了构造算法,经常回利用到存在于数字间的规律。
5.8 要点7: 要现在纸上考虑算法
这是最为重要的一点,要现在纸上用文字或者调表描述出解决问题的步骤

个人总结:学习算法首先要明确算法的定义,其实就是利用计算机对数据进行有限步骤处理从而得到结果.不去考虑过于 复杂算法的情况下,我们日常学习要掌握典型的经典算法,在实际工作中加以独立思考运用,并掌握设计算法的基本方法 (流程图).


与数据结构成为好朋友的七个要点

程序中的变量是指什么?
答: 变量是数据的容器,实质是按照变量所存储数据的大小被分配到的一块内存空间.
把若干数据直线排列起来的数据结构是什么?
答:是数组,数组实质是连续分配的一块特定大小的内存空间.

6.1 要点1: 了解内存和变量的关系

计算机中,内存被分割成了若干个数据存储单元,每个单元可以存储8比特数据(8比特=1字节),为了区分各个单元,每个单元都被分配了一个编号,这个编号被称为地址.如果有64M内存,那么地址就是0到64M.
因为依靠指定地址的方式编写程序很麻烦,所以在C语言,Java等语言中,都是使用变量把数据存储进内存,或从内存中把数据读出来.

6.2 要点2: 了解作为数据结构基础的数组

数组实际上是为了存储多个数据而在内存上集中分配出的一块内存空间,并且为这块空间整体赋予了一个名字.
数组是数据结构的基础,之所以这么说是因为数组反应了内存的物理结构本身.

6.3 要点3: 了解数组的应用–作为典型算法的数据结构

数组之所以方便,就是因为可以把循环计数器的值与数组的索引对应起来使用.

6.4 要点4: 了解并掌握典型数据结构的类型和概念

栈(Stack)的本意是干草堆,存取方式是LIFO(Last In First Out 先进后出)
队列(Queue)就是等待做某事而排成的队,存取方式FIFO(First In First Out)
链表的概念相当于几个人手拉手排成一排
二叉树从树干开始分杈,树枝上又开始分杈,但是每次都会分为两杈.本质是链表的特殊形态.

6.5 要点5: 了解栈和队列的实现方式

实现栈这种数据结构,首先定义一个数组和一个变量.数组存储数据,变量作为栈顶指针.接下来编写两个函数Push(),Pop().在两个函数中存储数据更新指针即可.

    char Stack[100];
    char StackPointer = 0;

    void Push(char data) {
        Stack[StackPointer]=data;
        StackPointer++;
    }
    char Pop(){
        StackPointer--;
        return Stack[StackPointer];
    }

实现队列需要以下几点
1. 一个任意大小的数组
2. 一个用于指向队头数据对应索引的变量
3. 一个用于指向队尾数据对应索引的变量
4. 一对函数,用来存取数据

注意如果数据一直存放到了数组末尾,那么下一个存储位置就会折回数组的开头(开头数据已经取出).这样就相当于数组的末尾和她的开头连接上了,于是虽然数组的物理结构是”直线”,但是其逻辑结构已经变成”圆环”了.

    char Queue[100];
    char SetIndex = 0;
    char GetIndex = 0;

    void Set(char data) {
        Queue[SetIndex] = data;
        SetIndex++;
        if (SetIndex >= 100) {
            SetIndex = 0;
        }
    }

    char Get() {
        char data = Queue[GetIndex];
        GetIndex++;
        if (GetIndex >= 100) {
            GetIndex = 0;
        }
        return data;
    }

6.6 要点6: 了解结构体的组成

要想理解用C语言实现链表和二叉树的方法,就必须了解何谓”结构体”.所谓结构体,就是把若干数据项汇集到一处并赋予其名字后所形成的一个整体.例如,可以把学生的语文,数学,英语的考试成绩汇集起来,做成一个叫做TestResult的结构体

strcut TestResult{
    char Chinese;
    char Math;
    char English;
}

6.7 要点7: 了解链表和二叉树的实现方法

链表是一种类似数组的数据结构,这个”数组”中每个元素和另一个元素都好像是手拉着手一样.
我们在结构体中添加一个指针变量Ptr,指针类型就是本结构体的数据类型.这种特殊的结构体成为”自我引用的结构体”
Ptr中存放着下一个元素的地址.这样对大量数据的排序,插入,删除就不用更换数据在内存中的位置了,只需要改变Ptr的值.

strcut TestResult{
    char Chinese;
    char Math;
    char English;
    struct TestRestult* Ptr;
}

明白了链表的构造,也就明白了二叉树的实现方法.只不过是二叉树中带有两个指针.

strcut TestResult{
    char Chinese;
    char Math;
    char English;
    struct TestRestult* Ptr1;
    struct TestRestult* Ptr2;
}

成为会使用面向对象编程的程序员吧

此书写于2003年,那时面向对象可能并不普遍.

7.3 观点1: 面向对象编程通过把组件拼装到一起构建程序

在面向对象中,使用了一种成为”类”的要素,可以说类就是组件.面向对象就是灵活地运用类.

7.4 观点2: 面向对象编程能够提升程序的开发效率和可维护性

在使用OOP语言开发时,并不是所有的类都必须由程序员亲自编写.大部分类都已内置到语言中了,这些类被称为”类库”
还有一些类本来是为其他程序而编写的,有时也可以拿过来使用.

7.5 观点3: 面向对象编程时适用于大型程序的开发方法.
7.6 观点4: 面向对象编程就是在为现实世界建模
7.7 观点5: 面向对象编程可以借助UML设计程序

UML(Unified Modeling Language,统一建模语言),其中对顶了九种图,从而从各种各样的角度表示对现实世界建模的结果.

这里写图片描述

7.8 观点6: 面向对象编程通过在对象间传递消息驱动程序

7.9 观点7: 在面向对象编程中使用继承,封装和多态

继承,封装,多态被称为OOP的三个基本特性.


一用就会的数据库

8.1 数据库是数据的基地

适合存储大规模数据的是关系型数据库

8.2 数据文件,DBMS和数据库应用程序

数据库系统的构成要素包括 数据文件, DBMS, 应用程序三部分.

通过七个简单的实验理解TCP/IP网络

可以参考作者的另一本书<网络是怎样连接的>

试着加密数据吧

10.1 先来明确一下什么是加密

计算机传递的信息本质是”字符编码”.因此加密可以建档的理解为字符编码的变换.虽然存在各种各样的加密技术,但是其中绑定基本手段无外乎还是字符编码的变换,即将构成明文的每个字符的编码分别换成其他的数字.通过反转这种过程,加密后的文本数据就可以还原.

10.2 错开字符编码加密方式

将文本数据中灭个字符所对的字符编码一律向后错n个,eg A–C ;B–D

10.3 秘钥越长,解密越困难

即使是计算机暴力破解就简单的加密算法.例如XOR,秘钥长度的增加都会明显提升破解难度.

10.4 适用于互联网的公开秘钥加密技术

前面讲的加密技术都属于”对称秘钥加密技术”,这种技术的特征是加密,解密都使用相同的秘钥.这种情况在互联网传输中并不安全,因为在秘钥的传输过程中可能被截获.
鉴于上面提到问题,科学家研究出了另一种加密技术–”公开秘钥加密技术”,这里以RSA算法为例

这里写图片描述

乍一看以为只要了解RSA算法,就可以通过公钥得到私钥,但是为了求解私钥中的f,就不得不对c进行因子分解,分解为两个素数a,b.实际中c的位数(用二进制表示时)一般为1024位.及时计算机速度再快,分解因数也要花费不可估量的时间.

XML究竟是什么

XML是 Extensible Markup Language (可扩展标记语言)的缩写
HTML 是用于编写网页的标记语言.XML 是用于定义任意标记语言的元语言.

猜你喜欢

转载自blog.csdn.net/hepann44/article/details/78924171