这才是计算机科学_计算机大量应用

一、编译原理

在这里插入图片描述

之前讲的例子中 ,程序已经存在于内存中,但是程序要需要load进内存

1.1 早期编译方式

远古时代
编程最早出现于纺织行业,为了编制出图案,玛丽发明了 可编程纺织机 1801年亮相,
在这里插入图片描述

每一行颜色可由卡片小孔决定,便可以改变防止的团高低

1890年 穿孔纸用于美国人口普查

但是 穿孔纸是数据 而不是编程,之后的60年 计算机可以做加减乘除…加强了
为了执行不同的计算,程序员需要某种控制面板(control panel)
在这里插入图片描述
来控制计算机计算不同的数据

但是运行不同的程序就需要不同的重新连线

冯诺依曼结构
1950,内存价格下降,把程序存在内存中变得可行,甚至数据都可以存在内存中
把 数据 + 程序 都存在同一个地方,这种方式称为:芬诺依曼结构

在这里插入图片描述
冯诺依曼结构的特点就是:处理器(算数逻辑单元) + 数据寄存器 + 指令寄存器 + 指令地址寄存器 + 内存

程序写入内存
用卡片一张张读,有的程序由60k张卡片(5MB)
在这里插入图片描述
output数据也需要卡片

1.2 编程语言

之前讲的很多二进制的 00010100 load A ,可以直接用load 代替,然后写一个翻译器:他可以读懂文字指令 自动转换成二进制指令,这就是汇编器(Assembler)

随着时间推移,汇编器越来越多的功能让编程更加容易,最大的优化就是自动识别JUMP

插入新的语句后,
在这里插入图片描述
解决方法就是标签化:
在这里插入图片描述

汇编语言 : 机器语言 = 1 :1
汇编语言仍然需要考虑用什么内存地址 寄存器 ,突然中途添加一个额外的数字,就要改很多code

Hopoer 二战后设计了高级语言:“Arithmetic Language Version 0”
一条语言由 编译器 翻译成多条

从此以后,产生了很多很多高级语言,
最初的IBM 的 FORTRAN 高级语言应用广泛,但只能应用在IBM的计算机上,电脑升级都需要重写代码

为了解决这个适配的问题,在1959年组成了一个联盟 “数据系统语言委员会 ” 开发一种通用的高级语言,在不同机器上使用,诞生了 “通用面向商业语言 Common Business-Oriented Language” COBOL

Cobol 的编译器 接受相同的代码,根据计算机的不同 编译 成 不同的机器码

70年代 出现了 C
80:C++ \ Object-C Perl
90: Python Java

二、算法&数据结构

算法:解决问题的具体步骤

if
while

2.1 Sort

应用讨论最多的算法,科学家们用了几十年时间发明了上百种排序算法。
一个个查找的排序算法

算法的复杂度: 输入大小 & 运行步骤 之间的关系 (O(n2))

2.2 图搜索

图是用线连接起来的一堆节点,用来处理 导航问题 特别多
在这里插入图片描述
寻找最短路径:
方法一:尝试每一种可能,选择最短的路径,复杂度O(n!)
Dijkstra 方法:

2.3 Array

2.4 Node

连续两个内存地址,第一个地址是 value 、第二个是下一个Node的地址
在这里插入图片描述

三、软件工程起源

前言
我们学过了算法、数据结构…
但是 这些东西都是庞大项目中的一小部分
微软 Office 有 4000万行code
为了写庞大的项目,用了各种工具和方法,这些统称为 Soft Engineering
软件工程这个词由工程师 Margeret Hamilton在为NASA解决问题时创造

2.1分解打包

对象讲解
把一个大的项目分解成小的函数,大家只关心自己的函数就好了
但如果只是这样,Office也会有几十万的函数,依然不可维护
解决方案:把函数打包成层级,相关代码放在一起,打包成对象(object)
例如:自动驾驶中有:

设定速度
逐渐加速
逐渐减速

封装第一次 :这些函数都和定速巡航相关,可以包成一个 定速巡航的对象 ,

还可能有很多对象 :

定速巡航
火花塞点火 
散热器启动 

封装第二次 :封装成引擎对象,包含所有子对象
当然 引擎对象也有独有的开关引擎函数 、行驶里程变量
对象可以包含其它对象、函数、变量

引擎对象:
	定速巡航对象
	火花塞点火对象
	散热器启动对象

	开关引擎函数
	行驶里程变量

当然还有 其它的对象:

车轮
门
车窗
...

最后封装成完整的车

如果想要找到 定速巡航 对象,就需要 从 车 一层层的往里面找,最后找到可执行的函数()

Car.Engine.CruiseControl.SetCruiseSpeed(60)

编程语言经常用这种类似的语法,把函数打包成对象的方法叫:“Object Oriented Programming” 面向对象编程

API

如果 定速巡航对象 需要用到 引擎的其它函数,来保持车速
开发者需要了解其它人写的函数的作用 文档 API(Application Programming Interface)
API 帮助开发者不需要了解太多,直接会用就可以了

点火控制 对象 中,有设定发动机转速 、获得速度、点火 的函数
但是 定速巡航 团队不知道点火系统的细节,不能乱调用

在这里插入图片描述
把一些 “重要危险 的 函数标记 为 private 只有自己包内的函数才能调用”
setPRM() 是 public的 可以被定速巡航 团队调用

四 、摩尔定律

4.1 发展历

4.1.1 电子管

在这里插入图片描述

4.1.2 晶体管

在这里插入图片描述

4.1.3 集成电路 IC

1959年 仙童半导体 用 硅 来做集成电路 晶体管
在这里插入图片描述
集成电路还是需要多个组合起来,创造更大更复杂的电路

PCB 印刷电路板

PCB可以大规模生产,无需焊接或者用一大堆线,通过刻蚀金属线的方式 连接在一起

把PCB & IC组合起来使用,可以大幅减少独立组建和电缆

4.2 刻蚀工艺

一开始集成电路IC只能添加少量的晶体管,要想减少晶体管的体积,塞下更多,就要改变工艺

在这里插入图片描述
硅:半导体:有时候导电,有时候绝缘,控制导电的时机。

在这里插入图片描述
在这里插入图片描述
光刻胶被光照射后 会变得可溶,可以被一种特殊的化学试剂洗掉
在这里插入图片描述

光掩膜可以用挡住阳光来描述图案,
光照到的地方,光刻胶会发生化学变化,洗掉之后 暴露氧化层
在这里插入图片描述
氧化层被光刻胶保护住了
在这里插入图片描述
现在景圆(硅)露出来了
为了让硅导电性更好,用一种化学过程来改变它 叫 “掺杂”

在这里插入图片描述
还需要几轮光刻法 来做晶体管 ,方法都差不多
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
再次刻蚀出小通道
在这里插入图片描述
在这里插入图片描述
不想用金属盖住所有的东西 想刻蚀出具体的电路
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2.2 光刻负责电路

在这里插入图片描述

1960年前,IC上的晶体管很少,光刻工艺发明后,晶体管数量急剧增加
1965年,摩尔 看到了趋势:每两年左右 ,晶体管数量翻一番

2023年5纳米 3纳米的晶体管都量产了

摩尔极限
进一波做小晶体管带来的问题:

  1. 用光眼膜把图案弄到晶圆上,因为光的波长,精度已经到极限
  2. 晶体管非常小时,电极之间可能只距离几个原子,电子会跳过间隙:量子隧道贯穿

五 OS

1940 50年代的计算机,每次只能运行一个程序。
程序写在卡片上,计算机一个一个读取,然后运行,运行完停机。

随着计算机速度的提升,放卡片的速度太慢了,为了让计算机自己运行程序,操作系统就出现了

操作系统本质也是程序,它有操作硬件的特殊权限,可以运行管理其它程序
第一个OS诞生于1950年代,可以做批处理(执行完一个程序,接着执行下一个)

5.1 驱动

当时的程序都是针对一个计算机编写的,其它硬件设备也是特别从硬件层适配的,更换一个打印机都需要重新硬件层适配

OS充当了硬件&软件之间的媒介:操作系统提供API来抽象硬件(设备驱动程序)device drivers,可以利用标准化机制IO与硬件交互

5.2 多任务处理

随着计算机算力的提升,CPU的处理速度快,IO设备的处理速度慢,CPU经常闲着等待慢的机械设备(打印机读卡器)

50年代后期,曼彻斯特研发了第一台超级计算机Atlas,写了个程序,能在CPU上同时运行多个程序,等待打印机执行期间
在这里插入图片描述
打印机执行完,合适的时间CPU再切回去执行。这台计算机配备了四台纸袋读取器,四台打印机。

5.3 动态内存分配

专属内存块
在这里插入图片描述
物理内存地址不连续,OS把物理虚拟化,虚拟地址是连续的

内存保护:专属内存只能自己处理,其它程序不能搞乱

5.4 OS发展

Multics 是第一个设计就考虑安全的内存的OS,比如学生不能访问老师的内存,这会相当复杂,操作系统就需要1M的内存(当时相当多),Multics代码处理相当多的异常情况

Multics的研究人员Dennis Ritchie说:Multics因为过度设计阻碍商业化,所以Dennis & Ken Thompson(另一个研究员)联手打造了Unix

UNIX把OS分成两部分
内核:核心功能,IO 内存管理 ,多任务
工具:程序运行库lib

紧凑的内核,如果发生错误,就会内核恐慌(kernal panic),设计就是不处理异常,出现异常就需要重启

六、存储

一般来说,电脑内存是“非永久性的” 断电后丢失数据,所以内存被称为 “Volatile Memory”
存储器是永久存储的Storage,断电不丢
内存和存储器的速度差很多,但随着现在技术的发展(Inter傲腾),两者差距越来越小

6.1 早期存储

打孔纸卡
卡纸是一次性的,打过后不能修补,对于临时存储的值 太浪费

1944年 ,Eckert 发明 Delay Line Memory(延迟存储器)

管子里面放水银
一端放扬声器,一端放麦克风
扬声器发出冲击波,冲击波需要一点时间传递到麦克风
麦克风将冲击波转换为电信号(有冲击波1,没有0)

在这里插入图片描述
能够存储352bits,但是每一个时刻只能读取1bit的数据,如果想要读取第100bit的数据,就必须读取前99个,所以又叫 顺序存储器,我们想要随机存储

磁芯存储器
在这里插入图片描述

在这里插入图片描述

可以随机访问

磁带
在这里插入图片描述

在这里插入图片描述
8条磁带并行
在这里插入图片描述

磁带是连续的,必须迅速倒带 快进 到指定的位置,转动时间太长了

硬盘
磁盘转动,读取上面的磁性
多个盘叠放在一起,组成了硬盘
转动寻找制定位置的时间:寻道时间(Seek time)

在这里插入图片描述
软盘的磁盘是软的,原理和硬盘一样

光盘
不是用磁性,用小坑反射
在这里插入图片描述
固态硬盘
里面是集成电路,不需要转动的寻址时间

七 、文件系统

计算机中的文件到底是什么,以及计算机是如何管理这些文件的

按照格式排列文件的数据:文件格式
可以自己发明文件格式,但是大家都会有一些通用的文件格式:MP4
TXT
文本,全部都是000111组成
在这里插入图片描述

Wave(WAW)
存储音频数据,解码之前需要知道:码率(bit rate) 单声道 立体声
这些信息是数据的数据,叫“元数据meta data”
在这里插入图片描述
在这里插入图片描述
BMP
图片格式在这里插入图片描述

7.2 如何存储

计算机早期,文件系统就是一整个文件

连续存储
有一个directory file 放在文件头,标记其它文件开始结束的位置

在这里插入图片描述

删除操作的话,只需要在目录文件中删除记录即可,并没有真正的删除数据,那块数据块就变得可以应用了

和虚拟内存有点像,文件被分的太过于琐碎:文件碎片

碎片整理

计算机会把数据来回移动,排列成正确的数据

分层文件系统

文件数量变得越来越多,多层管理,文件夹套文件夹
在这里插入图片描述
最顶层的目录文件:根目录

八、压缩

在这里插入图片描述
44 存储在内存中是连续的,需要知道从哪里开始 哪里结束,
就需要有图像的元数据,写明尺寸等属性,这里先忽略元数据
在这里插入图片描述
这个图像有 16个像素(4
4) 每个像素3个字节,总共占用48(16*3)个字节

8.1 减少重复信息

最简单的方法:游程编码(Run-Length Encoding)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
有的时候这种压缩方法会变大(长度标识)占用内存,这个例子中是变少了

并且,还可以恢复到原来的数据,这种是 无损压缩

8.2 DFTBA

把图像看作是一块块 ,而不是一个个像素
为了简单,我们把两个像素当作一块(6个字节)
在这里插入图片描述
因为 “yellow-yellow”最常见,希望用最紧凑的形式来表示它
而 黑黄 白白,出现频率不高,可以用更长的东西来表现它
1950年代, 大卫-霍夫曼 发明了 高效的编码方式:霍夫曼树(Huffman Tree):

1.列出所有块的出现频率,每轮选择两个最低的频率
2.将这两个最低的频率块组成一个树,总频率=sum
3.按照频率生成字典
4.把字典放到数据前面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

消除冗余 & 用更紧凑的表示方法 ,这两种方法通常都会组合使用,几乎所有的无损压缩格式都在使用他们(GIF、PNG、PDF、ZIP)

8.3 有损失压缩

人类对 像素 超声波 有些是感知不到的,那么就可以删除这些 感知不到的细节,对人类来说也是一样的
这种删掉人来无法感知的数据的方法:感知编码(Perceptual Coding)
最著名的有孙压缩图像格式就是JPEG

视频压缩
视频 = 一连串的图片 + 音频

连续 帧 & 帧 之间,有很多像素是一样的 ,
比如视频的背景,对于这种可以只保存帧 & 帧变了的部分

更高级的视频压缩

找出帧 & 帧 之间,相似的部分,比如人的手,然后将这个手打包成整体,视频直接引用这个整体

压缩太严重的时候,没有足够空间更新补丁内的像素,及时补丁是错的,视频也会被播放器播放,
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oifengo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值