Simulaは、 1960年代にオスロのノルウェー・コンピューティング・センターでOle-Johan DahlとKristen Nygaardによって開発された、 2つのシミュレーション・プログラミング言語、Simula IとSimula 67の名称である。構文的には、 ALGOL 60 [1] : 1.3.1 の近似スーパーセットであり、 SIMSCRIPT [2] [3] の設計にも影響を受けている。
Simula 67では 、オブジェクト[1] :2、5.3、 クラス[ 1] :1.3.3、 継承、サブクラス[1] :2.2.3 、ポリモーフィズムの実装[1]:1.3.3 、仮想プロシージャ[1] : 2.2.3、 コルーチン[ 1] :9.2、離散イベントシミュレーション[1]:14.2 、ガベージコレクション[ 1 ] : 9.1が 導入 されました。サブクラスの継承以外のサブタイプの他の形式は、Simula派生版で導入されました。 [引用が必要]
Simulaは最初のオブジェクト指向プログラミング言語と考えられています。その名前が示すように、1962年の最初のSimulaバージョンはシミュレーションを行うために設計されました。一方、Simula 67は汎用プログラミング言語として設計され[4]、今日のオブジェクト指向言語の多くの機能の枠組みを提供しました。
Simula は、超大規模集積回路(VLSI) 設計、プロセス モデリング、通信プロトコル、アルゴリズムのシミュレーションや、タイプセッティング、コンピュータ グラフィックス、教育などの幅広いアプリケーションで使用されています。
C++の生みの親であるビャーネ・ストラウストルップやJavaの生みの親であるジェームズ・ゴスリングなどのコンピュータ科学者は、Simulaが大きな影響を与えたことを認めています。[5] Simulaタイプのオブジェクトは、C++、Object Pascal、Java、C#、その他多くの言語で再実装されています。
以下の記述はヤン・ルーネ・ホルメヴィクの歴史エッセイに基づいています。[6] [7] [8] [9]
クリステン・ナイガードは1957年にコンピュータシミュレーションプログラムの開発を始めました。ナイガードは、システムの異質性と動作を記述するためのより優れた方法の必要性を感じていました。システムを記述するためのコンピュータ言語のアイデアをさらに発展させるには、自分よりも優れたコンピュータプログラミングスキルを持つ人材が必要だと気づきました。1962年1月、オーレ・ヨハン・ダールが彼の研究に加わりました。その後まもなく、この言語をALGOL 60にリンクさせることが決定されました。1962年5月までに、シミュレーション言語の主要な概念が確立され、離散事象システムのシミュレーションに特化したプログラミング言語、 SIMULA Iが誕生しました。
1962年5月下旬、クリステン・ナイガードは、エッカート・モークリー・コンピュータ社(Eckert–Mauchly Computer Corporation)の新製品UNIVAC 1107コンピュータのマーケティングのため、同社を訪問するよう招待されました。訪問中、ナイガードはUnivacのシステムプログラミングディレクターであるロバート・ベマーにSimulaのアイデアを紹介しました。ベマーはALGOLの大ファンで、Simulaプロジェクトに強い関心を抱いていました。ベマーは国際情報処理連盟(IFIP)主催の第2回情報処理国際会議のセッション議長も務めていました。ベマーはナイガードを招待し、ナイガードは「SIMULA - 離散事象ネットワーク記述のためのALGOLの拡張」という論文を発表しました。
1963年8月、ノルウェー計算センターはUNIVAC 1107を大幅な割引価格で入手し、ダールはUNIVACとの契約に基づき、このマシンにSIMULA Iを実装しました。この実装はUNIVAC ALGOL 60コンパイラをベースにしており、SIMULA Iは1965年1月までにUNIVAC 1107上で完全に動作可能になりました。その後数年間、ダールとナイガードはSimulaの教育に多くの時間を費やしました。Simulaは世界各国に普及し、後にBurroughs B5500やロシアのUral-16など、他のコンピュータにもSIMULA Iが実装されました。
1966年、CAR Hoareはレコードクラス構造の概念を導入し、DahlとNygaardはこれをプレフィックスの概念やその他の機能で拡張し、一般化されたプロセス概念の要件を満たしました。DahlとNygaardは、 1967年5月にオスロで開催されたシミュレーション言語に関するIFIPワーキング会議で、クラスとサブクラスの宣言に関する論文を発表しました。この論文は、Simula 67の最初の正式な定義となりました。1967年6月、言語を標準化し、いくつかの実装を開始するための会議が開催されました。Dahlは、型とクラスの概念を統合することを提案しました。これは真剣な議論につながり、提案は委員会によって却下されました。Simula 67は、1968年2月に開催されたSimula標準化グループ(SSG)の最初の会議で正式に標準化されました。

SimulaはSmalltalk、そしてその後のオブジェクト指向プログラミング言語の開発に影響を与えました。また、Simulaはコルーチンのみをサポートしており、真の並行性はサポートしていませんが、並行計算のアクターモデルにも影響を与えました。[10]
60 年代後半から 70 年代前半にかけて、Simula の主な実装は次の 4 つでした。
これらの実装は幅広いプラットフォームに移植されました。TOPS -10は、パブリック、プロテクト、プライベートのメンバー変数とプロシージャの概念を実装し、これは後に1986年にSimula Standardに統合されました。
Simula Standard 1986は最新の標準であり、幅広いプラットフォームに移植されています。主に4つの実装があります。
2001年11月、ダールとナイガードは「SIMULA 67の設計と実装を通じてオブジェクト指向プログラミングの基礎となる概念を導入した」として、電気電子学会( IEEE)からIEEEジョン・フォン・ノイマン・メダルを受賞した。2002年4月には、計算機協会(ACM)から「プログラミング言語Simula IとSimula 67の設計を通じて、オブジェクト指向プログラミングの出現に基礎となるアイデアを提供した」として2001年AMチューリング賞を受賞した。ダールとナイガードは、それぞれ同年6月と8月に[13]シアトルで2002年11月に開催されるOOPSLAカンファレンスで予定されていたACMチューリング賞講演[14]を前に亡くなった。
Simula 研究研究所はSimula 言語にちなんで名付けられた研究機関であり、Nygaard は 2001 年の開設当初からそこで非常勤の職に就いていました。オスロ大学の新しいコンピュータ サイエンスの建物は、ダールに敬意を表して Ole Johan Dahl の家と名付けられ、メイン講堂は Simula と名付けられました。
空のコンピュータファイルは、Simulaにおける最小のプログラムであり、ソースコードのサイズで測定されます。これはダミーステートメント1つだけで構成されています。
ただし、最小限のプログラムは空のブロックとして表現する方が便利です。
開始 終了;
実行を開始するとすぐに終了します。この言語にはプログラムからの 戻り値がありません。
Simula の Hello world プログラムの例:
Begin
OutText ("Hello, World!");
Outimage ;
End ;
Simula では大文字と小文字は区別されません。
クラス[1] : 1.3.3、2つの サブクラス[1] : 2.2.1 、仮想プロシージャ[1] : 2.2.3 を使用したより現実的な例
Begin
Class Glyph;
Virtual : Procedure print Is Procedure print;;
Begin
End ;
グリフクラスChar (c);
文字c;
手順print の開始
;
OutChar(c);
終わり;
グリフクラスLine (要素);
Ref (グリフ)配列elements;
手順開始
print;
整数i
の開始; i:= 1 の場合ステップ1 UpperBound (要素, 1)まで実行
要素 (i).print;
アウトイメージ;
終了;
終了;
参照(グリフ)rg;
参照(グリフ)配列rgs(1 : 4);
! メインプログラム;
rgs (1):-新しい文字 ('A');
rgs (2):-新しい文字 ('b');
rgs (3):-新しい文字 ('b');
rgs (4):-新しい文字 ('a');
rg:-改行(rgs);
rg.print;
終わり;
上記の例には、1つのスーパークラス(Glyph)と2つのサブクラス(CharおよびLine)があります。1つの仮想プロシージャが2つの実装で実装されています。実行はメインプログラムの実行から始まります。Simulaには抽象クラスの概念がありません。純粋仮想プロシージャを持つクラスはインスタンス化できるためです。つまり、上記の例ではすべてのクラスをインスタンス化できます。ただし、純粋仮想プロシージャを呼び出すと実行時 エラーが発生します。
Simulaは名前による呼び出し[1] : 8.2.3 をサポートしているため、Jensenのデバイスを容易に実装できます。ただし、単純なパラメータのデフォルトの転送モードは値による呼び出しであり、これは名前による呼び出しを使用するALGOLとは対照的です。したがって、Jensenのデバイスのソースコードは、Simulaコンパイラでコンパイルする際に、パラメータに対して名前による呼び出しを指定する必要があります。
もう 1 つのより単純な例は、次のように実装できる 合計関数です。
実数 プロシージャSigma (k, m, n, u); 名前k、u; 整数k、m、n;実数u; 開始 実数s; k:= m; k <= n の間、 Do Begin s:= s + u; k:= k + 1; End ; シグマ:= s; 終わり;
上記のコードでは、制御変数(k)と式(u)に名前による呼び出しを使用しています。これにより、制御変数を式の中で使用できるようになります。
Simula標準では、for ループ内の制御変数に一定の制限が設けられています。そのため、上記のコードでは移植性を最大限に高めるために while ループを使用しています。
次の:
次のように実装できます。
Z:= シグマ (i, 1, 100, 1 / (i + a) ** 2);
Simulaには、離散イベントシミュレーションを行うためのシミュレーションパッケージ[1] : 14.2 が含まれています。このシミュレーションパッケージは、Simulaのオブジェクト指向機能とコルーチン[1] : 9.2の 概念に基づいています。Simulaは、手続き型生成を用いて疑似乱数を生成するシミュレーションにも利用されています。[1] : 12.1
サム、サリー、アンディは服を買い物しています。彼らは同じ試着室を共有しなければなりません。それぞれ約12分間店内を見て回り、その後約3分間試着室を独占的に利用します。それぞれの時間は正規分布に従います。彼らの試着室体験のシミュレーションは以下のとおりです。
シミュレーション開始
クラスFittingRoom;開始
参照(ヘッド)ドア;
ブール値inUse;
手順要求;開始
If inUse Then 開始
待つ(ドア)
ドアから先に出る;
終わり;
inUse:= True ;
End ;
手順は終了します。begin
inUse:= False ;
door.First
をアクティブ化します。End ;
ドア:-新しいヘッド;
終了;
手順レポート(メッセージ);テキストメッセージ;開始
OutFix (Time, 2, 0); OutText (": " & message); OutImage;
終わり;
プロセスクラスPerson (pname);テキストpname; Begin
While True Do Begin
ホールド(通常(12、4、u))
report (pname & " 試着室をリクエストしています");
フィッティングルーム1.リクエスト;
report (pname & " が試着室に入りました");
ホールド(通常(3, 1, u))
フィッティングルーム1.退出;
report (pname & " が試着室を出て行きました");
終了;
終了;
整数u;
参照(FittingRoom) fittingRoom1;
fittingRoom1:-新しいFittingRoom。
新しい人物 ("Sam")
をアクティブ化します。 新しい人物 ("Sally")
をアクティブ化します。新しい人物 ("Andy")をアクティブ化します。
ホールド(100)
終わり;
メインブロックには、Simulationシミュレーションを有効にするためにプレフィックスが付けられます。シミュレーションパッケージはどのブロックでも使用でき、誰かがシミュレーションを行っている様子をシミュレートする場合、シミュレーションをネストすることも可能です。
door試着室オブジェクトは、試着室へのアクセスにキュー( )を使用します。試着室の利用をリクエストした人が、その試着室が使用中の場合、このキュー( Wait (door))で待機する必要があります。試着室から退出する人が現れると、最初の試着室(もしあれば)がキュー( )から解放されActivate door.first、ドアキュー(door.First.Out)からも削除されます。
Person は のサブクラスでありProcess、そのアクティビティは、保留 (店舗を閲覧する時間と試着室で過ごす時間) を使用して記述され、試着室を要求したり退出したりするために試着室オブジェクトのプロシージャを呼び出します。
メインプログラムはすべてのオブジェクトを作成し、すべての人物オブジェクトをアクティブ化してイベントキューに追加します。メインプログラムは、シミュレーション時間の100分間待機した後、終了します。
SIMULA I および SIMULA 67 の開発は、SIMSCRIPT の設計に影響を受けています...