文章目录
- 一、编译原理
- 1.1 早期编译方式
- 1.2 编程语言
- 二、算法&数据结构
- 2.1 Sort
- 2.2 图搜索
- 2.3 Array
- 2.4 Node
- 三、软件工程起源
- 2.1分解打包
- 三 、摩尔定律
- 3.1 发展历
- 3.1.1 电子管
- 3.1.2 晶体管
- 3.1.3 集成电路 IC
- 3.2 刻蚀工艺
- 3.2.2 光刻负责电路
一、编译原理
之前讲的例子中 ,程序已经存在于内存中,但是程序要需要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的 可以被定速巡航 团队调用
三 、摩尔定律
3.1 发展历
3.1.1 电子管
3.1.2 晶体管
3.1.3 集成电路 IC
1959年 仙童半导体 用 硅 来做集成电路 晶体管
集成电路还是需要多个组合起来,创造更大更复杂的电路
PCB 印刷电路板
PCB可以大规模生产,无需焊接或者用一大堆线,通过刻蚀金属线的方式 连接在一起
把PCB & IC组合起来使用,可以大幅减少独立组建和电缆
3.2 刻蚀工艺
一开始集成电路IC只能添加少量的晶体管,要想减少晶体管的体积,塞下更多,就要改变工艺
硅:半导体:有时候导电,有时候绝缘,控制导电的时机。
光刻胶被光照射后 会变得可溶,可以被一种特殊的化学试剂洗掉
光掩膜可以用挡住阳光来描述图案,
光照到的地方,光刻胶会发生化学变化,洗掉之后 暴露氧化层
氧化层被光刻胶保护住了
现在景圆(硅)露出来了
为了让硅导电性更好,用一种化学过程来改变它 叫 “掺杂”
还需要几轮光刻法 来做晶体管 ,方法都差不多
再次刻蚀出小通道
不想用金属盖住所有的东西 想刻蚀出具体的电路
3.2.2 光刻负责电路
1960年前,IC上的晶体管很少,光刻工艺发明后,晶体管数量急剧增加
1965年,摩尔 看到了趋势:每两年左右 ,晶体管数量翻一番
2023年5纳米 3纳米的晶体管都量产了
摩尔极限
进一波做小晶体管带来的问题:
- 用光眼膜把图案弄到晶圆上,因为光的波长,精度已经到极限
- 晶体管非常小时,电极之间可能只距离几个原子,电子会跳过间隙:量子隧道贯穿