谁创造了第一个循环结构的想法?


53
while (1) {
      if (1+1==2) {
             print "Yes, you paid attention in Preschool!";
      } else {
             print "Wait... I thought 1+1=2";
      }
 }

作为开发人员,我们所有人都必须非常频繁地使用循环。我们知道。我想知道的是,谁想到这个主意是循环的?循环引入什么语言?什么是第一个循环结构?是while循环吗?一个for循环?等等?


22
查尔斯·巴贝奇(Charles Babbage)和艾达(Ada Lovelace)最有可能。
mcfinnigan 2012年

28
它是在洗发水说明书中发明的,漂洗,起泡,重复。:-)
盖·西顿

13
@GuySirton,别傻了,那是递归。
mowwwalker

18
@ user838584-如果是递归,则每个repeat调用都会调用另一个repeat-您将永远无法完成。我认为也许女人是用这种方式阅读洗发水的说明,但是男人是把它当作反复阅读的,只需要几分钟就可以洗头。
Steve314

3
没有循环的计算机就是计算器。
starblue'7

Answers:


102

正如mouvicielEmilio Garavaglia指出的那样,该概念早于计算。然而,一审软件循环是循环阿达洛夫莱斯用于计算伯努利数,如在注摹她的翻译由查尔斯·巴贝奇发明了分析机的草图,通过LF Menabrea。Menabrea在早期就指出了分析引擎的循环能力:

可以理解,让我们在要执行的一系列操作的开始时,将针头C放在分区2上,将针头B放在分区5上,将针头A放在分区9上。拨盘C的锤击;它将击中两次,同时针B将越过两格。然后,后者将指示数字7,该数字将在第一差的列中继数字5之后。如果我们现在允许拨盘B的锤子敲打,它将敲打七次,在此期间,指针A前进七格;这些加到已经标记的9上将得到数字16,它是连续的9的平方数。如果我们现在重新开始这些操作,则从总是保留在除法2处的针C开始。

分析引擎的循环机制直接继承自Joseph Marie Jacquard的 机械织机(1801),如Menabrea的回忆录所述:

现在将询问机器如何能够自身而无需依靠人的手来承担适合于操作的连续布置。该问题的解决方案是通过以下方式从提花设备制造的,该设备用于制造锦缎产品:

编织物通常区分两种线。一种是经线或纵向线,另一种是纬线或横向线,由称为穿梭装置的仪器传送,并与纵向线或经线交叉。当需要织锦缎的东西时,有必要依次防止某些线穿过纬线,并且这要根据由要复制的设计的性质决定的顺序来进行。以前,此过程是漫长且困难的,并且有必要使工人通过遵循他要仿制的设计,自己来调节螺纹的运动。因此引起了这种材料描述的高昂价格,尤其是当各种颜色的线进入织物时。为了简化制造过程,提花制定了计划,将要一起使用的每组线程连接在一起,并有一个专门属于该组的独特杠杆。所有这些杠杆都以杆的形式终止,杆成一束,通常呈平行四边形,带有一个矩形底。杆是圆柱形的,并且彼此隔开很小的间隔。因此,抬高螺纹的过程被分解为以必要的顺序移动这些各种杠杆臂的过程。为此,采用矩形的粘贴板,其尺寸比杠杆臂束的一部分大一些。如果将这张纸贴到捆束的底部,然后将前进的动作传递给粘贴板,则粘贴板将与捆束的所有杆一起移动,因此,与它们每个连接的线程。但是,如果粘贴板(不是平整的)上开有对应于与之相接的杠杆末端的孔,则由于每个杠杆在粘贴板的运动过程中都会穿过粘贴板,因此它们都将保留在其内部。的地方。因此,我们发现,很容易确定粘贴板上的孔的位置,即在任何给定的时刻,都应有一定数量的杠杆,因此会提起线束,其余的保持在它们固定的位置是。假设根据要执行的模式所指示的定律连续重复此过程,我们认为该模式可以在素材上重现。为此,我们只需要根据所需的法律组成一系列卡片,并以适当的顺序依次排列它们;然后,通过使它们越过一个多角形梁,该多角形梁被连接成在航天飞机的每次行程中都转动一个新面,然后该面应平行于自身而被推向杠杆臂束,抬起线程将定期执行。因此,我们看到锦缎组织可以以前难以获得的精度和速度制造。

提花织机是在命令机器产生重复输出的上下文中循环的非常早期的应用:

提花织机背后的想法是打孔卡和挂钩系统。这些卡非常厚,并在其上打了矩形孔。编织中使用的钩针是通过纸板上的这些孔引导的。当卡钩与卡钩接触时,除非卡钩遇到穿孔之一,否则它们将保持静止。然后,钩子可以用插入另一根线的针穿过该孔,从而形成所需的图案。通过将许多卡一张一张接一张地排列和/或重复使用,可以实现复杂的图案。

提花织机也被认为是存储程序的早期形式:

如果到目前为止讨论的计算机发展的主要动力来自于数值计算,那么导致最早的“存储程序”形式的动力就来自一个截然不同的来源:纺织工业。前面我们已经看到,计算系统的基本方面之一是表示信息的概念,尽管我们尚未明确进行表示,但在迄今为止所研究的所有伪像中,都可以看出该思想的应用:在开发数值的书面表示形式以及由此产生的机械上的相似之处。因此,卵石在算盘框架上的对齐,滑动尺上运动刻度的并置以及Schickard,Pascal和Leibniz装置上的齿轮齿构造,都是代表性技术的示例,这些技术试图简化算术任务背后的复杂过程。但是,除了可以执行计算处理的编号以外,还有信息的类别及其表示。Joseph-Marie Jacquard在1801年开发的织造技术就是这种类型的一个例子。

查尔斯·巴贝奇(Charles Babbage)还将提花机的存储过程调整为分析引擎,有无孔将简单的开关命令传达给了机器:

分析引擎具有现代数字计算机中发现的许多基本功能。它可以使用打孔卡进行编程,这是从提花织机借来的想法,用于在纺织品上编织复杂的图案。该引擎有一个“存储”,可以保存数字和中间结果,还有一个单独的“磨”,用于执行算术处理。它具有四个算术函数的内部库,并且可以执行直接乘法和除法。它还具有我们以其现代名称命名的功能:条件分支,循环(迭代),微编程,并行处理,迭代,锁存,轮询和脉冲整形等,尽管巴贝奇在任何地方都没有使用这些术语。它具有多种输出,包括硬拷贝打印输出,打孔卡,

Analytical Engine的条件分支与Jacquard启发的机械循环和存储过程相结合,在概念上(与概念上)极为相似,尤其是在零件中添加Babbage打印机的情况print "...";

显然,机械循环早于提花织机,最早已知的以循环方式工作的装置是Antikythera机制(公元前100年),如果我们进一步研究历史(并且冒险地脱离话题),日di可能是最古老的人造机制在对环的理解很明显的地方,当然要遵循太阳和其他恒星体轨道的重复模式。

但是我认为,在计算(而不是计算或其他任何东西)的情况下,分析引擎和Ada的Bernoulli数计算算法可归因于引入循环,并与Jacquard的织机共享了至少一些功劳,并直接从它。


3
在提花织机之前,您可以在钟琴中找到机械环,例如布鲁日的钟环,其中钟声是由圆柱体旋转控制的。
mouviciel

6
@mouviciel我看到了您的钟声怪诞,并为您提出了Antikythera机制。; P
扬尼斯2012年

2
+1为您的百科全书答案,包括2000台计算机!
mouviciel

2
这个漂亮的答案让我最喜欢这个问题。它不仅回答问题,而且代表“如何回答问题”的示例。干得好,先生。
加尼2012年

接受此答案,因为它既是结论性的,又是百科全书的,而且简直太棒了!
2012年


32

“再做一次”的概念在某种程度上是人类感知的“原始”。您可以告诉一个刚刚精通自然语言的孩子。

在离散系统中,当您承认可以达到以前一直处于的状态时,就会在所有有限状态机中发现循环。

最简单的循环是两个状态(一个时钟)之间的循环。假定从其计数可以得出任何更多数量的状态,则将每个更复杂的机器构造在一个“计数器”上,该“计数器”以一个时钟递增,该时钟可以在表示某些组合操作的某些标志上“跳转”。这是每台基于微处理器的计算机所使用的冯·诺依曼机器的核心。

在机器代码中,对跳转进行了编码JP-Z-nnnn(其中Z是根据条件指定的ypuer标志ypu)。在高级语言中,这几乎立即翻译成

if(z) goto x;

循环只不过goto是x标签位于goto指令本身之前的循环。

所有其他配方(对,做什么,while等)仅仅是“语法糖”,以更好地驯化野生中的很常见的情况转到重复,直到出了事


4

循环的概念是将成熟的计算机与简单的计算机区分开来的东西之一。如果系统不支持循环,则说明它不完整,因此也就不是计算机。

图林完备的第一个设计是Babbage的Analytical Engine,因此它必须具有循环的概念。但是,有些系统确实具有循环功能,但图灵不完整(因为它们省略了其他内容)。不过,巴贝奇的工作可能是一个很好的起点。


6
Lambda演算没有循环(也没有条件或跳跃),但是图灵完成。递归与迭代一样强大。

3
您可以将任何循环重写为递归函数并消除循环
棘手怪胎

5
维基百科有关循环的文章将递归描述为一种表达循环的方式,而不是一个完全无关的概念。en.wikipedia.org/wiki/Program_loop#Loops至于没有循环的CPU,它们确实具有实现循环所需的工具(跳转到任意内存地址)
GordonM

8
确切地说,可以使用递归来表示循环。即使它们彼此同构,这一个完全不同的概念。咖啡杯并不是一个甜甜圈,仅仅是因为据称拓扑学家会混淆它们。

4
的确如此,但是任何图灵完备的系统都必须具有表达多次执行相同序列的概念的方式,该机制可以是递归的,也可以是在指令列表中向后跳转或其他实现相同效果的方法。如果系统不提供任何重复一组指令的方式(除了物理上重复列表中的指令),那么它就不可能是图灵完成的。分析引擎是图灵完整的,因此它必须以一种或另一种形式实现循环。
GordonM 2012年

3

假设您的意思是现代文本计算机编程语言。

Algol60具有“ FOR”,“ DO”,“ UNTIL”和“ WHILE”,因此在1960年之前。

复古计算机博物馆Retro Computing Museum)在1960年以前有几种语言。

Kvikkalkul是50年代用于编程瑞典核潜艇的语言,只有GOTO。(但是,Kvikkalkul几乎可以肯定是90年代的骗局,不是真正的历史语言。)

我能找到最早的Konrad Zuse的Plankalkül。它具有“für”构造。


直到最近,Plankalkül基本上还没有出版,而长期以来一直有传言说Kvikkalkul是骗局。有鉴于此,可能要归功于John Backus和FORTRAN团队,他们在1957年在该领域拥有运行中的带有DO循环的编译器。
Ross Patterson

2

Liebniz和Newton的工作都包含带有循环结构的算法。利勃尼兹(Liebniz)建立了一个机械计算器,并推测(就像洛夫莱斯(Lovelace几年后)所做的那样),该机器可以执行更复杂的分析。他关于这些想法的笔记是粗略的,但是它们描述了带有循环的结构化逻辑。

然而,重复序列和计数控制循环的理念,以及我们所说while循环在为谁算法男儿的工作讨论:花拉子米,从9世纪。牛顿,利勃尼兹,巴贝奇等人都知道他的第二本书,即《北基塔布·穆赫塔萨尔·fi·希萨布·贾布尔·瓦尔·穆加巴拉》。 。

当然,赫瓦里兹米部分地依靠古希腊人。在某个时候,我们可能会回到亚当和夏娃的漂洗,起泡,重复的版本。

有关Al-Khwārizmī及其工作的更多信息,请参见:

http://www-groups.dcs.st-andrews.ac.uk/history/Mathematicians/Al-Khwarizmi.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.