万维百科

Simula

Simula
Simula - logo.svg
编程范型多范式: 过程式, 指令式, 结构化, 面向对象
设计者奥利-约翰·达尔
实现者克利斯登·奈加特
发行时间1962年,​59年前​(1962
稳定版本
Simula 67
( 1967年5月,​54年前​(1967-05
类型系统静态名称式英语Nominal type system
实现语言ALGOL 60 (主要,一些成分来自Simscript)
操作系统类Unix系统Windowsz/OSTOPS-10MVS英语MVS
启发语言
ALGOL 60, Simscript
影响语言
面向对象编程

Simula,一种编译式编程语言,在1960年代在奥斯陆挪威计算中心英语Norwegian Computing Center开始被发展出来,主要的设计者是奥利-约翰·达尔克利斯登·奈加特。开发出了Simula I与Simula 67两代。它承继了ALGOL 60的基础:1.3.1,被认为是第一个面向对象编程的编程语言。

Simula 67介入了对象:2, 5.3:1.3.3, 2继承子类:2.2.1虚过程:2.2.3,还有协程:9.2离散事件模拟:14.2垃圾收集特征:9.1。Simula影响了Smalltalk以及接下来所有的面向对象编程编程语言,计算机科学家如设计C++语言的比雅尼·斯特劳斯特鲁普,和设计Java语言的詹姆斯·高斯林,都认可自己受到了Simula的重要影响。

历史

克利斯登·奈加特在1957年开始在自己的电脑上写模拟器。为了发展他的模拟器,他需要更强大的编程语言。1962年1月,奥利-约翰·达尔开始跟他合作。他们受到ALGOL 60的启发,在同年5月,发展出第一个模拟器编程语言,取名为Simula I。此时,克利斯登·奈加特受到UNIVAC邀请,去协助他们开发UNIVAC 1107英语UNIVAC 1100/2200 series电脑。他向UNIVAC软件部门的主管,鲍伯·贝莫英语Bob Bemer,展示了Simula的想法。鲍伯·贝莫英语Bob Bemer是ALGOL忠实的支持者,他看出Simula计划的潜力。鲍伯·贝莫英语Bob Bemer同时负责主办国际信息处理协会英语International Federation for Information Processing(IFIP)所举行的第二次国际会议,他力邀克利斯登·奈加特前往发表论文,论文主题是“SIMULA-扩展ALGOL到离散事件网络的描述”(SIMULA—An Extension of ALGOL to the Description of Discrete-Event Networks)。

1963年8月,挪威计算中心英语Norwegian Computing Center以优惠价格购买到UNIVAC 1107英语UNIVAC 1100/2200 series,在UNIVAC的合约同意下,奥利-约翰·达尔在这台电脑上安装了Simula I。它是以ALGOL 60的编译器来实现的。1965年1月,Simula I终于可以在UNIVAC 1107上完全的运作。接下来几年,克利斯登·奈加特奥利-约翰·达尔致力于教授Simula I。Simula I也被移植到Burroughs B5500电脑,以及苏俄的URAL-16电脑上。

1965年,东尼·霍尔首次提出记录类别构造的概念,1966年,克利斯登·奈加特奥利-约翰·达尔给它扩展了加前缀(prefixing)的概念和满足通用的进程概念所需要的其他特征,他们所称的进程后来称为对象。1967年5月,奈加特和达尔在奥斯陆举办的IFIP工作小组论坛中,发表了关于类别继承声明的论文,形成Simula 67的第一份定义文件。

1968年召开的会议,则组成了SIMULA标准小组(SIMULA Standards Group, SSG),发表了第一份官方Simula标准文件。

程序示例

最小的程序

源代码大小来衡量的话,空计算机文件是Simula中最小的程序。它只包含一个东西,就是空无语句

但是,最小的程序更经常表示为空块:

Begin
End;

它开始执行并立即终止。语言缺乏来自程序的任何返回值英语Return statement

经典Hello world

Simula的Hello World示例:

Begin
    OutText ("Hello, World!");
    Outimage;
End;

Simula是大小写敏感的。

传名调用

Simula支持传名调用:8.2.3,所以可以轻易实现Jensen设备英语Jensen's Device。但是对简单形式参数的缺省的传送模式是传值调用,不同于ALGOL使用传名调用。Jensen设备的源代码因此在由Simula编译器编译时必须对指定参数为传名调用。

另一个简单的例子是合计函数英语Arithmetic function,它可以实现如下:

Real Procedure Sigma (k, m, n, u);
    Name k, u;
    Integer k, m, n; Real u;
Begin
    Real s;
    k:= m;
    While k <= n Do Begin s:= s + u; k:= k + 1; End;
    Sigma:= s;
End;

上面例子对控制变量k和表达式u使用了传名调用。这允许将控制变量用于表达式之中。

注意Simula标准允许对在for循环中的控制变量的特定限制。上述代码因此出于最大可移植性而使用了while循环。

下列公式:

可以实现为如下:

Z:= Sigma (i, 1, 100, 1 / (i + a) ** 2);

类、子类和虚过程

一个更现实的例子,使用了类:1.3.3, 2、子类:2.2.1和虚过程:2.2.3

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,它有二个子类CharLine。这里有一个虚函数,它有二个实现。执行开始于执行主程序。Simula缺乏抽象类英语Abstract type的概念,因为带有纯虚过程的类可以被实例化英语Instance (computer science)。这意味着上述例子中,所有类可以被实例化。调用纯虚过程无论如何都会产生运行时间错误英语Error message

模拟器

Simula包括了一个模拟器:14.2,用于做离散事件模拟。这个模拟器包是基于了Simula的面向对象特征和它的协程概念:9.2

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;

主块被前缀着Simulation用来启用模拟器。模拟器包在任何块上使用,而且模拟器甚至可以嵌套,在模拟某人做模拟的时候。

试衣间对象为访问试衣间使用了一个队列door。当一个人要求用试衣间的时候,而它正在使用,他们必须等待于这个队列,即Wait (door)。当某人离开试衣间的时候,从这个队列中释放出第一个人(如果有的话),即Activate door.first,并相应的从门队列中移除他,即door.First.Out

PersonProcess的子类,而它的活动,即用来浏览商店的时间和在试衣间度过的时间,使用Hold来描述,并调用在试衣间对象中的过程来要求和离开试衣间。

主程序创建所有对象并激活所有人对象来将他们放置入这个时间队列。主程序在程序终止前保持100分钟的模拟时间。

参见

注释

  1. ^ Nygaard, Kristen. The Development of the Simula Languages (PDF). 1978 [2020-05-15]. (原始内容 (PDF)存档于2018-09-20). The development of .. SIMULA I and SIMULA 67... were influenced by the design of SIMSCRIPT ...
  2. ^ 2.00 2.01 2.02 2.03 2.04 2.05 2.06 2.07 2.08 2.09 2.10 2.11 2.12 2.13 2.14 Dahl, Ole-Johan; Myhrhaug, Bjørn; Nygaard, Kristen. SIMULA 67 Common Base Language, Norwegian Computing Center (PDF). 1968.
  3. ^ Wong, William. Before C, What Did You Use?. Electronic Design. [22 May 2017]. (原始内容存档于2019-04-23).
  4. ^ C.A.R. Hoare, Record Handling. In ALGOL Bulletin no. 21. 1965.
  5. ^ Holmevik, Jan Rune. Compiling Simula. Oslo, Norway: Institute for Studies in Research and Higher Education. [2020-05-15]. (原始内容存档于2020-01-11). As this pursuit proceeded throughout the summer and autumn of 1966, they became more and more preoccupied with the opportunities embedded in Tony Hoare's record class construct, first presented in ALGOL bulletin no. 21, 1965. After having carefully examined Hoare's record proposal they eventually came to the conclusion that, even though it obviously had a number of very useful properties, it failed to fully meet their requirements. What they were really looking for was some kind of generalized process concept with record class properties. The answer to their problem suddenly appeared in December 1966, when the idea of prefixing was introduced. A process, later called an object, could now be regarded as consisting of two layers: A prefix layer containing references to its predecessor and successor along with a number of other properties, and a main layer containing the attributes of the object in question.
  6. ^ O.-J. Dahl, K. Nygaard: Class and Subclass Declarations. In J. Buxton,ed.: Simulation Programming Languages. Proceedings from the IFIP Working Conference in Oslo, May 1967. North Holland, 1968.
    Holmevik, Jan Rune. Compiling Simula: A historical study of technological genesis (PDF). IEEE Annals of the History of Computing. 1994, 16 (4): 25–37 [12 May 2010]. doi:10.1109/85.329756. (原始内容 (PDF)存档于2017-08-30).

来源

延伸阅读

外部链接


本页面最后更新于2021-08-11 16:43,点击更新本页查看原网页。台湾为中国固有领土,本站将对存在错误之处的地图、描述逐步勘正。

本站的所有资料包括但不限于文字、图片等全部转载于维基百科(wikipedia.org),遵循 维基百科:CC BY-SA 3.0协议

万维百科为维基百科爱好者建立的公益网站,旨在为中国大陆网民提供优质内容,因此对部分内容进行改编以符合中国大陆政策,如果您不接受,可以直接访问维基百科官方网站


顶部

如果本页面有数学、化学、物理等公式未正确显示,请使用火狐或者Safari浏览器