一开始,计算机都有独立组件构成,叫"分立元件",然后不同组件再用线连在一起,这会导致计算机的构成很复杂,这个问题就叫做"数字暴政"。
封装复杂性:与其把多个独立部件用电线连在一起,拼装出计算机,不如把多个组件包在一起,变成一个新的独立组件。这种新的独立组件就叫集成电路(IC),仙童半导体(用硅做成)让继承电路变成了现实。为了不用焊接或用一大堆线,发明了印刷电路板(PCB),他通过用蚀刻金属线的方式把零件连接在一起。
即用光把复杂图案印到材料上。我们把一片薄片状的硅叫做晶圆,通过一系列生产步骤,将晶圆表面播磨的特定部分除去的工艺叫做光刻。
光刻组件示意图
光刻成品示意图
每两年左右,得益于材料和制造技术的,同样大小的空间,能塞进两倍数量的晶体管。
当任务庞大,函数太多,我们需要把函数打包成层级,把相关代码都放一起,打包成对象。对象可以包括其他对象、函数和变量。把函数打包成对象的思想叫做"面向对象编程",面向对象的核心是隐藏复杂度,选择性的公布功能。
把函数打包成对象的思想叫"面向对象编程"。
当团队接收到子团队编写的对象时,需要文档和程序编程家口(API)来帮助合作。API控制哪些函数和数据让外部访问,哪些仅供内部。
程序员用来专门写代码的工具。
IDE帮你检查错误,并提供信息,帮你解决问题,这个过程叫调试。
文档一般放在一个叫做README的文件里,文档也可以直接写成"注释",放在源代码里,注释是标记过的一段文字,编译代码时,注释会被忽略。注释的唯一作用是帮助开发者理解代码。
版本控制,又称源代码管理。大型软件公司会把代码放在一个中心服务器上,叫"代码仓库",程序员可以把想修改的代码借出,修改后再提交回代码仓库。版本控制可以跟踪所有变化,如果发现bug,全部或部分代码,可以"回滚"到之前的稳定版。
测试可以统称"质量保证测试"(QA),作用是找bug
beta版软件,即是软件接近完成,但没有完全被测试过,公司有时会向公众发布beta版,以帮助发现问题。alpha是beta前的版本,一般很粗糙,只能在内部测试。
是否存在一种算法,输入正式逻辑语句 输出正确的"是"或"否"答案?
美国数学家 阿隆佐·丘奇,开发了一个叫"Lambda 算子"的数学表达系统,证明其不存在。
只要有足够的规则,状态和纸带,图灵机可以解决一切计算问题。和图灵机一样完备,叫做图灵完备。
证明图灵机不能解决所有问题。
向人和机器同时发消息,收到的回答无法判断哪个是人,哪个是计算机,则计算机达到了只能程度。
数组(Array),也叫列表(list)或向量(Vector),是一种数据结构。为了拿出数组中某个值,我们要指定一个下标(index),大多数编程语言里,数组下标都从0开始,用方括号[]代表访问数组。注意:很容易混淆"数组中第5个数"和"数组下标为5的数",数组下标为5的数是数组里面的第6个数。
即字母、数组、标点等组成的数组,字符串在内存里以0结尾。
可以把矩阵看成数组的数组。
把几个有关系的变量存在一起叫做结构体。
指针是一种特殊变量,指向一个内存地址,因此得名。
以指针为变量的结构体叫节点。
用节点可以做链表,链表是一种灵活数据结构,能存很多个节点(node),灵活性是通过每个节点 指向 下一个节点实现的。链表可以是循环的也可以是非循环的,非循环的最后一个指针是0.
"队列"就像邮局排队,谁先来就排前面,这叫先进先出(FIFO--first in first out),可以把"栈"想成一堆松饼,做好一个新松饼,就堆在之前上面,吃的时候,是从最上面开始。
栈是后进先出(LIFO)。
如果数据随意连接,有循环,我们称之为图
算法:解决问题的基本步骤
数组:一组数据
选择排序的复杂度为O(n2)
大O表示法(算法)的复杂度:算法的输入大小和运行步骤之间的关系,来表示运行速度的量级。
归并排序的算法复杂度为O(n*log n),n是需要比较+合并的次数,和数组大小成正比,log n是合并步骤所需的次数,归并排序比选择排序更有效率。
一开始复杂度为O(n2),后来复杂度为O(nlog n + l),n表示节点数,l表示有多少条线。
极其简单的组件,通过一层层的抽象,来做出复杂的操作。计算机中的很多东西,底层其实都很简单,让人难以理解的,是一层层精妙的抽象。像一个越来越小的俄罗斯套娃。
继电器→真空管→晶体管
20世纪人口暴增,科学与工程进步迅速,航天计划成形。以上导致数据的复杂度急剧上升、计算量暴增,对于计算的自动化、高速有迫切的需求。
1.计算机的元器件晶体管只有2种状态,通电(1)&断电(0),用二进制可直接根据元器件的状态来设计计算机。
2.而且,数学中的“布尔代数”分支,可以用True和False(可用1代表True,0代表False)进行逻辑运算,代替实数进行计算。
3.计算的状态越多,信号越容易混淆,影响计算。对于当时每秒运算百万次以上的晶体管,信号混淆是特别让人头疼的。
1.变量:没有常数,仅True和False这两个变量。
2.三个基本操作:NOT/AND/OR。
3.为什么称之为“门”:控制电流流过的路径。
单个数字1或0,1位二进制数字命名为位(bit),也称1比特。
1byte=8bit,即1byte代表8位数字。最早期的电脑为八位的,即以八位为单位处理数据。为了方便,将八位数字命名为1字节(1byte)。
十进制的263
二进制的10110111
相同的位数相加,逢2进1
1byte=8bit
1KB=1024byte
1TB=1000GB
1GB=十亿字节=1000MB=10^6KB
定义:小数点可在数字间浮动的数(非整数)
表示方法:IEEE 754 标准下
说明:以8位行波加法器为例
1. 用半加器处理第1位数(个位)的加法,得到的和为结果的第一位。
2. 将输出的进位,输入到第2位用的全加器的输入C中。
3. 将第2位的2个数用全加器计算,得到的和为结果的第2位(sum)。
4. 将第2位计算的进位连接到百位的全加器输入C中。
5. 在第3-8位上,循环第3-4步的操作。
现在电脑上使用的加法器叫“超前进位加法器”
内容:在有限的空间内,无法存储位数过大的数,则称为溢出。
说明:第8位的进位如果为1,则无法存储,此时容易引发错误,所以应该尽量避免溢出。
作用:执行逻辑操作,如NOT、AND、OR等操作,以及做简单的数值测试。