Simulaのソースを表示
←
Simula
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{Infobox プログラミング言語 |名前={{lang|en|Simula}} |ロゴ=Simula - logo.svg |パラダイム=[[マルチパラダイムプログラミング言語|マルチパラダイム]]: [[構造化プログラミング]]、[[オブジェクト指向プログラミング]] |登場時期=1967年 |設計者=[[オルヨハン・ダール|Ole-Johan Dahl]]、[[クリステン・ニガード|Kristen Nygaard]] |処理系=[https://www.gnu.org/software/cim/cim.html {{lang|en|GNU Cim}}] |影響を受けた言語={{lang|en|[[ALGOL 60]]}} |影響を与えた言語={{lang|en|[[Smalltalk]]}}をはじめとするオブジェクト指向プログラミング言語 }} {{プログラミング言語}} '''SIMULA'''(シミュラ; '''SIMU'''lation '''LA'''nguage)は、[[オルヨハン・ダール]]と[[クリステン・ニガード]]によって[[ALGOL60]]を拡張する形で1960年代に開発が始められた[[シミュレーション]]用途の[[プログラミング言語]]である<ref>{{harvp|Dahl|Nygaard|1966}}</ref>。 ALGOLの<code>begin ... end</code>で囲まれた部分である'''ブロック'''(block)の概念を実体的な実例(instance)として扱うことを目的として、'''クラス'''(class)の構文と対象(object、'''オブジェクト''')の概念を初めて導入した言語である<ref>{{harvp|ダイクストラ|1975|p=202}}</ref>。初期の[[オブジェクト指向プログラミング|オブジェクト指向プログラミング言語]]の一つである。 == 概要 == [[オスロ]]のノルウェー計算センターの[[クリステン・ニガード]]と[[オルヨハン・ダール]]が[[1962年]]から[[1967年]]にかけて、{{lang|en|Simula}} の元となる {{lang|en|'''Simula I'''}} と '''{{lang|en|Simula}}67''' を [[ALGOL60|{{lang|en|ALGOL}} 60]] の拡張として設計/実装した。{{lang|en|Simula}} は当初シミュレーションに用いられたが、のちに汎用言語となった。名前「{{lang|en|Simula}}」は「シミュレーション言語」を意味する英語「{{lang|en|<u>simu</u>lation <u>la</u>nguage}}」と「簡潔な汎用言語」を意味する英語「{{lang|en|<u>sim</u>ple <u>u</u>niversal <u>la</u>nguage}}」の二つに由来する。 主に北欧圏で使用されたこと、言語的な未成熟さもあって広く普及することはなかったが、後続言語に与えた影響は大きい。特に{{lang|en|[[Smalltalk]]}} は {{lang|en|Simula}} のオブジェクト概念を一般化したものだと言うことができる。{{lang|en|[[C++]]}} もまた、当初は[[C言語]]に {{lang|en|Simula}} のクラスなどの仕組みを追加したものであった。 開発の動機は、ある制限下におかれたモデル群の全体の挙動をどう記述するか、というものである。気体の分子運動を例にとると、[[システム]]全体を考えてその中の項として分子を扱うよりも、一つの一つの気体分子をモデル化し、それぞれの相互作用の結果をシステムとして捉える方が自然で取り扱いやすい。その為には小さなモデル、関連する法則、それらを一度に複数取り扱う能力が必要となる。こうして[[属性]]を備えた[[オブジェクト (プログラミング)|オブジェクト]]概念と、それに従属する[[メソッド (計算機科学)|メソッド]]概念が生まれたのである。 {{lang|en|Simula}} 67 では[[オブジェクト (プログラミング)|オブジェクト]]、 [[クラス (コンピュータ)|クラス]]、[[サブクラス (計算機科学)|サブクラス]]、[[継承 (プログラミング)|継承]]、[[メソッド (計算機科学)|動的束縛(仮想関数)]]、[[コルーチン]]、 ディスクリートイベントシミュレーション、[[ガベージコレクション]]の機能をもち、オブジェクト指向プログラミングの基本概念はすべてここで発案されているといえる。 {{lang|en|Simula}} は[[プログラミングパラダイム]]として最初の[[オブジェクト指向]]言語であると考えられる。その名前が示すように {{lang|en|Simula}} はシミュレーションを行うために設計され、その必要性から今日のオブジェクト指向言語で使われる多くの機能のためのフレームワークを提供した。なお、{{lang|en|Simula}} 当時「オブジェクト指向」という言葉はまだない。この用語は[[アラン・ケイ]]が {{lang|en|Simula}} の概念として70年代ごろに使い出したのが始まりといわれている。従ってその意味では {{lang|en|Simula}} が世界最初のオブジェクト指向言語であり、{{lang|en|Simula}} は「オブジェクト指向として再認識が可能な最古の言語」ということができる。 [[VLSI]]設計、[[プロセス]]、[[プロトコル]]、[[アルゴリズム]]といったシミュレーションや、[[組版]]、[[コンピュータグラフィックス]]、[[教育]]といったアプリケーションソフトに {{lang|en|Simula}} は利用された。{{lang|en|Simula}} 形式のオブジェクトは {{lang|en|C++}}、{{lang|en|[[Java]]}}、{{lang|en|[[C Sharp|C#]]}} で再実装されており、{{lang|en|Simula}} の影響を受けていることが知られている。{{lang|en|C++}} の開発者である[[ビャーネ・ストロヴストルップ]]は[[BCPL]]のような機械語を出力し高速に動作する低レベル言語に {{lang|en|Simula}} が提供する開発効率を高める機能を導入するため、{{lang|en|C++}} 開発時に {{lang|en|Simula}} 67 の影響を大きく受けていることを認めている。 == 歴史 == クリステン・ニガードは1957年からコンピュータシミュレーションの開発を始めた。ニガードはコンピュータの動作とシミュレーションプログラムに要求されるものの不整合を適切に記述する方法が必要であると考えた。既存の[[コンピュータ言語]]で彼のアイデアを実現するにはプログラミングのスキル以外に何かが必要であると思われた。オルヨハン・ダールは1962年1月にニガードの業務に参加した。1962年3月までにはシミュレーション用プログラミング言語のメインコンセプトは固まっていた。ディクリートイベントシステムを持つシミュレーション専用のプログラミング言語 '''{{lang|en|SIMULA I}}''' が開発された。 {{lang|en|[[UNIVAC]]}} は {{lang|en|UNIVAC}} 1107 を発売するにあたりニガードを1962年3月下旬に招待した。その際にニガードは {{lang|en|UNIVAC}} の[[ボブ・バーマー]]システムプログラミング部長に {{lang|en|Simula}} のアイデアを説明した。バーマーは {{lang|en|ALGOL}} の熱烈なファンであり、{{lang|en|Simula}} プロジェクトに説得力を感じた。IFIP([[情報処理国際連合]])が主催する情報処理の第2回国際会議の議長を務めていたバーマーは論文「SIMULA — An Extension of ALGOL to the Description of Discrete-Event Networks」を提出したニガードを会議に招待した。 ノルウェー計算機センターは {{lang|en|UNIVAC}} との契約に基づいてダールがSIMULA Iを実装するため {{lang|en|UNIVAC }} 1107 を1963年8月に特別価格で譲り受けた。これは {{lang|en|UNIVAC}} 用 [[ALGOL|{{lang|en|ALGOL}} 60]]コンパイラを元に実装された。1965年1月には {{lang|en|UNIVAC}} 1107 上で完全な {{lang|en|SIMULA I}} を利用できた。ダールとニガードはその後の2年間に渡り {{lang|en|Simula}} を教えることに費やした。{{lang|en|Simula}} は複数の国に広がり、{{lang|en|SIMULA I}} は後に [[バロース B5000]] やロシアの {{lang|ru-Latn|URAL}}-16 に移植された。 [[アントニー・ホーア]]は1966年にレコードクラスのコンストラクタの概念を導入し、ダールとニガードは一般的なプロセス概念という要求を満たすためプリフィックスの概念などを導入してこれを拡張した。ダールとニガードは[[クラス (コンピュータ)|クラス]]と[[サブクラス (計算機科学)|サブクラス]]の宣言についての論文を1967年3月に[[オスロ]]で開催された IFIP のシミュレーション用言語についてのワーキングカンファレンスで発表した。この論文は {{lang|en|Simula}} 67 の最初の正式な定義となった。1967年6月に言語を規格化して複数の実装を始めるためのカンファレンスが開催された。ダールは[[データ型]]と[[クラス (コンピュータ)|クラス]]の概念の統一化を提案した。これは激論を巻き起こし委員会から却下された。{{lang|en|SIMULA 67}} は {{lang|en|SIMULA}} 標準化グループ (SSG) の最初の会議で1968年2月に正式に標準化された。 {{lang|en|Simula}} は {{lang|en|Smalltalk}} やその後のオブジェクト指向言語に影響を及ぼした。{{lang|en|Simula}} だけが[[コルーチン]]をサポートした言語ではないし、真の並列性は持たないが、[[アクターモデル]]の概念を呼び起こすのに役立った。 60年代後期から70年代前期にかけて {{lang|en|Simula}} の4つの主要な実装があった。 *{{lang|en|UNIVAC}} 1100 用。Norwegian Computing Center (NCC) が開発。 *[[System/360|{{lang|en|Sysmtem}}/360]] 用および [[System/370|{{lang|en|System}}/370]] 用。スウェーデン国立防衛研究所 (FOA) が開発。 *CDC 3000 用。オスロ市シェラーにある[[オスロ大学]]の {{lang|en|Joint Computer Installation}} で開発。 *{{lang|en|[[TOPS-10]]}} 用。{{lang|en|ENEA AB}} が開発。 これらの実装は様々なプラットフォームに移植された。{{lang|en|TOPS-10}} 用ではメンバ変数とメソッドの <code>public</code>、<code>protected</code>、<code>private</code> が実装され、後に {{lang|en|Simula}} 87 に統合された。{{lang|en|Simula}} 87 は最新の標準規格であり、下記の3つの実装があることが知られている。 *{{lang|en|Simula AS}} *{{lang|en|Lund Simula}} *[https://www.gnu.org/software/cim/cim.html {{lang|en|GNU Cim}}] 2001年11月に[[IEEE|米国電気電子学会 (IEEE) ]]は、「{{lang|en|SIMULA 67}} の設計と実装によりオブジェクト指向の基礎概念を導きだした」ことを讃え[[フォン・ノイマンメダル]]をダールとニガードに授与した。2002年2月には「プログラミング言語 {{lang|en|Simula I}} 及び {{lang|en|Simula 67}} の実装によりオブジェクト指向を出現させた基礎的アイデア」を表彰して2001年度[[チューリング賞]]を[[Association for Computing Machinery|ACM]]より受賞した。両名は6月と8月にそれぞれ死去したため<ref>{{cite web |title=2001 TURING AWARD WINNERS SUCCUMB WITHIN TWO MONTHS OF EACH OTHER |url=http://www.acm.org/announcements/turing_obit.html |archiveurl=https://web.archive.org/web/20021004021457/https://www.acm.org/announcements/turing_obit.html |author=Patrick J. De Blasi |date=2002-7-29 |archivedate=2002-10-4 |accessdate=2024-4-3 }}</ref>、シアトルで開催される {{lang|en|[[OOPSLA]]}} カンファレンス2002で行われる予定であった[http://www.informatik.uni-trier.de/~ley/db/journals/cacm/turing.html ACMチューリング賞]の講演に出席できなかった。 研究所はプログラミング言語 {{lang|en|Simula}} にちなんで名付けられた研究所であり、ニガードはオープン時の2001年から非常勤職員として働いていた。 ==サンプルコード== ===最小のプログラム=== 空のファイルはソースコードのサイズを基準とした場合で最も小さな {{lang|en|Simula}} のプログラムである。これは1つのダミーのステートメントのみで構成される。 しかしながら合理的に考えれば最小のプログラムは空のブロックとして表現される。 <syntaxhighlight lang="text"> Begin End ; </syntaxhighlight> これは起動してすぐに終了するプログラムである。{{lang|en|Simula}} ではプログラム自身が値を返す [[Return文|<code>return</code>文]] を持たない。 ===古典的 {{lang|en|Hello World}}=== Simulaで記述された {{lang|en|[[Hello world]]}} の例である。{{lang|en|Simula}} は大文字と小文字を厳密に区別する。 <syntaxhighlight lang="text"> Begin OutText ("Hello World!") ; Outimage ; End ; </syntaxhighlight> === 典型的サブクラスと仮想関数 === クラス、サブクラス、仮想関数を用いた現実的な例を以下に示す。 <syntaxhighlight lang="text"> 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 ; </syntaxhighlight> 上記の例には1つの親クラス(<code>Glyph</code>)と2つのサブクラス(<code>Char</code>, <code>Line</code>)があり、1つの[[仮想関数]]と2つの[[実装]]がある。メインプログラムから実行を開始する。{{lang|en|Simula}} は純粋仮想関数を持つクラスを[[オブジェクト (プログラミング)|インスタンス化]]できるため抽象基底クラスの概念が無い。これは上記の例にある全てのクラスがインスタンス化できるということである。しかしながら純粋仮想関数を呼び出すと[[ランタイムライブラリ]][[エラー]]を引き起こす。 ===名前呼び=== {{lang|en|Simula}} は名前呼び({{lang|en|call by name}}、[[評価戦略]]を参照)をサポートしているため {{lang|en|Jensen's Device}}([[:en:Jensen's Device]])を容易に実装できる。デフォルトは{{lang|en|ALGOL}}と異なり値呼び({{lang|en|call by value}})であるため、{{lang|en|Jensen's Device}}を実装する際には、名前呼びであることを明示する必要がある。 単純な例として総和関数<math>\sum</math>の実装例を以下に示す。 <syntaxhighlight lang="text"> Real Procedure Sigma (l, m, n, u) ; Name l, u ; Integer l, m, n ; Real u ; Begin Real s ; l:= m ; While l <= n Do Begin s := s + u ; l := l + 1 ; End ; Sigma := s ; End ; </syntaxhighlight> 上記のコードは値(<code>l</code>)と式(<code>u</code>)を制御するために名前呼びを用いている。これにより式で使用する値を制御できる。{{lang|en|Simula}} の標準規格は <code>for</code> 文にある種の制約があるため上記の例では <code>while</code> 文を使用している。 以下の式は次のように実装できる。 <math>Z = \sum_{i=1}^{100}{1 \over (i + a)^2}</math> <syntaxhighlight lang="text">Z:= Sigma (i, 1, 100, 1 / (i + a) ** 2) ;</syntaxhighlight> ===シミュレーション=== {{lang|en|Simula}} にはディスクリートイベントシミュレーションを行うための[[シミュレーション]]パッケージが含まれている。このシミュレーションパッケージはSimulaの[[オブジェクト指向]]と[[コルーチン]]のコンセプトに基づいている。 下記の例で <code>Sam</code>、<code>Sally</code>、<code>Andy</code> は服を買おうとしている。彼らは1つの試着室を共有しなければならない。3人は正規分布によりランダムに約12分間店内を探索し、同様に試着室を約3分間占有する。以下は彼らが試着室をどのように使うのかをシミュレーションするものである。 <syntaxhighlight lang="text"> 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; </syntaxhighlight> メインブロックが <code>Simulation</code> でプレフィックスされることによりシミュレーションを実行できる。シミュレーションパッケージはどこのブロックからでも自由に利用でき、シミュレーションしているものそれ自体をシミュレーションするときにはシミュレーションを再帰的にネストできる。 試着室オブジェクトはキュー(<code>door</code>)により試着室にアクセスできる。誰かが使用中の試着室を使おうとしたときはこのキュー(<code>Wait (door)</code>)で待たなければならない。誰かが試着室を出るとき、列の先頭にいる者がキューからリリース(<code>'''Activate''' door.first</code>)されてドアキューから削除(<code>door.First.Out</code>)される。 <code>Person</code> は <code>Process</code> のサブクラスでありその動作は <code>hold</code>(店内を探索する時間と試着室で過ごす時間)を用いて記述され、試着室に出入りするために試着室オブジェクト内でメソッドを呼び出す。 メインプログラムは全てのオブジェクトを生成し、全ての <code>Person</code> オブジェクトをイベントキューに投入するためにアクティベートする。メインプログラムはシミュレーション時間で100分間待ってからプログラムを終了する。 ==脚注== <references /> == 参考文献 == * {{Cite journal |last=Dahl |author=Ole-Johan Dahl |first=Ole-Johan |last2=Nygaard |first2=Kristen |year=1966 |date=1966-09-01 |title=SIMULAーan ALGOL Based Simulation Language |url=http://www.znu.ac.ir/cv/afsharchim/lectures/artikkel1966cacm.pdf |journal=Communications of the ACM |volume=9 |issue=9 |pages=671–678 |ref=harv |doi=10.1145/365813.365819 |issn=0001-0782 |author2=Kristen Nygaard}} * {{Cite book |ref=harv |author=Ole-Johan Dahl |title=SIMULA Common Base Language |url=http://www.eah-jena.de/~kleine/history/languages/Simula-CommonBaseLanguage.pdf |year=1970 |author2=Bjørn Myhrhaug |author3=Kristen Nygaard |archive-url=https://web.archive.org/web/20150402202054/http://www.eah-jena.de/~kleine/history/languages/Simula-CommonBaseLanguage.pdf |archive-date=2015-04-02}} * {{Cite web |url=http://www.edelweb.fr/Simula/ |title=IBM System 360/370 and Historical Documentation |access-date=2017年9月16日 |website=www.edelweb.fr |archive-url=https://web.archive.org/web/20060518132022/http://www.edelweb.fr/Simula/ |archive-date=2006/05/18}} * {{Cite book |ref=harv |author=E. W. Dijkstra |title=Structured Programming |year=1972 |publisher=Academic Press, London |isbn=0-12-200550-3 |author2=C. A. R. Hoare |author3=Ole-Johan Dahl}} ** {{Cite book |和書 |ref={{harvid|ダイクストラ|1975}} |author=E. W. ダイクストラ |title=構造化プログラミング |year=1975 |publisher=サイエンス社 |translator=野下 浩平 |author2=C. A. R. ホーア |author3=O.-J. ダール}} * {{Cite book |和書 |ref=harv |author=落水 浩一郎 |title=ソフトウェア工学実践の基礎 : 分析・設計・プログラミング |year=1993 |publisher=日科技連出版社}} ==関連項目== * [[構造化プログラミング]] * [[抽象データ型]] * [[ALGOL]] * [[オブジェクト指向]] ==外部リンク== {{Commons-inline}} * [https://staff.um.edu.mt/jskl1/talk.html {{lang|en|INTRODUCTION TO OOP IN SIMULA}}] * [http://www.ifi.uio.no/~cim/cim_toc.html {{lang|en|Cim}}] * [http://linux.maruhn.com/sec/cim.html {{lang|en|Cim — Simula to C translator. Mother of all OO-languages}}] — {{lang|en|Cim}} の配布ページ ** [http://www.volny.cz/petr-novak/cim/ {{lang|en|Cim 3.33 for MS Windows}}] — 上記の {{lang|en|Windows}} 版 * [https://history-computer.com/simula-guide/ {{lang|en|Simula – Guide: History, Origin, and More}}] {{プログラミング言語一覧}} {{authority control}} [[カテゴリ:オブジェクト指向言語|SIMULA]] [[カテゴリ:プログラミング言語]] [[カテゴリ:フリーコンパイラとフリーインタプリタ]] [[カテゴリ:ノルウェーの科学技術]]
このページで使用されているテンプレート:
テンプレート:Authority control
(
ソースを閲覧
)
テンプレート:Cite book
(
ソースを閲覧
)
テンプレート:Cite journal
(
ソースを閲覧
)
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:Commons-inline
(
ソースを閲覧
)
テンプレート:Harvp
(
ソースを閲覧
)
テンプレート:Infobox プログラミング言語
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:プログラミング言語
(
ソースを閲覧
)
テンプレート:プログラミング言語一覧
(
ソースを閲覧
)
Simula
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報