Simula
SIMULA（シミュラ ; SIMUlation LAnguage）は、オルヨハン・ダールとクリステン・ニガードによってALGOL60を拡張する形で1960年代に開発が始められたシミュレーション用途のプログラミング言語である。
ALGOLのcodice_1で囲まれた部分であるブロック（block）の概念を実体的な実例（instance）として扱うことを目的として、クラス（class）の構文と対象（object、オブジェクト）の概念を初めて導入した言語である。最初期のオブジェクト指向言語であるとも言われるが、この言語の設計者はオブジェクト指向を全く意識していなかった。
オブジェクト指向は SIMULA のクラスとオブジェクトの概念を一般化したものであり、SIMULA よりも後に作られた概念である。
オスロのノルウェー計算センターのクリステン・ニガードとオルヨハン・ダールが1962年から1967年にかけて、 の元となる と 67 を 60 の拡張として設計/実装した。 は当初シミュレーションに用いられたが、のちに汎用言語となった。名前「」は「シミュレーション言語」を意味する英語「」と「簡潔な汎用言語」を意味する英語「」の二つに由来する。
主に北欧圏で使用されたこと、言語的な未成熟さもあって広く普及することはなかったが、後続言語に与えた影響は大きい。特に は のオブジェクト概念を一般化したものだと言うことができる。 もまた、当初はC言語に のクラスなどの仕組みを追加したものであった。
開発の動機は、ある制限下におかれたモデル群の全体の挙動をどう記述するか、というものである。気体の分子運動を例にとると、システム全体を考えてその中の項として分子を扱うよりも、一つの一つの気体分子をモデル化し、それぞれの相互作用の結果をシステムとして捉える方が自然で取り扱いやすい。その為には小さなモデル、関連する法則、それらを一度に複数取り扱う能力が必要となる。こうして属性を備えたオブジェクト概念と、それに従属するメソッド概念が生まれたのである。
VLSI設計、プロセス、プロトコル、アルゴリズムといったシミュレーションや、組版、コンピュータグラフィックス、教育といったアプリケーションソフトに は利用された。 形式のオブジェクトは 、、 で再実装されており、 の影響を受けていることが知られている。 の開発者であるビャーネ・ストロヴストルップはBCPLのような機械語を出力し高速に動作する低レベル言語に が提供する開発効率を高める機能を導入するため、 開発時に 67 の影響を大きく受けていることを認めている。
クリステン・ニガードは1957年からコンピュータシミュレーションの開発を始めた。ニガードはコンピュータの動作とシミュレーションプログラムに要求されるものの不整合を適切に記述する方法が必要であると考えた。既存のコンピュータ言語で彼のアイデアを実現するにはプログラミングのスキル以外に何かが必要であると思われた。オルヨハン・ダールは1962年1月にニガードの業務に参加した。1962年3月までにはシミュレーション用プログラミング言語のメインコンセプトは固まっていた。ディクリートイベントシステムを持つシミュレーション専用のプログラミング言語 が開発された。
ノルウェー計算機センターは との契約に基づいてダールがSIMULA Iを実装するため 1107 を1963年8月に特別価格で譲り受けた。これは 用 60コンパイラを元に実装された。1965年1月には 1107 上で完全な を利用できた。ダールとニガードはその後の2年間に渡り を教えることに費やした。 は複数の国に広がり、 は後に バロース B5000 やロシアの -16 に移植された。
アントニー・ホーアは1966年にレコードクラスのコンストラクタの概念を導入し、ダールとニガードは一般的なプロセス概念という要求を満たすためプリフィックスの概念などを導入してこれを拡張した。ダールとニガードはクラスとサブクラスの宣言についての論文を1967年3月にオスロで開催された IFIP のシミュレーション用言語についてのワーキングカンファレンスで発表した。この論文は 67 の最初の正式な定義となった。1967年6月に言語を規格化して複数の実装を始めるためのカンファレンスが開催された。ダールはデータ型とクラスの概念の統一化を提案した。これは激論を巻き起こし委員会から却下された。 は 標準化グループ (SSG) の最初の会議で1968年2月に正式に標準化された。
60年代後期から70年代前期にかけて の4つの主要な実装があった。これらの実装は様々なプラットフォームに移植された。 用ではメンバ変数とメソッドの codice_2、codice_3、codice_4 が実装され、後に 87 に統合された。 87 は最新の標準規格であり、下記の3つの実装があることが知られている。
2001年11月に米国電気電子学会 (IEEE)は、「 の設計と実装によりオブジェクト指向の基礎概念を導きだした」ことを讃えフォン・ノイマンメダルをダールとニガードに授与した。2002年2月には「プログラミング言語 及び の実装によりオブジェクト指向を出現させた基礎的アイデア」を表彰して2001年度チューリング賞をACMより受賞した。両名は6月と8月にそれぞれ死去したため、シアトルで開催される カンファレンス2002で行われる予定であったACMチューリング賞の講演に出席できなかった。
研究所はプログラミング言語 にちなんで名付けられた研究所であり、ニガードはオープン時の2001年から非常勤職員として働いていた。
空のファイルはソースコードのサイズを基準とした場合で最も小さな のプログラムである。これは1つのダミーのステートメントのみで構成される。
しかしながら合理的に考えれば最小のプログラムは空のブロックとして表現される。
これは起動してすぐに終了するプログラムである。 ではプログラム自身が値を返す codice_5文 を持たない。
Simulaで記述された の例である。 は大文字と小文字を厳密に区別する。
クラス、サブクラス、仮想関数を用いた現実的な例を以下に示す。
上記の例には1つの親クラス（codice_8）と2つのサブクラス（codice_9、codice_10）があり、1つの仮想関数と2つの実装がある。メインプログラムから実行を開始する。 は純粋仮想関数を持つクラスをインスタンス化できるため抽象基底クラスの概念が無い。これは上記の例にある全てのクラスがインスタンス化できるということである。しかしながら純粋仮想関数を呼び出すとランタイムライブラリエラーを引き起こす。
は名前呼び（、評価戦略を参照）をサポートしているため （）を容易に実装できる。デフォルトはと異なり値呼び（）であるため、を実装する際には、名前呼びであることを明示する必要がある。
単純な例として総和関数formula_1の実装例を以下に示す。
上記のコードは値（codice_12）と式（codice_13）を制御するために名前呼びを用いている。これにより式で使用する値を制御できる。 の標準規格は codice_14 文にある種の制約があるため上記の例では codice_15 文を使用している。
以下の式は次のように実装できる。
formula_2
にはディスクリートイベントシミュレーションを行うためのシミュレーションパッケージが含まれている。このシミュレーションパッケージはSimulaのオブジェクト指向とコルーチンのコンセプトに基づいている。
下記の例で codice_17、codice_18、codice_19 は服を買おうとしている。彼らは1つの試着室を共有しなければならない。3人は正規分布によりランダムに約12分間店内を探索し、同様に試着室を約3分間占有する。以下は彼らが試着室をどのように使うのかをシミュレーションするものである。
メインブロックが codice_21 でプレフィックスされることによりシミュレーションを実行できる。シミュレーションパッケージはどこのブロックからでも自由に利用でき、シミュレーションしているものそれ自体をシミュレーションするときにはシミュレーションを再帰的にネストできる。
試着室オブジェクトはキュー（codice_22）により試着室にアクセスできる。誰かが使用中の試着室を使おうとしたときはこのキュー（codice_23）で待たなければならない。誰かが試着室を出るとき、列の先頭にいる者がキューからリリース（codice_24）されてドアキューから削除（codice_25）される。
codice_26 は codice_27 のサブクラスでありその動作は codice_28（店内を探索する時間と試着室で過ごす時間）を用いて記述され、試着室に出入りするために試着室オブジェクト内でメソッドを呼び出す。
メインプログラムは全てのオブジェクトを生成し、全ての codice_26 オブジェクトをイベントキューに投入するためにアクティベートする。メインプログラムはシミュレーション時間で100分間待ってからプログラムを終了する。