Simula,一種編譯式程式語言,在1960年代在奧斯陸挪威電子計算中心(Norwegian Computing Center)開始被發展出來,主要的設計者是奧利-約翰·達爾(Ole-Johan Dahl)與克利斯登·奈加特。開發出了Simula I與Simula 67兩代。它承繼了ALGOL 60的基礎[2]:1.3.1,被認為是第一個物件導向程式設計的程式語言。

Simula
Simula - logo.svg
编程范型多范式: 过程式, 指令式, 结构化, 物件導向
設計者奧利-約翰·達爾
實作者克利斯登·奈加特
发行时间1962年,​58年前​(1962
穩定版本
Simula 67, Simula I
型態系統静态名称式
實作語言ALGOL 60 (主要,一些成份来自Simscript)
作業系統类Unix系统Windows
網站http://www.simula67.info/
啟發語言
ALGOL 60, Simscript[1]
影響語言
物件導向程式設計

Simula 67介入了对象[2]:2, 5.3[2]:1.3.3, 2继承子类[2]:2.2.1虚过程[2]:2.2.3,还有协程[2]:9.2离散事件模拟[2]:14.2垃圾收集特征[2]:9.1。Simula影響了Smalltalk以及接下來所有的物件導向程式設計程式語言,計算機科學家如設計C++語言的比雅尼·斯特劳斯特鲁普,和設計Java語言的詹姆斯·高斯林,都認可自己受到了Simula的重要影響[3]

歷史编辑

克利斯登·奈加特在1957年開始在自己的電腦上寫模擬器。為了發展他的模擬器,他需要更強大的程式語言。1962年1月,奧利-約翰·達爾開始跟他合作。他們受到ALGOL 60的啟發,在同年5月,發展出第一個模擬器程式語言,取名為Simula I。此時,克利斯登·奈加特受到UNIVAC邀請,去協助他們開發UNIVAC 1107電腦。他向UNIVAC軟體部門的主管,鮑伯·貝莫(Bob Bemer),展示了Simula的想法。鮑伯·貝莫是ALGOL忠實的支持者,他看出Simula計劃的潛力。鮑伯·貝莫同時負責主辦國際資訊處理協會(IFIP)所舉行的第二次國際會議,他力邀克利斯登·奈加特前往發表論文,論文主題是「SIMULA-擴展ALGOL到離散事件網路的描述」(SIMULA—An Extension of ALGOL to the Description of Discrete-Event Networks)。

1963年8月,挪威電子計算中心以優惠價格購買到UNIVAC 1107,在UNIVAC的合約同意下,奧利-約翰·達爾在這台電腦上安裝了Simula I。它是以ALGOL 60的編譯器來實作的。1965年1月,Simula I終於可以在UNIVAC 1107上完全的運作。接下來幾年,克利斯登·奈加特奧利-約翰·達爾致力於教授Simula I。Simula I也被移植到Burroughs B5500電腦,以及蘇俄的URAL-16電腦上。

1965年,東尼·霍爾首次提出記錄類別構造的概念[4],1966年,克利斯登·奈加特奧利-約翰·達爾给它擴展了加前綴(prefixing)的概念和滿足通用的進程概念所需要的其他特徵,他們所稱的進程後來稱為物件[5]。1967年5月,奈加特和達爾在奧斯陸舉辦的IFIP工作小組論壇中,發表了關於類別繼承聲明的論文,形成Simula 67的第一份定義文件[6]

1968年召開的會議,則組成了SIMULA標準小組(SIMULA Standards Group, SSG),發表了第一份官方Simula標準文件[2]

程式範例编辑

最小的程序编辑

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

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

 Begin
 End;

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

经典Hello world编辑

Simula的Hello World範例:

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

Simula是大小写敏感的。

传名调用编辑

Simula支持传名调用[2]: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);

类、子类和虚过程编辑

一个更现实的例子,使用了类[2]:1.3.3, 2、子类[2]:2.2.1和虚过程[2]: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包括了一个模拟器[2]:14.2,用于做离散事件模拟。这个模拟器包是基于了Simula的面向对象特征和它的协程概念[2]: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. 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]. 
  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. 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. 

来源编辑

延伸阅读编辑

外部链接编辑