跳转到导航跳转到搜索Simula是两种仿真编程语言的名称,Simula I和Simula 67由Ole-Johan Dahl和Kristen Nygaard在1960年代在奥斯陆的挪威计算机中心开发。从句法上讲,它是ALGOL 60的一个相当忠实的超集,[1]:1.3.1也受Simscript设计的影响。 [2]
Simula 67引入了对象,[1]:2,5.3类,[1]:1.3.3,2继承和子类,[1]:2.2.1虚拟过程,[1]:2.2.3协程,[1]: 9.2和离散事件模拟,[1]:14.2,并具有垃圾回收功能。 [1]:9.1 Simula衍生物还引入了其他形式的子类型(继承子类除外)。 [需要引用]
Simula被认为是第一种面向对象的编程语言。顾名思义,1962年的第一个Simula版本是为进行仿真而设计的。 Simula 67虽然被设计为一种通用的编程语言[3],但却为当今面向对象语言的许多功能提供了框架。
Simula已被用于广泛的应用程序中,例如模拟超大规模集成(VLSI)设计,过程建模,通信协议,算法,以及其他应用程序,例如排版,计算机图形学和教育。 Simula的影响通常被低估,并且Simula类型的对象以C ++,Object Pascal,Java,C#和许多其他语言重新实现。 C ++的创建者Bjarne Stroustrup和Java的创建者James Gosling等计算机科学家已经认识到Simula是主要的影响力。 [4]
克里斯汀·尼加德(Kristen Nygaard)从1957年开始编写计算机模拟程序。尼加德(Nygaard)认为需要一种更好的方法来描述系统的异构性和操作。为了进一步了解关于描述系统的正式计算机语言的思想,Nygaard意识到,他需要比计算机拥有更多计算机编程技能的人。 Ole-Johan Dahl于1962年1月加入他的工作。不久之后,就决定将语言与ALGOL 60进行链接。到1962年5月,确定了一种模拟语言的主要概念。 SIMULA I诞生,这是一种用于仿真离散事件系统的专用编程语言。
克里斯汀·尼加德(Kristen Nygaard)于1962年5月下旬受邀访问Eckert–Mauchly计算机公司,与他们的新型UNIVAC 1107计算机的营销有关。在那次访问中,Nygaard向Univac系统编程总监Robert Bemer介绍了Simula的想法。 Bemer是ALGOL的忠实粉丝,并发现Simula项目引人注目。 Bemer还是由国际信息处理联合会(IFIP)主办的第二届国际信息处理国际会议的会议主席。他邀请了Nygaard,后者介绍了论文" SIMULA – ALGOL对“离散事件网络的描述”的扩展。
挪威计算中心于1963年8月以相当可观的折扣获得了UNIVAC 1107,Dahl与UNIVAC签订了合同,实施了SIMULAI。该实现基于UNIVAC ALGOL 60编译器。到1965年1月,SIMULA I在UNIVAC 1107上已全面投入使用。在接下来的几年中,Dahl和Nygaard花了很多时间教Simula。 Simula传播到世界各地的多个国家,后来在包括Burroughs B5500和俄罗斯Ural-16在内的其他计算机上实现了SIMULAI。
1966年,C。A. R. Hoare引入了记录类构造的概念,Dahl和Nygaard对其进行了扩展,增加了前缀和其他功能的概念,以满足他们对通用过程概念的要求。 Dahl和Nygaard在1967年5月于奥斯陆举行的IFIP模拟语言工作会议上介绍了有关类和子类声明的论文。该论文成为Simula 67的第一个正式定义。1967年6月,召开了一次会议以标准化语言并发起许多实现。达尔提议统一类型和阶级概念。这导致了认真的讨论,并且该提案被董事会拒绝。 Simula 67在1968年2月的Simula标准组(SSG)的第一次会议上正式标准化。
Simula在Smalltalk和后来的面向对象编程语言的开发中具有影响力。尽管Simula仅支持协程而不是真正的并发,但它也有助于激发并发计算的参与者模型。 [7]
在六十年代末和七十年代初,有四个主要的Simula实现:
这些实现被移植到广泛的平台上。 TOPS-10实施了公共,受保护和私有成员变量和过程的概念,这些概念后来被集成到Simula 87中。Simula 87是最新标准,并已移植到各种平台上。主要有四个实现:
2001年11月,Dahl和Nygaard因通过SIMULA 67&#34的设计和实现而引入了面向对象编程的概念,被电气和电子工程师协会授予IEEE John von Neumann奖章。 2002年4月,他们通过设计语言Simula I和Simula 67。不幸的是,Dahl和Nygaard都未能参加定于2002年11月在西雅图举行的OOPSLA会议上发表的ACM图灵奖演讲[10],当时他们分别于当年6月和8月去世。 [11]
Simula研究实验室是一家以Simula语言命名的研究机构,Nygaard从2001年开业以来就在该实验室担任兼职。奥斯陆大学新的计算机科学楼名为Ole Johan Dahl's House,位于达尔(Dahl)的荣誉,主要礼堂被命名为Simula。
空的计算机文件是Simula中的最小程序,根据源代码的大小来衡量。它只包含一件事。虚假陈述。
它开始执行并立即终止。该语言缺少程序的任何返回值。
开始类雕文;虚拟:程序打印是程序打印;开始结束;字形符(c);字符c;开始打印程序; OutChar(c);结尾;字形类线(元素);引用(字形)数组元素;开始打印程序;开始整数i;对于i:= 1步骤1直到UpperBound(elements,1)执行元素(i).print; OutImage;结尾;结尾; Ref(字形)rg; Ref(Glyph)Array rgs(1:4); !主程序rgs(1):-新字符(' A'); rgs(2):-新字符(' b'); rgs(3):-新字符(' b'); rgs(4):-新字符(' a'); rg:-换行(rgs); rg.print;结尾;
上面的示例具有一个超类(字形)和两个子类(Char和Line)。有一个带有两个实现的虚拟过程。通过执行主程序开始执行。 Simula缺少抽象类的概念,因为可以实例化具有纯虚拟过程的类。这意味着在上面的示例中,所有类都可以实例化。但是,调用纯虚拟过程将产生运行时错误。
Simula支持按名称[1]进行呼叫:8.2.3,因此可以轻松实现Jensen的设备。但是,简单参数的默认传输模式是按值调用,这与ALGOL使用按名称调用相反。因此,在由Simula编译器编译时,Jensen设备的源代码必须按名称指定参数的调用。
另一个更简单的示例是求和函数∑ {\ displaystyle \ sum},该函数可以按以下方式实现:
实过程Sigma(k,m,n,u);名字k,u;整数k,m,n;真正的你开始Real; k:= m;当k< = n开始s:= s + u; k:= k + 1;结尾; Sigma:= s;结尾;
上面的代码按名称调用了控制变量(k)和表达式(u),这允许在表达式中使用控制变量。
请注意,Simula标准允许对for循环中的控制变量进行某些限制。因此,以上代码使用while循环来实现最大的可移植性。
Z = ∑ i = 1100 1(i + a)2 {\ displaystyle Z = \ sum _ {i = 1} ^ {100} {1 \ over(i + a)^ {2}}}
Simula包括用于执行离散事件模拟的模拟[1]:14.2程序包。该模拟程序包基于Simula的面向对象功能及其协同程序[1]:9.2的概念。
山姆,莎莉和安迪都在买衣服。他们必须共享一个试衣间。他们每个人浏览商店约12分钟,然后专门使用试衣间约3分钟,每个都按照正常分布进行。他们的试衣间体验的模拟如下:
Simulation Begin Class FittingRoom;开始参考(头部)门;布尔值inUse;程序要求;如果在使用中则开始,然后开始等待(门);门。先出;结尾; inUse:= True;结尾;程序休假; Begin inUse:= False;激活门。结尾;门:-新头;结尾;程序报告(消息);短信;开始OutFix(时间,2,0); OutText(&#34 ;:"&消息); OutImage;结尾;流程类人员(pname);文字pname;当真开始时开始保持(正常(12,4,u));报告(pname&"正在要求试衣间") fittroom1.request;报告(pname&已进入试衣间)。保持(普通(3,1,u)); fitroom1。离开;报告(pname&"已离开试衣间")结尾;结尾;整数u; Ref(FittingRoom)fittingRoom1; fittingRoom1:-新的FittingRoom;激活新人(" Sam");激活新人(" Sally");激活新人(" Andy");保持(100);结尾;
主块的前面加上“仿真”,以启用仿真。模拟包可用于任何块,并且在模拟进行模拟的人员时甚至可以嵌套模拟。
试衣间对象使用队列(门)访问试衣间。当有人要求试衣间并且正在使用试衣间时,他们必须在此队列中等待(等待(门))。当有人离开试衣间时,第一个(如果有的话)从队列中释放(激活door.first),并因此从门队列中移除(door.First.Out)。
Person是Process的子类,其活动通过保持(浏览商店的时间和在试衣间中花费的时间)来描述,并调用试衣间对象中的过程来请求和离开试衣间。
主程序创建所有对象并激活所有人员对象以将它们放入事件队列。在程序终止之前,主程序将保留100分钟的模拟时间。
奥尔(Ole-Johan)达尔(Dahl),奥勒·约翰(Ole-Johan)比约恩(Bjørn)迈尔豪格(Myhrhaug);妮嘉(Nygaard),克里斯汀(Kristen)(1970年)。通用基本语言(PDF)(报告)。挪威计算中心。 (原始内容存档于2013-12-25)。 CS1维护:网址不合适(链接)
^ Nygaard,克里斯汀(1978)。 "模拟语言的发展" (PDF)。 .. SIMULA I和SIMULA 67 ...的开发受到SIMSCRIPT ...
^ Kristen Nygaard和Ole-Johan Dahl。 1978年。开发了SIMULA语言。编程语言的历史。美国纽约,计算机技术协会,439–480。 DOI:https://doi.org/10.1145/800025.1198392
^ Holmevik,Jan Rune(1994)。 "编译模拟:技术起源的历史研究" (PDF)。 IEEE计算历史年鉴。 16(4):25-37。 doi:10.1109 / 85.329756。
^ Holmevik,简·符文。 "编译模拟器。挪威奥斯陆:研究与高等教育研究所。 (原始内容存档于2009年4月20日)。
^ Lehrmann Madsen,Ole(2014年)。 "构建安全并发抽象。 在古尔的阿迦(Agha); 五十岚淳 小林直树; 增原秀彦; 松冈聪; 芝山芝山 ura浦健次郎(主编)。 并发对象及其他。 柏林:施普林格。 p。 68. doi:10.1007 / 978-3-662-44471-9。 ISBN 978-3-662-44471-9。 ^" ACM Ole-Johan Dahl和Kristen Nygaard-itu告。 Acm.org。 (原始内容存档于2011年7月19日)。 西尔维斯特,彼得。 " IBM System 360/370编译器和历史文档" (Simula标准和其他历史文档)。 Pooley,Rob(1987),Simula中的编程介绍,Alfred Waller Ltd,ISBN 0632016116,从原始文档存档于2004-09-19