计算机科学速成课(二)
2022.12.28
b站 【计算机科学速成课】[40集全/精校] - Crash Course Computer Science
网友的笔记:https://shimo.im/docs/vkCKkj3YxGtygrVg/read 、 https://shimo.im/docs/PJAUY30F1uYksv0h/read 、https://www.processon.com/view/link/61ef6e8f0e3e7439ae917672#map
11. 编程语言发展史-The First Programming Languages
汇编器 assembler : 汇编器读取用“汇编语言”写的程序,然后转成“机器码”(比如jump、add等机器能知道的),最早是人手动写很多行指令(直接写机器码),喂给机器,然后为了实现某功能,会在写指令之前写伪代码帮助理解,然后人们想出了写汇编语言,然后通过汇编器把汇编语言转成指令,机器读指令。因此以后就不需要手动写指令,写汇编语言就行。
汇编码的作用其实是修饰了一下机器码,比如汇编码的 LOAD_A 14 , 对应的机器码是 0011 0111这种,前四位是操作码,后四位是地址。使用汇编码时,依然要写清楚用什么寄存器和用哪块内存地址。
后来发展出了“编译器”compiler,将高级语言转成低级语言(低级语言是汇编码或机器码),因此只要写高级语言,不用管用哪个寄存器或哪块地址,编译器会处理。程序员只需要创建 代表内存地址的抽象 叫“变量”,给变量取名字。
12. 编程原理-语句和函数-Programming Basics - Statements & Functions
13. 算法入门 - Intro to Algorithms
14. 数据结构-Data Structures
15. 阿兰·图灵-Alan Turing
可判定性问题 :是否存在一种算法,输入正式逻辑语句,输出准确的“是”或“否”答案。
图灵机。只要有足够的规则,状态和纸带,可以创造任何东西,它是一台通用计算机。

图灵完备 turing complete
停机问题 halting problem
16. 软件工程-Software Engineering

找某个函数要从最外层往里找,比如 Car.Engine.CruiseControl.setCruiseSpeed(55)
面向对象编程 object oriented programing:把函数打包成对象。通过封装组件,隐藏复杂度,选择性公布功能(public、private)。
17. 集成电路&摩尔定律-Integrated Circuits & Moore’s Law

通过光刻技术,把很多很多晶体管做到一块集成电路上。
摩尔定律:每两年左右,得益于材料和制造技术的发展 ,同样大小的空间,能塞进两倍数量的晶体管。
一直做小会遇到问题:
- 用光掩模把图案弄到晶圆上,由于光的波长限制,精度已到极限。所以科学家在研制波长更短的光源,投射更小的形状。
- 量子隧穿效应:当晶体管非常小,电极之间可能只距离几个原子,电子会跳过间隙,会产生漏电问题(如果晶体管漏电,就不是好开关)。
18. 操作系统-Operating Systems
这集可以再重温,知识点比较多
最早是在打孔纸卡上写程序,然后送程序进计算机计算,但是计算机计算越来越快,放程序时间比程序运行时间还长,因此需要一种方式让计算机自动运行,于是诞生了“操作系统”operating system,OS。
操作系统也是程序,但它有操作硬件的特殊权限,可以运行和管理其它程序。
批处理 batch processing 一个程序紧接着一个程序运行,自动加载程序。
最早的外部设备 peripheral 是独立的底层硬件程序,会有很多不同的外部设备,比如不同的打印机,都要单独写一个和计算机交互的程序。后来操作系统充当软件和硬件之间的媒介,操作系统提供 API 来抽象硬件,叫“设备驱动程序” device driver,程序员用标准化机制,和输入输出硬件 I/O 交互。
多任务处理 multitasking 。一个cpu上运行多个程序。
每个程序会占用一些内存,一开始会给每个程序分配专属内存块,后面某个程序又想申请内存,新分配的内存地址和之前内存地址会不连续了,这样程序员就不好追踪了,因此出现了“虚拟内存” virtual memory ,操作系统会把内存地址进行“虚拟化”,程序员看见的是虚拟内存,而不是真实的物理内存地址。(虚拟内存假定内存都是从地址0开始)。操作系统去处理物理内存和虚拟内存之间的映射。
虚拟内存的出现使得程序的内存大小可以灵活增减,叫“动态内存分配” dynamic memory allocation。

内存保护 memory protection,每个程序只能用一部分内存,不能去用别的程序的内存,不然就可以修改其他程序的内存地址的数据了(恶意修改,病毒)。
分时操作系统 time-sharing :多个用户用同一个操作系统的情况(用户在不同终端登录),此时操作系统要处理多个用户,为了确保某个用户不会占满计算机资源,开发了分时操作系统,每个用户只能用一小部分处理器、内存等。
内核 kernel:如内存管理,多任务和输入/输出处理。
unix是一个操作系统,由两部分组成,一部分是内核,一部分是一堆有用的工具(比如程序和运行库)
内核恐慌 kernel panic:以前操作系统为了防止错误发生,会事先写很多很多的错误恢复代码。而unix没有很多的“恢复”代码,遇到内核崩溃,没办法恢复,所以调用一个叫“恐慌”的函数。这个恐慌函数可以是比如重启?。
19. 内存&储存介质-Memory & Storage
存储器 storage,非易失性 non-volatile,存储器比如是硬盘,写入的数据会一直存着,直到被覆盖或删除,断电也不会丢失。
最早是打孔纸卡、打孔纸带,但是读取慢,能存的很有限,只能写入一次(write-once),并且不方便存临时值,因此需要更大、更快、更灵活的存储方式,于是诞生了延迟线存储器 delay line memory。延迟线存储器是一个管子装满液体,比如水银,管子一端放扬声器,一端放麦克风。扬声器发出脉冲,产生压力波,经过一段时间传播到麦克风,麦克风将压力波转换回电信号。缺点是每个时刻只能读一位bit,想访问某bit,只能顺序访问,等待它从循环中出现,所以又叫“顺序存储器”或“循环存储器” sequential memory、cyclic-access memory。

我们需要的是可以随机存取的存储器 random access memory,可以随时访问任何位置。
出现了“磁芯存储器” magnetic core memory。给磁芯绕上电线,施加电流,可以将磁化在一个方向,此时关掉电流,磁芯保持磁化,如果施加反方向电流,磁化方向(极性)会翻转。这样就可以用来存1和0。

后来又发展出磁带、磁鼓存储器、磁盘。但是磁带是连续的,必须倒带或快进达到特定位置,访问速度慢,。
磁盘表面有磁性、有写入头和读取头,可以处理上面的1和0。要访问某个特定bit,磁头会移动。磁盘高速旋转,加快访问速度,称为寻道时间 seek time。

后来发展出软盘、硬盘、光盘。
光盘表面有很多小坑,造成光的不同反射,光学传感器会捕捉到,并解码为1和0。

现在存储技术朝固态发展,没有机械活动部件(没有一个移动的磁头,磁头不用等磁盘转),比如机械硬盘、U盘、固态硬盘SSD,通过集成电路的技术,访问时间很短。