程序如何"进入"计算机

 

计算机基础课第 24 期分享

 

转载请联系授权(微信ID:qianpangzi0206)

 

前面我们把重点放在计算机的原理,怎么从内存读写数据,执行操作,比如把两个数字加在一起。

还简单讲了下指令的执行,也就是计算机程序。

但我们还没讲的是:程序如何"进入"计算机。

 

01

机器编程需求

 

你应该记得在前面,我们一步步讲了例子程序,当时为了简单,我们假设程序已经魔法般在内存里了,但事实是,程序需要加载进内存,这不是魔法,是计算机科学!

给机器编程这个需求,早在计算机出现之前就有了。

最著名的例子来自纺织业,如果你只想织一块红色大桌布,可以直接放红线进织布机。但如果想要图案怎么办? 比如条纹或者方格,工人要每隔一会儿 调整一次织布机,因为非常消耗劳动力,所以图案纺织品很贵,特定位置有没有穿孔,决定了线是高是低,横线是从上/从下穿过。为了让每行图案不同,纸卡连成长条,形成连续指令,听起来很熟?很多人认为雅卡尔织布机是最早的编程

 

02

穿孔纸卡用于人口普查

 

事实证明 穿孔纸卡便宜、可靠、也易懂。

近一个世纪后,穿孔纸卡用于 1890 年美国人口普查,我们在第一节提过,一张卡存一个人的信息,比如种族、婚姻状况、子女数量、出生国家等等。

针对每个问题,人口普查工作者会在对应位置打孔,当卡片插入汇总机,孔会让对应总和值+1。可以插入整个国家人口的卡片,在结束后得到各个总值。

值得注意的是,早期汇总机不算计算机,因为它们只做一件事 - 汇总数据,操作是固定的,不能编程。穿孔纸卡存的是数据,不是程序。

 

03

插线板

 

之后60年,这些机器被加强,可以做减、乘、除,甚至可以做一些小决定,决定何时执行某指令。为了正确执行不同计算,程序员需要某种控制面板。面板有很多小插孔,程序员可以插电线,让机器的不同部分  互相传数据和信号,因此也叫 "插线板"。

不幸的是, 这意味着 运行不同程序要重新接线,所以到 1920 年代,控制面板变成了可拔插。让编程更方便,可以给机器插入不同程序。

比如,一个插线板算销售税,另一个算工资单,但给插线板编程很复杂,图中乱成一团的线  。负责算盈亏总额 用于 IBM 402 核算机。

在 1940 年代这样做很流行,用插线板编程不只在机电计算机流行,世上第一台通用电子计算机,ENIAC,完成于 1946 年,用了一大堆插线板。程序在纸上设计好之后,给 ENIAC 连线,最多可能花三个星期。

因为早期计算机非常昂贵,停机几个星期只为换程序,完全无法接受。人们急需更快、更灵活的新方式来编程。

 

04

存储程序计算机

 

幸运的是,到 1940 年代晚期 1950 年代初,内存变得价格下降, 容量上升。 与其把程序存在插线板,存在内存变得可行。这样程序易于修改、方便 CPU 快速读取,这类机器叫 "存储程序计算机"。

如果内存足够,不仅可以存要运行的程序,还可以存程序需要的数据,包括程序运行时产生的新数据,程序和数据都存在一个地方,叫 "冯诺依曼结构"。命名自 约翰·冯·诺依曼,杰出的数学家和物理学家,参与了曼哈顿计划和早期电子计算机项目。

他曾说:我在思考比炸弹重要得多的东西—计算机。

冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存(负责存数据和指令)。希望这听起来很耳熟,因为前面我们造了一个冯诺依曼计算机。第一台冯诺依曼架构的"存储程序计算机",由曼彻斯特大学于 1948 年建造完成,绰号"宝宝"。甚至你现在看视频的计算机,也在用一样的架构。

下一节我们继续讲。

 

相关阅读:

   

  1. CPU的核心原理

  2. 计算机最早提高性能的方法

  3. 如何榨干CPU的所有价值

     

 

全部评论

相关推荐

1. 自我介绍2. 项目都是自己写的吗?3. 我看你用 koa2 写后端,为什么选择它,能讲讲吗?4. 那你提到 koa2 它是不提供中间件的,你是怎么解决的?5. 中间件的原理是什么?(洋葱模型)6. 你刚刚说碰到 next() 就进入下一个中间件,那 next 只能执行同步,如果是异步的话,你是怎么处理的?(async/await,但是我发现,有的中间件需要在异步中间件之前执行,所以我用 try/catch 来处理异步中间件的异常)7. JS 异步发展史,以及它们的优缺点说一下 (回调函数--Promise--Generator--async/await)8. 你刚刚说 Promise 状态不能更改,那如果我要设计一个能修改 Promise 状态的函数,你会怎么设计?9. CSS 水平垂直居中的方法(flex、grid、绝对定位 + margin:auto、绝对定位 + 负 margin、绝对定位 + transform、table-cell)10. 你刚刚说到 flex 布局,那 flex:1 是什么意思?(flex: flex-grow  flex-shrink  flex-basis;等价 flex:1 1 0%表示元素可以均分剩余空间,可拉伸、可压缩,不依赖内容宽度,自动自适应填充布局。)11. 父容器宽是 500px,然后它左右各有两个子容器是 100px,如果设置 flex: 1,那它的宽度是多少?(500-100-100=300px)12. 说说你对浏览器缓存的理解(强缓存、协商缓存)13. 如果一个用户,他怎么去刷新都无法刷到最新版的代码,你能说下可能的原因吗?(版本号、hash等)还有吗?(我说我不知道了,面试官说还有 CDN 没有同步,我说企业才会这么干,自己写项目一般不会,我知道 cdn 是用来解决高并发的手段)14. React你熟吗?说下 React 函数组件和类组件的区别15. 怎么避免 Hooks 导致组件重新渲染?(使用 useCallback、useMemo、React.memo、useRef等等)16. 谈一下我对 React 的状态管理的理解(Redux、Mobx、Zustand,我说 Zustand 用的最多)17. React 常见的 hooks 有哪些?(useState、useEffect、useRef、useCallback、useMemo、useReducer、useContext、useImperativeHandle、useLayoutEffect、useDebugValue)18. TS 你熟吗?我们引进 TS 的目的是为什么?19. interface 和 type 的区别20. 说下 TS 里的泛型21. 我现在有十个字段,比如十个字段就要 A B C D E F G 这种。那我现在另有另外一个方法,这个方法接受的参数呢,必须是这个 interface A 里面的这个 K。就比如说你可以是 A B C 可以 A B C D 任何组合都可以,但是必须是这个 interface 里面的 A 里面的定义的。这个 K 这种类型的话是怎么去定义呢?(说实话我有点不太理解啥意思,反正我说了 keyof)``` TypeScriptinterface Obj {A: stringB: stringC: stringD: stringE: string// 其他字段...}```22. vite 用过吗?说说和 webpack 的区别。vite 的优缺点是什么23. 说说 Tree shaking(树摇) 和 Code Splitting (代码分割)的区别24. Git 你熟吗?说说 git merge 和 git rebase 的区别,什么时候用 git merge,什么时候用 git rebase?25. web3 你熟吗?(不太熟,听说过而已)26. 我看你自我介绍说了 AI,你是怎么用的?27. 除了提示词,还有什么能让 AI 更聪明?28. AI 的优缺点你说一下29. AI 发展这么快,你觉得我们以后会扮演什么角色?30. 反问基本都答上来了。面了我80分钟,我还以为稳过的
查看29道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务