计算机速成课Crash Course - 10. 早期的编程方式

今天继续计算机速成课Crash Course的系列讲解。

更多技术文章,关注公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

10. 早期的编程方式

前几集我们把重点放在计算机的原理,怎么从内存读写数据,执行操作,比如把两个数字加在一起,还简单讲了下指令的执行,也就是计算机程序。

但我们还没讲的是:程序如何"进入"计算机,你应该记得在第 7, 8 集,我们一步步讲了例子程序,当时为了简单,我们假设程序已经魔法般在内存里了,但事实是,程序需要加载进内存。

这不是魔法,是计算机科学!

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

最著名的例子来自纺织业,如果你只想织一块红色大桌布,可以直接放红线进织布机,但如果想要图案怎么办? 比如条纹或者方格。

工人要每隔一会调整一次织布机,因为非常消耗劳动力,所以图案纺织品很贵,特定位置有没有穿孔,决定了线是高是低,横线是从上/从下穿过,为了让每行图案不同,纸卡连成长条,形成连续指令。

听起来很耳熟?

很多人认为雅卡尔织布机是最早的编程,事实证明,穿孔纸卡便宜、可靠、也易懂。

近一个世纪后,穿孔纸卡用于 1890 年美国人口普查,我们在第一集提过,一张卡存一个人的信息,比如种族、婚姻状况、子女数量、出生国家等等。针对每个问题,人口普查工作者会在对应位置打孔,当卡片插入汇总机,孔会让对应总和值+1,可以插入整个国家人口的卡片,在结束后得到各个总值。

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

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

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

比如,一个插线板算销售税,另一个算工资单,但给插线板编程很复杂。图中乱成一团的线,负责算盈亏总额,用于IBM 402核算机,在 1940 年代这样做很流行,用插线板编程,不只在机电计算机流行。

世上第一台通用电子计算机,ENIAC,完成于 1946 年,用了一大堆插线板,程序在纸上设计好之后,给 ENIAC 连线,最多可能花三个星期,因为早期计算机非常昂贵,停机几个星期只为换程序完全无法接受,人们急需更快、更灵活的新方式来编程。

幸运的是,到 1940 年代晚期 1950 年代初,内存变得可行价格下降, 容量上升,与其把程序存在插线板,存在内存变得可行,这样程序易于修改、方便 CPU 快速读取,这类机器叫 "存储程序计算机"。如果内存足够,不仅可以存要运行的程序,还可以存程序需要的数据,包括程序运行时产生的新数据。

程序和数据都存在一个地方,叫 "冯诺依曼结构",命名来自约翰·冯·诺依曼,杰出的数学家和物理学家,参与了曼哈顿计划和早期电子计算机项目。

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

冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存(负责存数据和指令),希望这听起来很耳熟。

因为第7集我们造了一个冯诺依曼计算机,第一台冯诺依曼架构的"储存程序计算机",由曼彻斯特大学于 1948 年建造完成,绰号"宝宝",甚至你现在看视频的计算机,也在用一样的架构。

虽然有内存很棒,但程序和数据,依然需要某种方式输入计算机,所以用穿孔纸卡

让我们进入 思维泡泡 --

到1980年代,几乎所有的计算机都有穿孔纸卡读取器,可以吸入一张卡片,把卡片内容写进内存,如果放了一叠卡片,读取器会一个个写进内存,一旦程序和数据写入完毕,电脑会开始执行,即便简单程序也有几百条指令,要用一叠纸卡来存。

如果不小心摔倒弄撒了,要花上几小时、几天、甚至几周来整理,有个小技巧是在卡片侧面画对角线,如果弄散了,整理起来会方便很多。

用纸卡的最大型程序是美国空军的 SAGE 防空系统,于 1955 年完成,据称顶峰时期雇佣了世上 20% 程序员,主控制程序用了 62500 张穿孔纸卡,等同于大约 5MB 的数据,以如今的标准,不值一提。

穿孔纸卡不仅可以往计算机放数据,还可以取出数据,程序运行到最后,结果可以输到纸卡上,方式嘛,当然是打孔,然后人可以分析结果,或者再次放进计算机,做进一步计算。

谢了 思维泡泡 --

穿孔纸卡的亲戚是纸带,基本是一回事,只不过更连续,不是一张张卡。当然我们还没提硬盘, 只读光盘, DVD, U盘等等,以后我们会讲这些更先进的存储方法。

最后,除了插线板和穿孔纸卡,在 1980 年代前,还有一种常见编程方式 - 面板编程。

与其插一堆线到插线板,可以用一大堆开关和按钮,做到一样的效果,面板上有指示灯,代表各种函数的状态和内存中的值,50和60年代的计算机,一般都有这样巨大的控制台,很少有人只用开关来输入一整个程序,但技术上是可行的。

早期针对计算机爱好者的家用计算机,大量使用了开关,因为大多数家庭用户负担不起昂贵的外围设备,比如穿孔纸卡读取器。

第一款取得商业成功的家用计算机是 Altair 8800有两种版本可以买:1. 预先装好的整机;2. 需要组装的组件。计算机爱好者喜欢买组件版,售价极低,在 1975 年卖 400 美元左右,相当于 2017 年的 2000 美元。

为了给 8800 编程,你要拨动面板上的开关,输入二进制操作码,然后按 "存储键" 把值存入内存,然后会到下一个内存位置,你可以再次拨开关,写下一个指令。重复这样做,把整个程序都写入内存之后,可以推动开关,回到内存地址0,然后按运行按钮,灯会闪烁。

这就是 1975 年的家用计算机, 哇!

不管是插线板、开关或穿孔纸卡,早期编程都是专家活,不管是全职还是技术控,都要非常了解底层硬件,比如操作码, 寄存器等, 才能写程序,所以编程很难,很烦。

哪怕工程师和科学家都无法完全发挥计算机的能力,我们需要一种更简单方式告诉计算机要做什么,一种更简单的编程方式。

这带领我们到下一个话题 - 编程语言, 我们下集会讲。


以上内容就是 10. 早期的编程方式 的内容,感兴趣的同学记得点赞、关注、转发、收藏哦!

我会不定期发布课程的讲解!

更多技术文章,关注公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js基础:函数、对象、WebAPIs-DOM

一、函数和对象 1、函数概述 🤖chatgpt:什么是函数?为什么要有函数? 函数是一种可重复使用的代码块,它们可以接受输入(参数)、执行特定的任务,并返回结果。 JavaScript中函数是非常…

鸿蒙OS应用开发之按钮组件(2)

前面学习了简单的按钮添加到程序里,并且使用了简单的布局排列来放置。其实按钮还有很多种形式,会在不同的场合来使用。 默认的按钮外形,跟前面例子的程序是一样的: 包含着图片的按钮: 不同外形的按钮:

Python编程进阶:轻松掌握多线程和多进程

大家好,今天我们将讨论如何利用Python执行多线程和多进程任务。它们提供了在单个进程或多个进程之间执行并发操作的方法,并行和并发执行可以提高系统的速度和效率。在讨论多线程和多进程的基础知识之后,我们还将讨论使用Python库实现它们的实…

利用poi实现将数据库表字段信息导出到word中

研发文档对于开发人员来说都不陌生了,而研发文档里重要的一部分就是表结构设计,需要我们在word建个表格把我们数据库中的表字段信息填进去,表多的话靠我们手动去填非常累人!!! 因此作为开发人员可不可以写…

计算机网络应用层(期末、考研)

计算机网络总复习链接🔗 目录 DNS域名服务器域名解析过程分类递归查询(给根域名服务器造成的负载过大,实际中几乎不用)迭代查询 域名缓存(了解即可)完整域名解析过程采用UDP服务 FTP控制连接与数据连接 电…

Flutter Dart FFI Pointer<Uint8>类型如何转成数组或String

前言 继上一次发布的 Flutter 直接调用so动态库,或调用C/C源文件内函数 内容,最终我选择了第二种方式,直接把整个 Native C 的项目源代码放进了 Flutter 工程里编译(放在iOS的目录是因为它不支持自定义源码路径,Andro…

Linux免密实现文件拷贝(建立机器之间的SSH密钥认证)

背景: 在之前的工作中,我需要在我的shell脚本中实现将机器A的文件拷贝至机器B,然后去执行一系列的操作。由于我将我想要执行的动作完全写入了shell脚本中,并且不想每次执行时都去输入密码,因此这里,我们需要…

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类 过拟合,欠拟合 针对模型的拟合,这里引入两个概念:过拟合,欠拟合。 过拟合:在机器学习任务中,我们通常将数据集分为两部分:训…

HBase 高可用集群详细图文安装部署

目录 一、HBase 安装部署 1.1 Zookeeper 正常部署 1.2 Hadoop 正常部署 1.3 HBase 安装 1.4 HBase 的配置文件 1.4.1 hbase-env.sh 1.4.2 hbase-site.xml 1.4.3 regionservers 1.4.4 创建目录 1.5 HBase 远程发送到其他节点 1.6 HBase 服务的启动 1.6.1 单点…

Linux---创建、删除文件及目录命令

1. 创建、删除文件及目录命令的使用 命令说明touch 文件名创建指定文件mkdir 目录名创建目录(文件夹)rm 文件名或者目录名删除指定文件或者目录rmdir 目录名删除空目录 touch命令效果图: mkdir命令效果图: rm命令效果图: rm删除目录效果图 说明: rm命令想要删除目录需要加上…

CSS实现鼠标移动到图片上显示遮罩层效果

这是一张图片&#xff0c;我希望鼠标移动到上面的时候显示一个遮罩层&#xff0c;层级上有两个按钮&#xff0c;一个查看&#xff0c;一个删除 首先是要写一个大盒子包裹两个部分&#xff0c;一个是图片部分&#xff0c;一个是遮罩层部分&#xff0c;然后再用CSS样式控制 <e…

C# 提取PDF中指定文本、图片的坐标

获取PDF文件中文字或图片的坐标可以实现精确定位&#xff0c;这对于快速提取指定区域的元素&#xff0c;以及在PDF中添加注释、标记或自动盖章等操作非常有用。本文将详解如何使用国产PDF库通过C# 提取PDF中指定文本或图片的坐标位置&#xff08;X, Y轴&#xff09;。 ✍ 用于…

每日一练【最大连续1的个数 III】

一、题目描述 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 二、题目解析 本题同样是利用滑动窗口的解法。 首先进入窗口&#xff0c;如果是1&#xff0c;就直接让right&#xff0c;但是如果是…

【超详细】创建vue3+ts项目(引入ElementPlus、Axios)

目录 前言1、使用vue脚手架创建项目1.1检查vue版本1.2 使用vue脚手架创建项目 2、删除项目多余文件&#xff0c;修改配置项目2.1、删除以下文件2.1、在views下创建index文件2.2、修改router/index.ts路由文件&#xff1a;2.3、修改App.vue文件&#xff1a;2.4、初始化页面样式以…

Flutter在Visual Studio Code上首次创建运行应用

一、创建Flutter应用 1、前提条件 安装Visual Studio Code并配置好运行环境 2、开始创建Flutter应用 1)、打开Visual Studio Code 2)、打开 View > Command Palette。 3)、在搜索框中输入“flutter”&#xff0c;弹出内容如下图所示&#xff0c;选择“ Flutter: New Pr…

记录 | vscode禁止插件自动更新的方法

shift command p 打开然后输入 > setting.json&#xff0c;选择用户设置 在 settings.json 配置文件中增加一项&#xff1a; "extensions.autoUpdate": false,

Pycharm使用--环境搭建/快捷键/高亮自定义/保存网络批量保存图片

新手Pycharm使用 文章目录 新手Pycharm使用前言一、环境搭建常用conda 指令总结&#xff1a; 二、Pycharm快捷键三、高亮自定义四、批量保存网络&图片 前言 新手初次使用pycharm&#xff0c;记录一些包括 环境搭建/快捷键/高亮自定义/批量保存网络&图片 的方法 省略安…

西班牙语 Alt 代码表

西班牙语 Alt 代码表&#xff0c;请参考下图。 输入方法就是按住 Alt 键不松开&#xff0c;然后在小键盘上输入字符&#xff0c;松开 Alt 键&#xff0c;计算机就能输出上面的字符了。 西班牙语的字符没有法语和德语的多。 西班牙语 Alt 代码表 - 系统容器 - iSharkFly西班牙语…

C语言结构体和位段

自定义类型&#xff1a;结构体及联合和枚举 一.结构体类型的声明1.1 结构体的概念1.2结构的声明1.3特殊的声明1.4结构体的自引用1.5可以使用typedef重命名 二.结构体变量的创建和初始化2.1结构体变量的初始化使用{}2.2初始化&#xff1a;定义变量的同时赋初值。2.3结构体嵌套及…

mysql数据库相关知识【MYSQL】

mysql数据库相关知识【MYSQL】 一. 库1.1 登录数据库管理系统1.2 什么是数据库1.2.1 mysqld与mysql 1.3 编码集和校验集1.3.1 什么是编码集和校验集1.3.2 查看库对应的编码集和校验集1.3.3 用指定的编码集和校验集 1.4 库的操作 一. 库 1.1 登录数据库管理系统 这个算是第一个…