| パラダイム | マルチパラダイム:手続き型、命令型、構造化型、オブジェクト指向型 |
|---|---|
| 家族 | アルゴル |
| デザイン: | オーレ・ヨハン・ダール |
| 開発者 | クリステン・ナイガード |
| 初登場 | 1962年 |
| 安定リリース | シミュラ 67、シミュラ I
|
| タイピングの規律 | 静的、主格 |
| 範囲 | 語彙 |
| 実装言語 | ALGOL 60(主に、一部のコンポーネントはSimscript) |
| OS | Unix 系、Windows、z/OS、TOPS-10、MVS |
| Webサイト | 翻訳元 |
| 影響を受けた | |
| ALGOL 60、Simscript | |
| 影響を受けた | |
| BETA、CLU、Eiffel、Emerald、Pascal、Smalltalk、C++、その他多くのオブジェクト指向プログラミング言語 | |
Simulaは、 1960年代にオスロのノルウェーコンピューティングセンターでOle-Johan DahlとKristen Nygaardによって開発された2つのシミュレーション プログラミング言語、Simula IとSimula 67の名前です。構文的には、 ALGOL 60 [1] : 1.3.1 のおおよそのスーパーセットであり、 Simscriptの設計にも影響を受けています。[2]
Simula 67 では、オブジェクト、 [ 1] : 2、5.3、 クラス、[1] : 1.3.3、2、 継承とサブクラス、[1] : 2.2.1、 仮想プロシージャ、[1] : 2.2.3、 コルーチン、[1] : 9.2 、離散イベントシミュレーション、[1] : 14.2 、ガベージコレクションが導入されました。[1] : 9.1 Simula 派生版では、サブクラスの継承以外のサブタイプ化の形式も導入されました。[要出典]
Simulaは最初のオブジェクト指向プログラミング言語と考えられています。その名前が示すように、1962年の最初のSimulaバージョンはシミュレーションを行うために設計されました。一方、Simula 67は汎用プログラミング言語として設計され[3]、今日のオブジェクト指向言語の多くの機能のフレームワークを提供しました。
Simulaは、超大規模集積回路(VLSI)設計のシミュレーション、プロセスモデリング、通信プロトコル、アルゴリズム、および植字、コンピュータグラフィックス、教育などの幅広いアプリケーションで使用されています。Simulaの影響は過小評価されることが多く、SimulaタイプのオブジェクトはC ++、Object Pascal、Java、C# 、およびその他の多くの言語で再実装されています。C ++の作成者であるBjarne StroustrupやJavaの作成者であるJames Goslingなどのコンピュータ科学者は、Simulaが大きな影響を与えたことを認めています。[4]
歴史
以下の記述はヤン・ルーネ・ホルメヴィクの歴史エッセイに基づいています。[5] [6]
Kristen Nygaard は1957 年にコンピュータ シミュレーション プログラムを書き始めました。Nygaard は、システムの異質性と動作を記述するよりよい方法の必要性を感じていました。システムを記述するための正式な コンピュータ言語に関するアイデアをさらに進めるには、自分よりも優れたコンピュータ プログラミングスキルを持つ人材が必要であると Nygaard は認識しました。Ole -Johan Dahl は1962 年 1 月に彼の仕事に加わりました。その直後に、言語をALGOL 60にリンクするという決定が下されました。1962 年 5 月までに、シミュレーション 言語の主要な概念が定まりました。離散イベント システムをシミュレートするための専用プログラミング言語であるSIMULA I が誕生しました。
1962 年 5 月下旬、クリステン・ナイガードは、新しいUNIVAC 1107コンピュータのマーケティングに関連して、エッカート・モークリー・コンピュータ社を訪問するよう招待されました。その訪問で、ナイガードは、 Univacのシステム プログラミング ディレクターであるロバート・ベマーに Simula のアイデアを紹介しました。ベマーはALGOL の大ファンで、Simula プロジェクトに魅力を感じていました。ベマーは、国際情報処理連盟(IFIP)が主催した第 2 回情報処理国際会議のセッションの議長でもありました。ベマーはナイガードを招待し、ナイガードは「SIMULA – 離散イベント ネットワークの記述に対する ALGOL の拡張」という論文を発表しました。
ノルウェー計算センターは1963 年 8 月にUNIVAC 1107 をかなりの割引価格で入手し、Dahl は UNIVAC との契約に基づいて SIMULA I を実装しました。実装は UNIVAC ALGOL 60コンパイラに基づいていました。SIMULA I は 1965 年 1 月までに UNIVAC 1107 で完全に動作可能になりました。その後数年間、Dahl と Nygaard は Simula の指導に多くの時間を費やしました。Simula は世界中のいくつかの国に広まり、SIMULA I は後にBurroughs B5500やロシアのUral-16などの他のコンピューターにも実装されました。
1966年、CAR Hoareはレコードクラス構造の概念を導入し、DahlとNygaardはこれをプレフィックスの概念やその他の機能で拡張して、一般化されたプロセス概念の要件を満たしました。DahlとNygaardは、1967年5月にオスロで開催されたシミュレーション言語に関するIFIPワーキング会議で、クラスとサブクラスの宣言に関する論文を発表しました。この論文は、Simula 67の最初の正式な定義となりました。1967年6月、言語を標準化し、いくつかの実装を開始するための会議が開催されました。Dahlは、型とクラスの概念を統一することを提案しました。これは真剣な議論につながり、提案は委員会によって却下されました。Simula 67は、1968年2月のSimula標準グループ(SSG)の最初の会議で正式に標準化されました。

SimulaはSmalltalkやその後のオブジェクト指向プログラミング言語の開発に影響を与えました。また、 Simulaはコルーチンのみをサポートしており、真の並行性はサポートしていませんが、並行計算のアクターモデルにインスピレーションを与えました。[7]
60 年代後半から 70 年代前半にかけて、Simula には主に 4 つの実装がありました。
- ノルウェーコンピューティングセンター(NCC)のUNIVAC 1100
- NCC のSystem/360およびSystem/370
- オスロ大学の共同コンピューター設置によるCDC 3000 (ケラー校)
- スウェーデン国立防衛研究所(FOA)によるTOPS-10
これらの実装は、幅広いプラットフォームに移植されました。TOPS -10 は、パブリック、プロテクト、プライベートのメンバー変数とプロシージャの概念を実装し、これは後に 1986 年に Simula Standard に統合されました。
Simula Standard 1986 は最新の標準であり、幅広いプラットフォームに移植されています。主に 4 つの実装があります。
- シミュラAS
- ルンド・シミュラ
- GNUシム[8]
- ポータブルシミュラの再考[9]
2001 年 11 月、ダールとナイガードは「SIMULA 67 の設計と実装を通じてオブジェクト指向プログラミングの基礎となる概念を導入した」として、電気電子技術者協会からIEEE ジョン・フォン・ノイマン賞を受賞しました。2002 年 4 月、彼らは「プログラミング言語 Simula I と Simula 67 の設計を通じて、オブジェクト指向プログラミングの出現に基礎となるアイデアを提供した」として、計算機協会(ACM)から2001 AMチューリング賞を受賞しました。ダールとナイガードは、2002 年 11 月にシアトルで開催されたOOPSLAカンファレンスで予定されていたACM チューリング賞講演[11]の前に、それぞれその年の 6 月と 8 月に亡くなりました[10]。
Simula 研究室はSimula 言語にちなんで名付けられた研究機関で、Nygaard 氏は 2001 年の開設当初からそこでパートタイムの職に就いていました。オスロ大学の新しいコンピューター サイエンスの建物は、Dahl 氏に敬意を表して Ole Johan Dahl's House と名付けられ、メイン講堂は Simula と名付けられています。
サンプルコード
最小限のプログラム
空のコンピュータ ファイルは、ソース コードのサイズで測定される Simula の最小プログラムです。ダミーステートメント1 つだけで構成されます。
ただし、最小限のプログラムは空のブロックとして表現する方が便利です。
開始 終了;
実行が開始され、すぐに終了します。この言語にはプログラムからの 戻り値がありません。
クラシック Hello world
Begin
OutText ("Hello, World!");
Outimage ;
End ;
Simula では大文字と小文字は区別されません。
クラス、サブクラス、仮想プロシージャ
クラス[1] : 1.3.3、2つの サブクラス[1] : 2.2.1 、および仮想プロシージャを使用したより現実的な例: [1] : 2.2.3
Begin
クラスGlyph;
仮想:プロシージャprint はプロシージャprintです ;;
Begin End ;
グリフクラスChar (c);
文字c;
手順print の開始
;
OutChar(c);
終わり;
グリフクラス線 (要素);
参照(グリフ)配列要素;
開始
手順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.印刷;
終わり;
上記の例には、 2 つのサブクラス(および)を持つ 1 つのスーパークラス(Glyph)があります。2つの実装を持つ 1 つの仮想プロシージャがあります。実行は、メイン プログラムを実行することによって開始されます。純粋仮想プロシージャを持つクラスはインスタンス化できるため、Simula には抽象クラスの概念がありません。つまり、上記の例では、すべてのクラスをインスタンス化できます。ただし、純粋仮想プロシージャを呼び出すと、実行時エラーが発生します。
CharLine
名前で呼ぶ
Simulaは名前による呼び出し[1] : 8.2.3 をサポートしているので、Jensenのデバイスを簡単に実装できます。ただし、単純なパラメータのデフォルトの転送モードは、名前による呼び出しを使用するALGOLとは対照的に、値による呼び出しです。したがって、Jensenのデバイスのソースコードは、Simulaコンパイラでコンパイルされるときに、パラメータに対して 名前による呼び出しを指定する必要があります。
もう 1 つの非常に単純な例は、次のように実装できる 合計関数です。
実数 プロシージャSigma (k, m, n, u); 名前k、u; 整数k、m、n;実数u; 開始 実数s; m = 0; k <= n の間、 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の 概念に基づいています。
サム、サリー、アンディは服を買い物しています。彼らは 1 つの試着室を共有する必要があります。各自が約 12 分間店内を見て回り、その後約 3 分間試着室を独占的に使用します。これは、それぞれ正規分布に従います。試着室での体験のシミュレーションは次のようになります。
シミュレーション開始
クラスFittingRoom;開始
Ref (Head)ドア;
ブール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) fittedRoom1;
fittingRoom1:-新しいFittingRoom。
新しい人物 ("Sam")
をアクティブ化します。 新しい人物 ("Sally")
をアクティブ化します。新しい人物 ("Andy") をアクティブ化します。
ホールド(100)
終わり;
メイン ブロックSimulationには、シミュレーションを有効にするために がプレフィックスとして付けられます。シミュレーション パッケージはどのブロックでも使用でき、シミュレーションを実行する人をシミュレートするときにシミュレーションをネストすることもできます。
door試着室オブジェクトは、試着室へのアクセスにキュー ( ) を使用します。誰かが試着室をリクエストし、その試着室が使用中の場合は、このキュー ( Wait (door)) で待機する必要があります。誰かが試着室を出ると、最初のもの (ある場合) がキュー ( ) から解放されActivate door.first、それに応じてドア キュー ( door.First.Out) から削除されます。
Person は のサブクラスでありProcess、そのアクティビティは hold (店内を閲覧する時間と試着室で過ごす時間) を使用して記述され、試着室を要求したり、試着室を出たりするために試着室オブジェクト内のプロシージャを呼び出します。
メイン プログラムはすべてのオブジェクトを作成し、すべての人物オブジェクトをアクティブ化してイベント キューに入れます。メイン プログラムは、プログラムが終了するまで 100 分間シミュレーション時間を保持します。
注記
- ^ abcdefghijklmn Dahl, Ole-Johan ; Myhrhaug, Bjørn; Nygaard, Kristen (1970). Common Base Language (PDF) (レポート). Norwegian Computing Center. 2013-12-25時点のオリジナルよりアーカイブ。 2020年11月17日閲覧。
{{cite report}}: CS1 メンテナンス: 不適切 URL (リンク) - ^ Nygaard, Kristen (1978)。「Simula 言語の開発」(PDF)。SIMULA
I および SIMULA 67 の開発は、SIMSCRIPT の設計に影響を受けています。
- ^ Kristen Nygaard と Ole-Johan Dahl。1978 年。SIMULA 言語の開発。プログラミング言語の歴史。Association for Computing Machinery、ニューヨーク、ニューヨーク州、米国、439–480。DOI:https://doi.org/10.1145/800025.1198392
- ^ Wong, William. 「C 以前は何を使っていましたか?」. Electronic Design . 2017 年5 月 22 日閲覧。
- ^ Holmevik, Jan Rune (1994). 「Simula のコンパイル: 技術的起源の歴史的研究」(PDF) . IEEE Annals of the History of Computing . 16 (4): 25–37. doi :10.1109/85.329756. S2CID 18148999 . 2010 年5 月 12 日閲覧。
- ^ Holmevik, Jan Rune. 「Simulaのコンパイル」。オスロ、ノルウェー:研究および高等教育研究所。2009年4月20日時点のオリジナルよりアーカイブ。2017年4月19日閲覧。
- ^ Lehrmann Madsen, Ole (2014). 「安全な並行性抽象化の構築」。Agha, Gul、Igarashi, Atsushi、Kobayashi, Naoki、Masuhara, Hidehiko、Matsuoka, Satoshi、Shibayama, Etsuya、Taura, Kenjiro (eds.) による。並行オブジェクトとその先。Lecture Notes in Computer Science。Vol . 8665。ベルリン: Springer。p. 68。doi:10.1007/ 978-3-662-44471-9。ISBN 978-3-662-44471-9. S2CID 1000741。
- ^ 「GNU Cim」.
- ^ 「Portable Simula Revisited」。GitHub 。 2019年6月17日閲覧。
- ^ 「ACM Ole-Johan Dahl と Kristen Nygaard - Obituary」。Acm.org。2011年7月19日時点のオリジナルよりアーカイブ。2012年1月14日閲覧。
- ^ 「ACM チューリング賞講演」 Informatik.uni-trier.de . 2012 年1 月 14 日閲覧。
出典
- シルベスター、ピーター。「IBM System 360/370 コンパイラと履歴ドキュメント」(Simula 標準およびその他の履歴ドキュメント)。
さらに読む
- Pooley, Rob (1987)、Simula プログラミング入門、Alfred Waller Ltd、ISBN 0632016116、2004-09-19にオリジナルからアーカイブ
外部リンク
- 公式ウェブサイト(archive.org の最終動作バージョン、2022 年 2 月 26 日にアクセス)
- GitHubでポータブル Simula を再検討
