1967年5月20日,在挪威奥斯陆郊外的小镇莉沙布举行的IFIP TC-2 工作会议上,挪威科学家Ole-Johan Dahl和Kristen Nygaard正式发布了Simula 67语言。Simula 67被认为是最早的面向对象程式设计语言,它引入了所有后来面向对象程式设计语言所遵循的基础概念:对象、类、继承。之后,在1968年2月形成了Simula 67的正式文本。
Simula是由Ole-Johan Dahl和Kristen Nygaard在20世纪60年代在奥斯陆挪威计算中心开发的两种模拟程式语言Simula I和Simula 67的名称。在句法上,它是ALGOL 60的一个相当忠实的超集。
Simula被认为是第一个面向对象的程式语言。顾名思义,Simula就是为模拟而设计的,并且该领域的需求为当今面向对象语言的许多功能提供了框架。
Simula已被广泛用于模拟VLSI设计,过程建模,协定,算法以及排版,计算机图形和教育等其他套用。 Simula的影响常常被低估,并且Simula类型的对象在C ++,Object Pascal,Java,C#和其他几种语言中被重新实现。计算机科学家,例如C ++的创造者Bjarne Stroustrup和Java的创造者James Gosling已经承认Simula是一种主要影响。
基本介绍
- 中文名:模拟语言
- 外文名:simula
- 诞生时间:1967年
- 地点:Simula研究所
简介
也是在1968年,荷兰教授E.W.Dijkstra提出了“GOTO语句是有害的”观点,指出程式的质量与程式中所包含的GOTO语句的数量成反比,认为应该在一切高级语言中取消GOTO语句。这一观点在计算机学术界激起了强烈的反响,引发了一场长达数年的广泛的论战,其直接结果是结构化程式设计方法的产生。
相信当时没有任何人预见到当年发生的这两件事对后来计算机技术,特别是软体技术所产生的深远影响。儘管这两种方法的思想差异巨大,但是多年以后,无论是Ole-Johan Dahl和Kristen Nygaard,还是E.W.Dijkstra,都因其在这一年所取得的成就,获得了计算机界的诺贝尔奖——图灵奖。 为了纪念挪威的这两位科学家的伟大贡献,在挪威研究基金会(Norwegian Research Council)的筹划下,Simula研究所 (Simula Research Laboratory)于2001年1月正式成立。
随着计算机技术的迅猛发展,硬体成本不断降低,而软体成本却不断增加,因此,如何缩短软体生产周期和提高维护效率,研製出高质量的软体产品成为一个重要课题。
程式设计思想的进步
在20世纪60年代,软体曾出现过严重危机,由软体错误而引起的信息丢失、系统报废事件屡有发生。为此,1968年,荷兰学者E.W.Dijkstra提出了程式设计中常用的GOTO语句的三大危害:破坏了程式的静动一致性;程式不易测试;限制了代码最佳化。此举引起了软体界长达数年的论战,并由此产生了结构化程式设计方法,同时诞生了基于这一设计方法的程式设计语言Pascal。
由瑞士计算机科学家Niklaus Wirth开发的Pascal,一经推出,它的简洁明了以及丰富的数据结构和控制结构,为程式设计师提供了极大的方便性与灵活性,同时它特别适合微计算机系统,因此大受欢迎。结构化程式设计思想採用了模组分解与功能抽象和自顶向下、分而治之的方法,从而有效地将一个较複杂的程式系统设计任务分解成许多易于控制和处理的子程式,便于开发和维护。因此,结构化方法迅速走红,并在整个20世纪70年代的软体开发中占绝对统治地位。
但是,到了70年代末期,随着计算机科学的发展和套用领域的不断扩大,对计算机技术的要求越来越高。结构化程式设计语言和结构化分析与设计已无法满足用户需求的变化,于是面向对象技术开始浮出水面。
面向对象程式设计方法起源于Simula 67语言。在程式设计语言的发展史上,20世纪60年代后期是承上启下的重要时期。这一时期有三种重要的语言问世,即Simula 67、由一批顶尖计算机科学家共同设计的Algol 68、以及为IBM 360系列机配套开发的PL/I。这三种语言虽均有所创新,但Simula 67的面向对象概念的影响是最巨大而深远的。它本身虽因为比较难学、难用而未能广泛流行,但在它的影响下所产生的面向对象技术却迅速传播开来,并在全世界掀起了一股OO热潮,盛行不衰。面向对象程式设计在软体开发领域引起了大的变革,极大地提高了软体开发的效率,为解决软体危机带来了一线光明。
但是,事实表明,面向对象程式设计方法虽然比结构化方法能更自然地表现现实世界,但它不是灵丹妙药,并不能解决所有问题,它本身存在固有的内在的局限性。最近兴起的面向方面编程(AOP)正是为了改进上述程式设计方法学的不足。AOP被视为是“后”面向对象时代的一种新的重要的程式设计技术。而从更广义的範畴看,在过去的40年里,软体体系结构试图处理日益增长的软体複杂性,但複杂性却仍继续增加,传统的体系结构好像已经达到了其处理此类问题的极限。新兴的Web 服务通过允许应用程式以对象模型中立的方式实现互连,从而提供了一个更强大、更灵活的编程模型,并将对软体开发方法产生巨大的影响。
示例代码
最小程式
空计算机档案是Simula中的最小程式,通过原始码的大小来衡量。 它只包含一件事; 虚假陈述。
但是,最简单的程式更方便地表示为空白块:
BeginEnd;
它开始执行并立即终止。该语言没有程式本身的任何返回值。
Hello world
Simula中的Hello world程式的一个例子:
Begin OutText ("Hello, World!"); Outimage;End;
Simula不区分大小写。
类和虚拟程式
使用类,子类和虚拟过程的更现实的示例:
Begin Class Glyph; Virtual: Procedure print Is Procedure print; Begin End; Glyph Class Char (c); Character c; Begin Procedure print; OutChar(c); End; Glyph Class Line (elements); Ref (Glyph) Array elements; Begin Procedure print; Begin Integer i; For i:= 1 Step 1 Until UpperBound (elements, 1) Do elements (i).print; OutImage; End;End; Ref (Glyph) rg; Ref (Glyph) Array rgs (1 : 4); ! Main program; rgs (1):- New Char ('A'); rgs (2):- New Char ('b'); rgs (3):- New Char ('b'); rgs (4):- New Char ('a'); rg:- New Line (rgs); rg.print; End;
上面的例子有一个超类(Glyph)和两个子类(Char和Line)。 有两个实现有一个虚拟过程。 执行开始于执行主程式。 Simula没有抽象类的概念,因为具有纯虚拟程式的类可以被实例化。 这意味着在上面的例子中所有的类都可以被实例化。 然而,调用纯虚拟过程会产生运行时错误。
仿真
Simula包含一个用于执行离散事件模拟的模拟软体包。 该仿真软体包基于Simula的面向对象特性及其协程概念。
Sam,Sally和Andy正在买衣服。 他们必须共用一间试衣间。 他们每个人都在浏览商店约12分钟,然后专门用试衣间约3分钟,每个正常分发。 他们的试衣间体验模拟如下:
Simulation Begin Class FittingRoom; Begin Ref (Head) door; Boolean inUse; Procedure request; Begin If inUse Then Begin Wait (door); door.First.Out; End; inUse:= True; End; Procedure leave; Begin inUse:= False; Activate door.First; End; door:- New Head; End; Procedure report (message); Text message; Begin OutFix (Time, 2, 0); OutText (": " & message); OutImage; End; Process Class Person (pname); Text pname; Begin While True Do Begin Hold (Normal (12, 4, u)); report (pname & " is requesting the fitting room"); fittingroom1.request; report (pname & " has entered the fitting room"); Hold (Normal (3, 1, u)); fittingroom1.leave; report (pname & " has left the fitting room"); End; End; Integer u; Ref (FittingRoom) fittingRoom1; fittingRoom1:- New FittingRoom; Activate New Person ("Sam"); Activate New Person ("Sally"); Activate New Person ("Andy"); Hold (100);End;
主模组以仿真为前缀进行仿真。 仿真包可以在任何块上使用,并且在模拟某人进行模拟时甚至可以嵌套模拟。
试衣间对象使用伫列(门)进入试衣间。 当有人要求试衣间并且它正在使用时,他们必须在这个伫列中等待(等待(门))。 当有人离开试衣间时,第一个(如果有的话)从伫列中释放(激活door.first),并相应地从门伫列(door.First.Out)中移除。
人员是流程的一个子类别,其活动描述为使用保持(浏览店铺和在试衣间度过的时间),并在试衣间对象中请求和离开试衣间的程式。
主程式创建所有对象并激活所有person对象以将它们放入事件伫列。 主程式在程式终止前持续100分钟的模拟时间。