编程考古-计算机发展(上)
计算机/器现在是我们日常生活中的重要工具,它的发展历程见证了人类数学计算能力的不断提升。
什么是计算
计算的本质在于基于规则对符号串进行变换。简言之,从一个初始的符号串(输入)出发,依据既定的法则逐步改变这个符号串(变换),直至在有限步骤内获得一个新的符号串(输出),这一过程即是计算。
计算的常见形式通常涉及数学运算,如1+2=31+2=3,但实际上这只是根据数学法则对1+21+2 进行变换得到33 的过程。类似地,将一段中文文章在保持语义不变的前提下翻译成英文也是一种计算。
从古至今,人类的计算方式经历了漫长的发展历程:
(1)手工计算
在旧石器时代,人们通过在石头上刻画特定图案来记录计算;春秋战国时期的筹算是利用竹棍的不同排列进行计算;东汉时期的珠算是用算珠计算;随着纸张和书写工具的出现,人们开始用笔在纸上书写符号进行计算。这些都是通过手工操作符号来实施变换的例子。
算盘
在中国古代,随着社会规模的扩大,传统的结绳刻字方法已不足以应对日益增长的数据处理需求,因此出现了算筹计数法。公元六世纪,算盘取代了算筹,成为首个完全采用十进制计算的工具,标志着计算工具的重大飞跃。珠算盘轻巧便捷,与日常生活紧密相连,自汉代起源,至元代趋于成熟。在中国古代,随着社会规模的扩大,传统的结绳刻字方法已不足以应对日益增长的数据处理需求,因此出现了算筹计数法。公元六世纪,算盘取代了算筹,成为首个完全采用十进制计算的工具,标志着计算工具的重大飞跃。珠算盘轻巧便捷,与日常生活紧密相连,自汉代起源,至元代趋于成熟。
(2)机器计算
手工计算速度缓慢,为提高效率,人类发明了多种计算工具。
1620 年,埃德蒙·甘特发明了带有对数刻度的计算设备;
上海计算尺厂制造的1200型矢量自然对数计算尺
1630 年,威廉·奥特雷德发明了圆形计算尺;
1642 年,布莱士·帕斯卡创造了世界上首个加法器;
帕斯卡设计的计算器
1673 年,戈特弗里德·莱布尼茨改进了帕斯卡的设计,制作出能进行加、减、乘、除运算的计算器;
1812 年,查尔斯·巴贝奇设计了差分机,并于 1834 年设计了分析机。
差分机的设计原理:
所谓“差分”的含义,就是把函数表的复杂算式转化为差分运算,用简单的加法代替平方运算。”差分机“的设计闪烁出了程序控制的灵光,它能够按照设计者的旨意,自动处理不同函数的计算过程。
差分机利用齿轮和摆杆等结构实现了多位数的加法和减法运算。尽管差分机没有商业化生产,但它为后来的计算器技术奠定了基础,并引领了机械计算器的发展方向。
随着社会的蓬勃发展,人类对计算速度和精度的追求从未停歇。随着16世纪以来天文学、航海学和测量学等领域的发展,人们面临大量复杂的计算需求,尤其是乘除运算。为了应对这些挑战,人类不断创新计算工具,极大地提升了计算能力和精度,推动了社会的进步与发展。
电子管计算机时代的开启
计算机发展的早期阶段主要依赖于机械方式。尽管一些早期设计引入了电学元素,但总体而言,依然是以机械驱动为主,尚未涉足逻辑运算领域。随着电子技术的突飞猛进,计算机开始从机械时代过渡到电子时代,电子元件和电路的进步使得计算机能够进行逻辑运算,自动化处理数据和计算,标志着计算机从机械驱动向电子化和逻辑化转型的开始。
1906年,美国发明家李·德·福雷斯特发明了真空三极管,为电子工业革命揭开了序幕。
真空管
IBM
1924年,托马斯·沃森将CTR更名为IBM(国际商业机器公司),IBM自此成为计算机行业的领军者。
1931年,IBM推出了IBM 601穿孔卡片计算机,它能在一秒钟内完成乘法计算,极大地提高了大宗数据的计算速度。显著提升了大批量数据的计算速度,巩固了IBM在市场中的地位。
IBM 601 乘法打孔机是一种单位记录机,可以从打孔卡中读取两个数字,并在同一张卡的空白字段中打孔。这些因子的长度最多可以为 8 位十进制数字。601 于 1931 年推出,是第一台可以进行乘法运算的 IBM 机器。
20 世纪中叶的 12 行/80 列 IBM 穿孔卡片
Atanasoff-Berry Computer
1936年,艾伦·图灵提出了图灵机的数学模型,奠定了现代计算机科学的基础。同年,约翰·阿塔那索夫与其学生贝瑞发明了世界上第一台电子计算机——ABC(Atanasoff-Berry Computer)。其中,A、B分别取俩人姓氏的第一个字母,C即“Computer”的首字母,ABC计算机用电容作存储器,用穿孔卡片作辅助存储器,时钟频率是60HZ,完成一次加法运算用时一秒,是世界上第一台电子计算机。尽管不可编程,仅仅设计用于求解线性方程组,并在1942年成功进行了测试。但为后续计算机的发展提供了重要参考。
ZX系列计算机
1938年,康拉德·祖斯(Konrad Zuse)及其团队完成了Z1计算机,这是一台可编程的二进制计算机,可编程性有限,可以从穿孔的赛璐珞胶片上读取指令。“Z1” 是世界上第一台使用布尔逻辑和二进制浮点数的可自由编程的计算机,然而,它在操作上并不可靠。Z1 是一台重约 1 吨的机器,由大约 20,000 个零件组成。
Z1 内部视图
Zuse 1936 年 5 月的专利图表,该专利使用扁平滑杆机构的二进制开关元件。Z1 就是基于这些元素。
Z1 几乎包含现代计算机的所有部分,即控制单元、内存、微序列、浮点逻辑和输入输出设备。Z1 可通过穿孔胶带和穿孔胶带阅读器自由编程。穿孔磁带阅读器、用于监控整台机器和指令执行的控制单元、算术单元以及输入和输出设备之间有明显的分离。输入磁带单元读取 35 毫米胶片中的穿孔。
五孔和八孔宽的冲孔纸胶带
折叠纸带上的诊断微型计算机软件 (1975)
1941年,祖斯研制成功了Z3计算机,这是世界上第一台可工作的可编程全自动数字计算机。由 2,600 个继电器构建而成,实现了 22 位字长,时钟频率约为 5–10 Hz。程序代码存储在穿孔胶片上。
Zuse Z3 复制品在慕尼黑德意志博物馆展出
Z3、Z5 和 Z11 中包含的电磁存储器(继电器)
Z3 在 1998 年被证明原则上是图灵完备的。但是,由于缺乏条件分支,Z3 仅通过推测性计算计算的所有可能结果来满足此定义。
Z4 在慕尼黑德意志博物馆展出
基于 Henschel & Son 在 1942 年下的订单。尽管 Z4 仅在柏林部分组装,并于 1945 年 4 月在哥廷根最终完成,但未能在纳粹德国战败前交付。Z4 是祖斯设计的结晶之作,采用了机械存储器与机电逻辑相结合的技术。当 1950 年交付给苏黎世联邦理工学院时Z4机器增加了一个有条件的分支设施,并且可以在梅赛德斯打字机上打印。有两个程序磁带,第二个可以用来保存子程序。(最初计划有 6 个)。
从 1950 年至 1955 年,Z4 在苏黎世联邦理工学院使用,并启发了该校工程师 Ambros Speiser 领导下创建的第一台瑞士计算机 ERMETH。
ENIAC
1946年,ENIAC埃尼阿克(Electronic Numerical Integrator And Calculator,电子数字积分计算器)问世,这是世界上第一台电子数字计算机,在美国宾夕法尼亚大学现世并正式投入运行,参与研制工作的是宾夕法尼亚大学莫尔电机工程学院的莫奇利(John W.Mauchly)和埃克特(J.Presper Eckert)为首的研制小组,耗资 487,000 美元(相当于 2023 年的 6,900,000 美元),被媒体称为“巨型大脑”。
ENIAC 于 1946 年 2 月 15 日在宾夕法尼亚大学正式落成,虽然构造庞大且操作繁琐,但代表了当时计算技术的巅峰。
ENIAC重30吨,使用了约18800个真空电子管,1500个继电器,功率达174千瓦,占地约140平方米,使用十进制运算,每秒能运算5000次加法,比当时最快的计算机快1000倍,是手工计算的20万倍,但是它不像现在这样的电脑有输入控制设备,只能通过人工来扳动庞大面板上的各种开关和插拔电缆来进行数据信息输入,虽然现在看来它真的很落后,但是在当时它代表着人类计算技术的最高成就,它奠定了电子计算机的发展基础,开辟了信息时代。
宾夕法尼亚大学工程与应用科学学院的 4 个 ENIAC 面板和 3 个功能桌中的 1 个
Glenn A. Beck(后)和 Betty Snyder(前)在 BRL 328 号楼对 ENIAC 进行编程。(美国陆军照片,约 1947-1955 年)
Irwin Goldstein 下士(前)在摩尔电气工程学院的 ENIAC 的一张功能桌上设置开关。(美国陆军照片)
ENIAC 截面背面的细节,显示真空管
来自四台早期计算机的零件,1962 年。从左到右:ENIAC 板、EDVAC 板、ORDVAC 板和 BRLESC-I 板,显示出小型化趋势。
ENIAC主要部件是 40 个面板和 3 个便携式功能台(名为 A、B 和 C)。面板的布局为(顺时针方向,从左侧墙壁开始):
Left wall 左墙
-
Initiating Unit 起始单元
-
Cycling Unit 循环装置
-
Master Programmer – panel 1 and 2 主程序员 – 面板 1 和 2
-
Function Table 1 – panel 1 and 2 功能表 1 – 面板 1 和 2
-
Accumulator 1 累加器 1
-
Accumulator 2 累加器 2
-
Divider and Square Rooter 除法器和平方根器
-
Accumulator 3 累加器 3
-
Accumulator 4 累加器 4
-
Accumulator 5 累加器 5
-
Accumulator 6 累加器 6
-
Accumulator 7 累加器 7
-
Accumulator 8 累加器 8
-
Accumulator 9 累加器 9
Back wall 后墙
-
Accumulator 10 累加器 10
-
High-speed Multiplier – panel 1, 2, and 3 高速乘法器 – 面板 1、2 和 3
-
Accumulator 11 蓄能器 11
-
Accumulator 12 累加器 12
-
Accumulator 13 累加器 13
-
Accumulator 14 累加器 14
Right wall 右墙
-
Accumulator 15 蓄能器 15
-
Accumulator 16 蓄能器 16
-
Accumulator 17 累加器 17
-
Accumulator 18 累加器 18
-
Function Table 2 – panel 1 and 2 功能表 2 – 面板 1 和 2
-
Function Table 3 – panel 1 and 2 功能表 3 – 面板 1 和 2
-
Accumulator 19 累加器 19
-
Accumulator 20 累加器 20
-
Constant Transmitter – panel 1, 2, and 3 恒定发射器 – 面板 1、2 和 3
-
Printer – panel 1, 2, and 3 打印机 – 面板 1、2 和 3
UNIVAC-I
同年,莫奇利和埃克特创立了世界上第一家电子计算机公司,并开始研制UNIVAC-I(通用自动计算机 I),这是世界上第一款批量生产的电子计算机,共生产了48台。它主要由 ENIAC 的发明者 J. Presper Eckert 和 John Mauchly 设计。UNIVAC-I的问世标志着“计算机”一词专指电子自动计算机器的开始。
1951 年美国人口普查局的 UNIVAC I
UNIVAC 预测艾森豪威尔将获得 32,915,949 张选票,并以 438 比 93 赢得选举人团。在选举之夜,艾森豪威尔以 442 票对 89 票的选举人团胜利获得 34,075,029 张选票。UNIVAC 的误差率为艾森豪威尔普选票总数的 3.5%,与他的选举人票总数相差不到 4 票。该预测及其在 CBS 选举报道中的使用提高了公众对计算技术的认识,而计算机化预测成为选举之夜广播中广泛使用的一部分。
这一系列事件标志着电子管计算机时代的到来,为后续计算机技术的发展奠定了基础。
参考来源:
穿孔胶带 - 维基百科,自由的百科全书 --- Punched tape - Wikipedia
差分引擎 - 维基百科,自由的百科全书 --- Difference engine - Wikipedia
Z1 (计算机) - 维基百科,自由的百科全书 --- Z1 (computer) - Wikipedia
ENIAC - 维基百科,自由的百科全书 --- ENIAC - Wikipedia
计算硬件的历史 - 维基百科,自由的百科全书 --- History of computing hardware - Wikipedia
相关文章:

编程考古-计算机发展(上)
计算机/器现在是我们日常生活中的重要工具,它的发展历程见证了人类数学计算能力的不断提升。 什么是计算 计算的本质在于基于规则对符号串进行变换。简言之,从一个初始的符号串(输入)出发,依据既定的法则逐步改变这个…...

pc轨迹回放制作
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:pc轨迹回放制作 主要内容:制作车辆轨迹操作页,包括查询条件、动态轨迹回放、车辆轨迹详情表单等 应用场景:车辆…...
无向图中的一些问题与处理(上接无向图知识简记)
一、有向图中的排序与调度 1、深度优先搜索的排序 使用深度优先搜索对图中顶点进行排序,根据数据结构性质与递归保存顺序,有以下三种排列顺序 (1) 前序:在递归调用之前将顶点加入队列。 (2)后…...

AIGC助力小学生编程梦:C++入门不再难!
文章目录 一、AIGC时代下的编程教育新趋势二、小学生C入门趣味编程的意义三、小学生C入门趣味编程的实践策略四、面临的挑战与应对策略五、AIGC技术在小学生C编程中的应用与前景《小学生C趣味编程从入门到精通》编辑推荐内容简介作者简介目录 随着人工智能生成内容(…...

AI开发-三方库-Hugging Face-Pipelines
1 需求 需求1:pipeline支持的任务类型 需求2:推理加速使用CPU还是GPU 需求3:基于pipeline的文本分类示例 需求4:pipeline实现原理 模型使用步骤(Raw text -》Input IDs -》Logits -》Predictions)&…...

【Python网络编程】学习Socket编程,打造网络应用!
【Python网络编程】学习Socket编程,打造网络应用! 网络编程是现代计算机科学中的重要一环,几乎所有的应用都依赖网络传输数据。无论是创建简单的客户端-服务器模型,还是构建复杂的网络应用,Socket 编程都是关键的技术…...

docker (desktopcompose) download
docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell...

即时通讯:单聊消息逻辑
在线消息(对方在线) 1.client发送消息到msg_server 2.msg_server判断消息有效性,每秒发送的消息不能超过限制,无误后转发给db_server 3.db_server判断为单聊 查找对应的会话,不存在则创建两个会话(双方…...

Libevent源码剖析之reactor
1 简介 reactor 是一种事件驱动的并发处理模式,常用于网络服务器和事件循环系统中。它主要的功能是通过单线程或者多线程处理I/O操作,避免阻塞,并且能够高效处理大量并发的事件。 one loop per thread or process,以下摘自 reacto…...

分享一套SpringBoot+Vue民宿(预约)系统
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue民宿(预约)系统,分享下嘿嘿。 项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,…...
Linux——应用软件的生命周期
功能开发测试: 功能性测试 对应开发框架的测试用例代码的漏洞扫描 Web服务器版本应用开发语言的依赖关系和版本信息是否会造成类似内存泄露等影响系统性能的问题压力测试应用的部署 获取应用代码以及应用静态文件的代码包将安装包中的文件按照服务器配置的架构&…...

【Linux】exec系列函数详细介绍
首先,exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思: l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execl:l 为 list 可变参数列表 原型:int execl(const char *path, cons…...

ARINC 429总线协议
一、概述 ARINC 是美国航空无线电公司英文字头的缩写, 该公司1977年7月21日出版了“ARINC 429规范”一书,429规范就是飞机电子系统之间数字式数据传输的标准格式,在飞机上使用429总线的电子设备均应遵守这个规范,这样才能保证电子…...
Qt解决槽函数中发送的信号的参数会变化带来的错误
connect(item, &MusicItemWidget::playRequest, this, [this] { emit playMusic(QUrl(this->m_mediaPath); ); 如上图,this->m_mediaPath是个成员变量,但自己的初衷是发送一个最开始捕获的值,那么可以使用下面的方法…...
C C++ 如何编写库级接口
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

安装TDengine数据库3.3版本和TDengine数据库可视化管理工具
安装TDengine数据库3.3版本和TDengine数据库可视化管理工具 一、下载安装包二、解压安装包三、部署四、启动服务五、进入数据库六、创建数据库、表和往表中插入数据七、测试 TDengine 性能八、使用数据库九、查询数据十、TDengine数据库可视化界面 一、下载安装包 TDengine-cl…...

详解CAS
一、CAS是什么? CAS是Java中Unsafe类里面的一个方法,是Compare and Swap的缩写,中文翻译成比较并交换,主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性,实现并发算法时常用到的一种技术。它包含三…...

《环境感知方案:探索未来智能世界的关键技术》
《环境感知方案:探索未来智能世界的关键技术》 一、环境感知方案的研究现状(一)机器人领域的环境感知(二)农业领域的环境感知(三)智能网联汽车领域的环境感知 二、先进的环境感知技术࿰…...

Android 编译时出现Android resource linking failed.without required default value.
错误信息如下: Execution failed for task :app:processDebugResources. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction> Android resource linking failedwarn: removing r…...
golang ws升级为wss
首先需要一份openssl证书 1.安装openssl windows安装openssl 的下载地址在 https://slproweb.com/products/Win32OpenSSL.html 无脑点安装就行,记得最后安装完成的页面取消勾选 安装完成后记得配置环境变量 2.生成证书 openssl req -x509 -days 36500 -nodes …...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...