Simula

Simula，一種編譯式的程式語言，由奧利-約翰·達爾與克利斯登·奈加特，在1960年代於挪威奧斯陸的，開發出來了Simula I與Simula 67兩代。它承繼了ALGOL 60作為基礎，被認為是第一個物件導向程式設計的程式語言。Simula 67介入了物件、類、子類、虛過程，還有協程、離散事件模擬和特徵性的垃圾收集。Simula的影響經常被低估，Smalltalk、CLU、C++、Object Pascal、Modula-3、Java和後來的很多程式語言，受到了Simula 67的啟發。BETA是Simula的現代後繼者。歷史.1957年，克利斯登·奈加特開始在的電腦上寫模擬器，為此他需要更強大的程式語言。1962年1月，奧利-約翰·達爾開始跟他合作，他們受到ALGOL 60的啟發。1962年5月，發展出第一份模擬器程式語言提議，語言取名為SIMULA，後改稱為Simula I。此時，克利斯登·奈加特受到邀請，去協助他們開發電腦。UNIVAC軟體部門的主管，力邀克利斯登·奈加特前往舉行的第二次國際會議上，發表了論文「SIMULA－擴充套件ALGOL到離散事件網路的描述」。1963年8月，購買到，在UNIVAC的合約同意下，奧利-約翰·達爾在這臺電腦上安裝以凱斯西儲 1107 ALGOL 60的編譯器來實作的Simula I。1965年1月，Simula I終於可以在UNIVAC 1107上完全的運作。Simula I在1968年被移植到了 B5500電腦，以及後來蘇聯的電腦。1965年，東尼·霍爾首次提出“記錄類”構造的概念，1966年，克利斯登·奈加特與奧利-約翰·達爾二人，將Simula I的具有“準並行”性質的“程序”，擴充套件成了具有了記錄類性質的廣義程序，隨即改稱為“物件”。1967年5月，奈加特和達爾在奧斯陸舉辦的IFIP工作小組論壇中，發表了關於類與子類宣告的論文，形成Simula 67的第一份定義檔案。1968年召開的會議，組成了SIMULA標準小組，並發表了第一份官方Simula標準檔案「SIMULA 67通用基礎語言」。在1960年代後期和1970年代早期，Simula 67主要實現於四個系統之上：的UNIVAC ，挪威計算中心的IBM System/360和，奧斯陸大學在聯合安裝的CDC ，和的DEC TOPS-10。當前的Simula 67業界標準，是在1986年修訂的“標準SIMULA”，它在1987年被接受為瑞典國家標準。它有四個主要實現：、Lund Simula、GNU Cim和Portable Simula Revisited。Simula影響了Smalltalk，和後來的面向物件程式語言。C++語言和Java語言的創始人，都認可自己受到了Simula的重要影響。語法和語義.Simula 67包含通用演算法語言ALGOL 60的多數特徵作為自己的子集，它是大小寫不敏感的。Simula 67的中心概念是物件，物件是。類是一種過程，它有能力引起在它被呼叫後仍存活的一個塊例項，而這些例項就叫做這個類的物件。為了操縱物件和相互關聯物件，語言介入了連結串列處理設施。Simula 67為了將整個程式執行組織為：物件所屬的諸“行動階段”的一個序列，而將其所必需的基本功能特徵，包含在作為“系統類”的“環境類”之中。在環境類中有被稱為“標準系統類”的模擬器類codice_1，它定義了充當系統時間軸的“定序集合”物件codice_2、程序類codice_3和事件通告類codice_4，定序集合的成員是事件通告物件，它透過其codice_5特性提及一個程序物件；事件通告表示了對應這個程序物件的下一個行動階段的一個事件，被排程在系統時間codice_6時發生。塊.塊是成序列的宣告，跟隨著成序列的語句，並被包圍在關鍵字codice_7和codice_8之間。塊自身是一種語句，在Simula 67中，它包括子塊和有字首塊，在語法上，子塊就是無字首的ALGOL 60的塊，即匿名塊和過程主體。宣告擔負定義在程式中用到的量、過程、類和外來宣告。塊中的每個語句，都可以是塊或複合語句。複合語句與塊相比在語法上沒有宣告。所有的塊，自動地介入的一個新的層級：在這個塊內出現的識別符號，可以透過合適的宣告，而被指定為區域性於所論及的這個塊；這個識別符號在這個塊裡面的所表示的實體，不存在於它的外面；這個識別符號在這個塊外面的所表示的任何實體，在這個塊裡面是不可見的；在Simula 67中，可透過連線或遠端訪問使它成為可見的。除了表示標籤的識別符號之外，一個識別符號，如果出現在一個塊中，而且並非聲明於這個塊中，則它於這個塊。因為塊中的語句自身可以是一個塊，區域性和非區域性於一個塊的概念，必須遞迴地去理解。塊是一種形式描述或模式，關乎的資料結構和關聯的演算法以及行動。當一個塊執行的時候，生成這個塊的一個動態例項。一個塊例項，可以被認為是它的形式描述的文字複本。在計算機中，一個塊例項可以採用某一種形式的記憶體區域，它包含需要的動態塊資訊，幷包括空間來持有區域性於這個塊的變數的內容。塊的任何一個內部的塊，仍然是一個模式，但是在其中出現的識別符號，標定了區域性於在字面上外在包圍的塊例項的專案。於內部的塊的識別符號繫結，對這個內部的塊的任何隨後的動態例項，保持有效。塊例項中的區域性變數，標識了分配給塊例項的記憶體片段。在進入一個塊之中的時候，任何區域性於這個塊即在其中宣告的變數，都會被初始化。區域性於一個塊的一個變數，是一個記憶體裝置，其內容依據這個變數的型別，要麼是一個值，要麼是一個引用。值型別可特徵化為直接關聯著一個可能值的集合，即這個型別的“值範圍”。引用概念，對應於一個名字或一個“指標”的直觀想法。在Simula 67中有兩種引用型別，物件引用型別和文字引用。對於值型別不關聯著引用概念。提供了引用值的機制，還反映了機器的定址可能性；在特定簡單情況下，一個引用可以被實現為一個儲存的值的記憶體地址。過程.過程與塊相比，它有一個名字，可以在程式的一些不同地方提及，並且在呼叫時可以給出引數。過程和塊都不可能建立到它或它內部的引用；對於一個給定塊，有可能生成它的一些可以共存和互動的例項，例如遞迴過程的例項。過程的引數傳送模態，除了有傳值呼叫和傳名呼叫，在Simula 67中，又增加了傳引用呼叫。過程的預設的傳送模態，在Simula 67中，對於值型別的引數是傳值呼叫，對於所有其他型別的引數是傳引用呼叫；故而在過程宣告的引數規定中，增加了以codice_10為前導的名字部份，用來指定所述及的引數採用傳名呼叫。在過程主體內傳名呼叫的形式引數的每次出現，都引起對實際引數的一次求值。在Simula 67中，這個求值發生在過程語句的上下文中，就是說不會出現識別符號衝突，因為過程主體和它的變數此時是不可見的。過程呼叫的執行，在有引數的情況下要經歷如下步驟：建立形式引數塊例項；求值對應於傳值呼叫或傳引用呼叫的實際引數，並將其結果賦值給形式引數塊例項的對應變數；過程主體被初始化並開始執行。真正於普遍型別。類與物件.類宣告定義一個程式這個模式的物件被稱為“屬於相同的類”。不同於Smalltalk 80等面向物件程式語言，Simula 67的類和後來的Modula-3的物件型別，不進行與的區分。對於一個給定物件，類宣告中形式引數、在虛擬部份中規定的虛擬量，和宣告為區域性於類主體。一個特性的宣告或規定叫做特性定義。在1986年修訂的語言標準中，透過保護規定可以限制類特性識別符號的可見性。類宣告中的形式引數，不適用傳名呼叫，這是為了保證實際引數在類所引起的物件存活期間不能消失。在規定部份中需要對每個形式引數進行規定，這些引數被當作區域性於類主體的變數。類主體通常是一個塊，即使它如語法形式所允許的那樣是塊以外的一個語句，也表現得如同一個塊。一個分裂語句。Simula 67的類主體中除了有定義特性的宣告，還可以有定義行動的語句。如果在一個類宣告中有行動定義，則符合這個模式的行動，可以由屬於這個類的所有物件執行。如果在類宣告中沒有指定行動，則定義了一類純資料結構，很多後來的面向物件程式語言就是這樣，將物件作為記錄或結構的擴充套件。例如：class Order(number); integer number;begininteger numberOfUnits, arrivalDate;real processingTime;end;屬於特定類的物件，透過物件表示式中的物件生成式codice_12來生成，並製作出到它的引用。例如，想要多少就能生成多少屬於這個codice_13類的一個新物件：new Order(103);屬於一個物件的行動，可以都在就一個過程而言的一個序列中執行。這些行動，還可以作為一系列的獨立子序列或“行動階段”來執行。在一個給定物件的兩個行動階段之間，可以出現任何數目的其他物件的行動階段。子類與類串接.一個類可以被用作到另一個類宣告的“字首”，從而將字首所定義的性質，建造入這個新的類宣告定義的物件之中。具有字首類codice_14和類識別符號codice_15的一個類宣告，定義了類codice_14的一個子類codice_15。屬於子類codice_15的物件，由自身是類codice_14的物件的“字首部份”，和類codice_15的類宣告主體所描述的“主體部份”組成。這兩部份串接而形成了一個複合物件，它可以用串接成的類宣告來正式的描述，串接的過程被認為先於程式執行而發生。類只能在定義它的塊層級中用作字首。字首類自身也可以有字首。類不能出現在自己的字首序列中。子類被稱為內部於子類，但不可將子類稱為字首類的內部類。這不同於後來的面向物件程式語言中的稱謂：“派生類”擴充套件“基礎類”，或“子類”繼承“超類”。例如：Order class SingleOrder;beginreal setupTime, finishingTime, weight;end;SingleOrder class Plate;beginreal le​ngth, width;end;屬於codice_13類的子類如codice_22類和codice_23類的新物件，都含有codice_13類定義的資料，再加上在各種類宣告中定義的補充資料。例如，屬於codice_23類的物件含有codice_13類、codice_22類和codice_23類定義的所有資料。一個識別符號在一個塊中的出現，如果並未處在遠端識別符號之中或在有重新定義的內部的塊之中，則被稱為“未託付”出現。對於子類的宣告及其字首類串接成的類宣告，在區域性於子類的特性識別符號，和區域性於其字首類的特性識別符號，二者的未託付出現之間的可能衝突，將憑藉對涉及到的區域性於子類的特性識別符號的適合的系統性變更來避免，但是對應虛擬量的識別符號不變更。對於字首類和子類宣告串接成的類宣告，它的形式引數列表，由字首類的形式引數列表，和附加的子類宣告的引數列表二者合併而成。它的值部份、規定部份和虛擬部份，是字首類和子類宣告相應各部份的並集。結果的虛擬部份不能包含某個識別符號的多於一次出現。對於類主體，最初的codice_7和隨後的宣告被稱為“塊頭部”，從第一個可執行語句直到codice_11之前的語句被稱為“初始運算”，在codice_11之後的語句和最終的codice_8被稱為“複合尾部”。如果字首類主體是分裂主體，用字首類的塊頭部複本替代子類的塊頭部中的codice_7，將字首類的初始運算複本插入到子類的塊頭部之後，用字首類的複合尾部複本替代子類的複合尾部中的codice_8。如果字首類主體不是分裂主體，它被解釋為如同將codice_35插入到最終的codice_8之前。設codice_37是具有字首序列codice_38的一個類，這裡類codice_39 codice_40的下標codice_41叫做字首層級，codice_42是屬於類codice_37的一個物件，則codice_42是一個複合物件；非正式的說，串接機制有如下結果：用作字首的系統類，與其字首鏈的所有的類一起，被當作聲明於最小的包圍其字面上出現的塊中。因此重新宣告可以出現在一個程式的內部的塊層級中。有字首塊的一個例項，是由塊字首生成的一個單一的物件，與這個主體塊的例項，串接而成一個複合物件，其串接定義採用類似於類的串接規則。塊字首的類的形式引數，按塊字首的實際引數所示初始化。對有字首塊有兩個限制：一個類如果在其中透過使用codice_72來引用類自身，則它作為塊字首是非法的。塊字首的類識別符號所提及的類，必須區域性於最小的包圍這個有字首塊的塊。物件引用.當屬於各種類的很多物件，作為同一個程式的各個部份而共存的時候，需要能夠對個體物件指定名字，為此介入了叫做“引用”的新的基本型別；還要能相互關聯物件，比如透過二叉樹和各種其他型別的列表結構。Simula 67將迴圈雙向連結串列叫做“集合”，它將集合類codice_73作為“標準系統類”介入為環境類的一部份。對於某個類的一個物件，有一個唯一的關聯的“物件引用”標定這個物件，並且對於任何類codice_14，都有一個關聯的物件引用型別codice_75。這種型別的量，被稱為由類codice_14限定；它的值，要麼是一個物件，要麼是表示“沒有物件”的特殊值codice_77。限定將值的範圍，限制至包括在限定類中的這些類的物件。不管何種限定，值的範圍都包括值codice_77。一個物件引用的限定，是一個類識別符號，它因此服從宣告的作用域和規則。限定關聯於所提及的類宣告所區域性於的那個塊的一個例項。這蘊涵著特定的關於限定有效性的檢查，不能單獨在程式正文的基礎上進行，因此這種測試必須在程式執行期間完成。引用是有限定的，蘊涵著一個給定引用所提及的物件，只能屬於這個限定中提到的類，或屬於這個限定類的子類。如果一個物件引用型別的限定，是另一個物件引用型別的限定類的子類，則前者被稱為從屬於後者。例如：ref(Order) next, previous;物件表示式是獲得對一個物件的引用的一種規則。物件表示式的值，是被引用的物件或codice_77。運算子codice_80讀作“指稱”到處在“引用指派符”左側的引用型別的變數或過程識別符號。例如：next :- new Plate(50);previous :- next;next :- none;而運算子codice_81讀作“成為”。遠端訪問.一個物件的一個特定特性，由下列三項資訊來完全標定：對於任何特性標定，第二項類資訊都是在字面上定義的，從而形成靜態繫結。屬於其他物件的特性，可以要麼單個的透過“遠端識別符號”機制，從其外面“遠端訪問”來引用和使用。遠端識別符號的形式為：codice_82，它可用作簡單變數、陣列變數、函式指定式和過程語句中的識別符號，這種點表示法給出對資訊的單獨片段的訪問，例如：if next.number &gt;= previous.number then ……;它將名為codice_83的類codice_13的物件的特性codice_85，比較於名為codice_86的類codice_13的物件的特性codice_85。“成組訪問”可透過連線語句codice_89來完成，例如：inspect next when Plate do begin …… end;inspect new Plate(50) do begin …… end;在這裡的codice_7和codice_8之間的語句中，codice_83引用的物件所屬的codice_23類的所有資訊片段，都可以直接提及。在codice_94後面的語句，如果是塊以外的一個語句，它表現得也如同一個塊。連線語句進而表現得如同被叫做“連線塊”的第二個虛構的塊所包圍。連線機制的用途，是為在連線塊中的特定特性標定，提供物件資訊和在codice_95子句中的類資訊的隱式定義。設物件表示式求值為codice_42，在連線塊執行期間，稱物件codice_42為“被連線上”了。連線塊有一個關聯的“塊限定”，如果連線塊有codice_95子句，它是前面的類識別符號，如果沒有codice_95子句，它是前面的物件表示式的限定。虛過程.虛擬量，是在類宣告中由codice_100前導的量，它有雙重用途：不同於一般的特性標定，虛過程形成“半動態繫結”，在某種意義上是類似傳名呼叫的機制。這種機制不同於Smalltalk 80等面向物件程式語言中，上溯子類至超類的繼承鏈來找到最近的方法實現的那種動態繫結。一個物件的一個虛擬量，要麼是“無匹配的”的，要麼被標定為具有一個“匹配”特性，它是在這個虛擬量的字首層級上或在內部字首層級上宣告的，其識別符號於虛擬量的識別符號的一個特性。匹配特性必須與虛擬特性有相同的種類。在一個給定字首層級上的匹配量的型別，必須重合或從屬於這個虛擬規定的型別，和在任何外部字首層級上宣告的任何匹配量的型別。在1986年修訂的語言標準中，虛過程量可選的可使用codice_101方式來指定，即憑藉它的型別，並且如果它有形式引數，則還憑藉它們的型別、種類和傳送模態。含有過程規定codice_102的虛過程量，只能由有相同型別的過程來匹配，並它與這個過程規定具有相同的過程頭部。例如，下面實現散列表的codice_103類，聲明瞭整數型別的虛過程codice_104並隨即實現了它，又定義了要用到這個雜湊函式codice_104的查詢過程codice_106:class HashTable(n); integer n;virtual: integer procedure hash;begininteger procedure hash(t); text t;beginend hash;text array table(0 : n-1); ……integer procedure lookup(t, old);name old; Boolean old; text t;begininteger i, istart; Boolean entered;i := istart := hash(t);while not entered dobeginend;lookup := i;end lookup;end HashTable;HashTable class ALGOL_hashing;begininteger procedure hash(t); text t;beginend hash;end ALGOL_hashing;作為子類的codice_107類和以codice_103類為字首的有字首塊，可以用自己的codice_104過程實現，替代在codice_103類中的實現。在子類的類主體和有字首塊的主體塊中，能獲得到過程codice_106，而它用到的過程codice_104是這裡提供的替代實現。物件表示式.物件，具有型別codice_113。物件表示式的限定規則包括：物件生成式。物件生成式，這裡標定了類codice_14，它涉及到屬於類codice_14的物件的生成和執行。這個物件是類codice_14的一個新例項。物件生成式的求值構成自如下行動：區域性物件，這裡的codice_14是類識別符號。如果用在類codice_14或codice_14的任何子類的類主體中，或用在其塊限定為類codice_14或codice_14的一個子類的連線塊中，則這個物件表示式是有效的。在一個給定的上下文中，一個區域性物件的值，是一個物件或連線到一個物件，它是這個物件表示式在其中有效的、最小的在字面上外在包圍的塊例項；如果沒有這樣的塊，則這個物件表示式在這個上下文中是非法的。對於一個過程或類主體的例項意為包含它的宣告。暫瞬限定codice_128，這裡的codice_42表示一個簡單的引用表示式，而codice_14是類識別符號。設類codice_15是物件codice_42的限定，對於限定物件codice_128，如果類codice_14外部於或等於類codice_15，或者是codice_15的一個子類，則這個物件表示式是合法的，否則是為非法。如果codice_42的值是codice_77，或者是屬於外部於codice_14的類的一個物件，則這個物件表示式求值形成一個執行時間錯誤；在其他情況下，codice_128的值，就是codice_42的值。對一個串接的類物件的暫瞬限定，限制或擴充套件它的特性透過檢視或遠端訪問的可見性。物件關係表示式，使用運算子codice_142和codice_143，來測試一個物件的類成員關係。關係，在codice_42引用的是屬於類codice_14的物件之時，值為codice_146，否則值為codice_147。關係，在codice_42引用的是屬於類codice_14的物件，或者codice_42是內部於類codice_14的類之時，值為codice_146，否則值為codice_147。不同於算術關係表示式使用比較運算子codice_154和codice_155，物件引用關係表示式，使用比較運算子codice_156和codice_157，來比較引用，從而區別於對應的被引用的值。兩個物件引用codice_42和codice_159，在它們都引用相同的物件，或者它們都是codice_77之時，被稱為是“”的。關係codice_161，在這種情況下擁有的值為codice_146，否則值為codice_147。關係codice_164的值，是codice_161的值的否定。作用域和可見性.不同於ALGOL 60規定了量的作用域與，在Simula 67中，一個識別符號定義及其關聯的識別符號，在其作用域與可見性之間需要做出區別。一個識別符號定義的區域性塊，是在字面上最近的包圍塊，即子塊、字首塊、過程主體或類主體，還包括圍繞codice_166語句的受控語句、過程宣告、類宣告和連線塊等的虛構塊。這個識別符號和它的定義，被稱為區域性於這個塊。識別符號定義，只在它們的作用域內是可見的。一個特定定義的可見性，在它的作用域內可以受到下列限制：一個識別符號的重新定義，不允許出現在它的區域性塊的頭部，這禁止了在同一個塊中出現相同識別符號的兩個定義。塊例項.一個的各個組成部份，都是塊即子塊、有字首塊、連線塊和類主體的動態例項。一個塊例項，被稱為“區域性於”直接包含它的描述文字的那個塊例項。例如一個給定類的例項，區域性於包含這個類宣告的塊例項。最外層塊的例項不區域性於塊例項。在任何時間，“程式順序控制”，首字母簡寫為PSC，參照在一個塊例項中當前被執行的程式點；形象的說，PSC“定位”至這個程式點，並被這個塊例項所“包含”。進入任何塊，都涉及到生成這個塊的一個例項，於是PSC進入這個塊例項，到達它的第一個可執行語句上。一個塊例項在任何時間，都是處在四種執行之一：系附的類，它只有一個特性即codice_121過程，因此所有類物件或有字首塊的例項，都擁有codice_121過程。在環境類codice_173中，還定義了用於排程的codice_174過程和codice_175過程。每當一個塊例項不復存在，區域性於或系附於它的所有塊例項也不復存在。一個物件的動態作用域，因而受限於它的類宣告的作用域。在Simula 67最初標準中曾提到過，語言實現可以使用垃圾回收技術，來進一步縮減一個物件的有效壽命的跨度。一個數組宣告的動態作用域，可以擴充套件超出包含這個宣告的塊例項的作用域，因為傳引用呼叫引數傳送模態適用於陣列。準並行系統.一個準並行系統，由“構件”這個構件的那個塊例項，叫做“構件頭領”。在每個系統中，構件中總是有一個被稱呼為“主構件”，在Simula 67最初標準中它叫做“主程式”，其他構件叫做“物件構件”。構件的定序，由codice_121、codice_174和codice_175過程支配。codice_121過程針對隱式指定的一個物件進行操作，而codice_174和codice_175過程顯式指定所操作的物件。一個準並行系統，由包含區域性的類宣告的一個子塊或有字首塊的任何例項所標定。標定了一個系統的塊例項，叫做“系統頭領”。一個系統的主構件的頭領於系統頭領。最外層的標定了一個系統的塊例項，被稱為“最外層系統”。一個系統的主構件的頭領，總是處在系附狀態。一個系統的物件構件的頭領，確切的就是區域性於系統頭領的那些脫離狀態的或恢復狀態的物件。在任何時間，在一個系統的構件之中，有確切的一個構件被稱為“生效”時，要在它那裡繼續執行的程式點。一個物件構件是生效的，當且僅當這個構件的頭領處在恢復狀態。稱謂一個塊例項codice_191被一個塊例項codice_42“動態包圍”，當且僅當存在一個塊例項序列：codice_193 codice_194，使得對於codice_195有著：codice_196系附到codice_197；或者codice_196是一個恢復狀態的物件，它關聯的系統頭領系附到codice_197。終止狀態和脫離狀態的物件，不被除了自身之外的塊例項動態包圍。將當前包含PSC的塊例項動態包圍起來的塊例項鏈，叫做“執行鏈”。在執行鏈上的塊例項，被稱為是“執行”的，最外層的塊例項總是執行的。一個構件只要其頭領是執行的它就是執行的。一個系統如果有一個構件是執行的，它就是執行的；在任何時間，一個系統最多有一個構件是執行的；執行的系統的頭領，可以是不執行的。一個執行的構件總是生效的；如果一個系統的生效構件是不執行的，則這個系統也是不執行的。在不執行的系統中的生效的構件，是當這個系統成為不執行的時候在執行的構件，當這個系統再次成為執行的時候它將仍是執行的。對於一個不生效的構件codice_14，設它的頭領是codice_42，如果一個塊例項codice_191包含了它的重新啟用點，則codice_191被codice_42動態包圍，並且codice_191除了自身之外不動態包圍塊例項。由構件頭領codice_42動態包圍的這個塊例項序列，被稱為構件codice_14的“重新啟用鏈”。除了codice_42之外，這個鏈上的所有構件頭領，標定了生效而不執行的構件。在構件codice_14成為執行的時候，在它的重新啟用鏈上所有塊也成為執行的。除了系統構件，程式執行還可以包含不屬於特定系統的“獨立物件構件”。任何這種構件的頭領，都是一個脫離狀態的物件，它區域性於一個類物件或一個過程主體例項，也就是說不區域性於某個系統頭領。根據定義，獨立構件總是不生效的，只能對它執行codice_174過程。協程和生成器.準並行系統的codice_121/codice_175機制，是一種協程。在Simula 67最初標準中，沒有恢復狀態，並且沒有規定codice_174過程，但codice_174過程通常會出現在當時的語言實現中。codice_121/codice_174機制，相當於現在稱為生成器的“半協程”，而最初標準中的codice_175過程可理解為codice_121過程與codice_174過程的組合。1986年修訂的語言標準，增補定義了codice_174過程，新增了恢復狀態，並且重新定義了codice_175過程，它不可再理解為codice_121過程與codice_174過程的組合。準並行系統，被創建於進入包含區域性的類宣告的一個子塊或有字首塊的時候，藉此生成的例項成為這個新系統的頭領。初始時，這個主構件是生效的，並且是這個系統唯一的構件。建立一個物件構件，要透過針對一個系附狀態的物件，執行codice_121過程，藉此PSC返回到這個物件系附到的那個塊例項。這個物件進入脫離狀態，併成為一個新的不生效的構件的頭領，這個構件的重新啟用點被定位到緊後於這個codice_121過程呼叫。如果這個物件區域性於一個系統頭領，則這個新的構件成為這個關聯的系統的成員。透過codice_121和codice_174過程，可以形成“半對稱定序”，這隻涉及到物件構件，而不區分它們是屬於系統的構件還是獨立的構件。透過codice_121和codice_175過程，可以形成“對稱構件定序”，這隻涉及到屬於一個準並行系統的那些構件。對立於半對稱定序中的“呼叫者”與它的“被呼叫者”，在對稱構件定序中的“恢復者”與它的“被恢復者”，具有完全的對稱聯絡。PSC經過一個類物件的最終codice_8的效果，除了使這個物件成為終止狀態，而非脫離狀態之外，相同於針對這個物件執行codice_121過程的效果。其結果是它不會得到重新啟用點，並且在它已經擁有作為構件頭領的狀態時，失去這種狀態。程式範例.Hello, World!Simula 67下的經典Hello, World!範例：beginouttext("Hello, World!");outimage;end;codice_238過程將字串輸出到緩衝區，而codice_239過程將緩衝區內容輸出到標準檔案，二者都定義在輸出檔案類codice_240中，而它是檔案類codice_241的子類。二叉樹.下面例子中的codice_242類，是二叉樹資料結構實現：class Tree(va​l); integer va​l;beginref(Tree) left, right;procedure insert(x); integer x;beginif x &lt; va​l thenbeginif left == none thenleft :- new Tree(x)elseleft.insert(x)endelse if right == none thenright :- new Tree(x)elseright.insert(x);end ins​ert;ref(Tree) procedure find(x); integer x;beginif x = va​l thenthis Treeelse if x &lt; va​l then(if left == none thennoneelseleft.find(x))else if right == none thennoneelseright.find(x);end find;end Tree;在codice_243過程的主體中出現了表示式，它產生的值所引用的是當前節點。這裡透過函式指定式codice_244，來呼叫物件codice_42的codice_243過程，如果codice_247，則這個函式的結果是到codice_42自身的引用值。協程.Simula 67標準透過如下例項來詮釋叫做“準並行系統”的協程機制：begin comment 系統S1;ref(C1) X1;class C1;beginprocedure P1;detach;P1end C1;ref(C2) X2;class C2;beginprocedure P2;begindetach;! 可嘗試detach或resume(X1);end P2;begin comment 系統S2;ref(C3) X3;class C3;begindetach;P2end C3;X3 :- new C3;resume(X3)end S2end C2;X1 :- new C1;X2 :- new C2;call(X2); ! 可嘗試resume(X2);end S1;這個例子程式中，有兩個準並行系統codice_249和codice_250。系統codice_249是對應最外層子塊的最外層系統，它包含了兩個類宣告codice_252和codice_253。系統codice_250對應於類codice_253的類主體中的匿名塊，它包含了一個類宣告codice_256。在PSC進入最外層子塊開始處，產生系統codice_249的系統頭領，到達第28行的系統codice_249主構件的第一個可執行語句，開始生成物件codice_259，進入類codice_252，PSC到達第7行的類主體的第一個可執行語句，呼叫了類codice_252的特性過程codice_262，進入第6行的過程體的第一個可執行語句，這時的狀況是：[S1] ← (X1) ← (P1) ← PSC這裡方括號表示系統頭領，圓括號表示其他種類的塊例項，左向箭頭表示系附，使用粗體表示這個塊例項執行了物件生成式。執行第6行的codice_121語句後，物件構件頭領codice_259進入脫離狀態，儲存codice_259的重新啟用點為第6行codice_262過程體結束，回溯到第28行物件產生式結束，系統codice_249的物件codice_259生成完畢，這時的情況是：[S1] ← PSC(X1) ← (P1) ←這裡的豎槓將物件構件頭領列為一個系統的成員。PSC到達系統codice_249主構件第29行，開始生成物件codice_270，進入類codice_253，PSC到達第17行的類主體中匿名塊開始處，進入這個子塊產生系統codice_250的系統頭領，PSC到達第24行的系統codice_250主構件的第一個可執行語句，開始生成物件codice_274，進入類codice_256，PSC到達第20行類主體開始處，這時的情況是：[S1] ← (X2) ← [S2] ← (X3) ← PSC(X1) ← (P1) ←執行第21行類主體的第一個可執行語句codice_121後，物件構件頭領codice_274進入脫離狀態，儲存codice_274的重新啟用點為第22行，回溯到第24行物件產生式結束，系統codice_250的物件codice_274生成完畢，這時的情況是：[S1] ← (X2) ← [S2] ← PSC| (X3) ←(X1) ← (P1) ←PSC到達系統codice_250主構件的第25行，執行codice_282語句後，儲存系統codice_250主構件的重新啟用點為第26行，物件構件頭領codice_274進入恢復狀態，PSC恢復到第22行的物件codice_274的類主體之中，這時的情況是：[S1] ← (X2) ← [S2] ←| (X3) ← PSC(X1) ← (P1) ←這裡的下劃線指示這個塊例項處在恢復狀態。執行第22行的類codice_253的特性過程codice_287，到達在第14行的過程體的第一個可執行語句，這時的情況如下，並標記為“狀況A”：! 狀況A ;[S1] ← (X2) ← [S2] ←| (X3) ← (P2) ← PSC(X1) ← (P1) ←執行在第14行codice_287過程體的codice_121語句後，物件構件頭領codice_270進入脫離狀態，儲存codice_270的重新啟用點為第15行，回溯到第29行物件產生式結束，系統codice_249的物件codice_270生成完畢，這時的情況如下，並標記為“狀況B”：！狀況B ;[S1] ← PSC(X1) ← (P1) ←(X2) ← [S2] ←(X3) ← (P2) ←注意物件codice_274仍是系統codice_250的生效構件，它並沒有自己的重新啟用點。序列codice_296是codice_270的重新啟用鏈，這裡的codice_274是恢復狀態，而它的系統頭領codice_250系附到了codice_270。PSC進入系統codice_249主構件第30行，執行codice_302語句後，物件構件頭領codice_270進入系附狀態，PSC恢復為第15行的codice_287過程體之中，這時的情況重現為前面的“狀況A”。如果將系統codice_249主構件中第30行改寫為一個codice_307，執行後物件構件頭領codice_270進入恢復狀態，儲存系統codice_249主構件的重新啟用點為第31行，PSC恢復為第15行的codice_287過程體之中，會出現如下情況：[S1] ←(X1) ← (P1) ←(X2) ← [S2] ←(X3) ← (P2) ← PSC序列codice_296是codice_270的執行鏈。如果將codice_287過程體中第15行的註釋替換為一個codice_121語句，執行後物件構件頭領codice_270進入脫離狀態，儲存codice_270的重新啟用點是第16行，PSC恢復到第31行的系統codice_249主構件之中，這時的情況重現為前面的“狀況B”。如果將codice_287中第15行的註釋替換為一個codice_319語句，執行後物件構件頭領codice_270進入脫離狀態，物件構件頭領codice_259進入恢復狀態，儲存codice_270的重新啟用點為第16行，PSC恢復到第6行的codice_262過程體的過程結束，會出現如下情況：[S1] ←(X1) ← (P1) ← PSC(X2) ← [S2] ←(X3) ← (P2) ←抽象類.下面例子中，定義了一個字形類codice_324，它是抽象基礎類，並且有二個實現子類：字元類codice_325和類codice_326：beginclass Glyph;virtual: procedure print is procedure print;beginend;Glyph class Ch​ar(c);character c;beginprocedure print;outchar(c);end;Glyph class Line(cs);ref(Glyph) array cs;beginprocedure print;begininteger i;for i := 1 step 1 until upperbound(cs, 1) docs(i).print;outimage;end;end;ref(Glyph) rg;ref(Glyph) array rgs(1 : 4);rgs(1) :- new Ch​ar('A');rgs(2) :- new Ch​ar('b');rgs(3) :- new Ch​ar('b');rgs(4) :- new Ch​ar('a');rg :- new Line(rgs);rg.print;end;這裡的虛過程量codice_327具有過程規定codice_328，它匹配既沒有形式引數也沒有結果值的codice_327過程，如果不加以這種過程規定，則它可以匹配具有任何形式引數和任何結果值的codice_327過程。在Simula 67中，沒有不可以例項化帶有純虛過程類的特定限制，因而缺乏真正的抽象類的概念，所有類都可以被例項化，但是呼叫純虛過程會產生執行時間。模擬器.在下面的離散事件模擬例子中，Sam、Sally和Andy正在逛商店買衣服，他們必須共享一個試衣間。他們每人只能瀏覽商店大約12分鐘，並接著獨佔的使用試衣間大約3分鐘，每個行動都服從正態分佈，他們的試衣間經歷被模擬如下：Simulationbeginclass FittingRoom;beginref(Head) door;Boolean inUse;procedure request;beginif inUse thenbeginwait(door);door.first.out;end;inUse := true;end;procedure leave;begininUse := false;activate door.first;end;door :- new Head;end;procedure report(message); text message;beginoutfix(ti​me, 2, 0);outtext(": " &amp; message);outimage;end;Process class Person(pname); text pname;beginwhile true dobeginhold(normal(12, 4, u));report(pname &amp; " 要求用試衣間");fittingroom1.request;report(pname &amp; " 已進入試衣間");hold(Normal(3, 1, u));fittingroom1.leave;report(pname &amp; " 已離開試衣間");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;主程式是字首著模擬器類codice_1的有字首塊。模擬器類可在任何塊上使用，而且模擬器甚至可以巢狀，比如在模擬某人做模擬的時候。時間過程codice_332、等待過程codice_333、保持過程codice_334和啟用過程codice_335，定義在codice_1類之中。程序類codice_3是codice_1類的巢狀類。啟用語句codice_339，只有處在codice_1類所包含的類的物件之中，或處在其字首部份是這種物件的有字首塊之中，才是有效的。啟用語句的作用，被定義為得到呼叫啟用過程codice_335的那種效果。集合類codice_73是codice_1類的字首類，其中定義了三個巢狀類：表示集合整體的codice_344類，表示集合元素的codice_345類，和二者的字首類連結串列類codice_346。首位過程codice_347，定義在codice_344類中；退出過程codice_349和在等待過程codice_333中用到的進入過程codice_351，定義在codice_345類中。在試衣間類codice_353中，為了讓人們排隊等待訪問試衣間，使用了門物件codice_354，它是佇列類即codice_344類的一個物件。試衣間類定義了兩個過程：要求過程codice_356：如果試衣間中正有人使用，則他必須等待於門佇列之中，即codice_357；當他可以使用試衣間之時，相應的從門佇列中移除自己，即codice_358。離開過程codice_359：如果門佇列中有人等待的話，放行其中第一個人，即codice_360。個人類codice_361是codice_3類的子類，它的行動是瀏覽商店和在試衣間試衣，使用保持過程codice_334來描述其所用時間，並呼叫對應的試衣間物件的過程來要求和離開試衣間。正態分佈的隨機抽籤過程codice_364，定義在環境類codice_173中，它的最後的引數，必須是指定一個偽隨機數串流的一個整數。主程式是程序類codice_3的子類codice_367類的物件。它建立codice_353類的例項codice_369物件，接著建立並激活codice_361類的三個物件，從而將他們三人放置入事件佇列之中，主程式在終止前保持100分鐘的模擬時間。