SIMULAとは
SIMULA(シミュラ; SIMUlation LAnguage)は、1960年代にオルヨハン・ダールとクリステン・ニガードによって開発された、シミュレーションを目的とした
プログラミング言語です。
ALGOL60を拡張する形で開発され、プログラミングにおける重要な概念である「クラス」と「オブジェクト」を初めて導入した言語として知られています。
SIMULAの概要
SIMULAの開発は、ノルウェー計算センターのクリステン・ニガードとオルヨハン・ダールによって、
1962年から
1967年にかけて行われました。当初はシミュレーションを主な目的としていましたが、後に汎用言語としても利用されるようになりました。言語名の「Simula」は、「simulation language」(シミュレーション言語)と「simple universal language」(簡潔な汎用言語)という二つの意味が込められています。
SIMULAは、主に北欧圏で使用され、言語としての成熟度が十分でなかったため、広く普及することはなかったものの、後続の言語に大きな影響を与えました。特に、SmalltalkはSIMULAのオブジェクト概念を一般化したものと言えます。また、
C++も当初は
C言語にSIMULAのクラスなどの仕組みを追加する形で開発されました。
SIMULA開発の背景には、
システム全体の挙動を記述する上で、個々の要素をモデル化し、それらの相互作用を捉える方が自然であるという考え方がありました。例えば、気体の分子運動を考える場合、
システム全体を捉えるよりも、個々の気体分子をモデル化し、それらの相互作用を
システム全体として捉える方が、より自然で扱いやすいと考えられました。
SIMULA67では、オブジェクト、クラス、サブクラス、継承、動的束縛(仮想関数)、コルーチン、ディスクリートイベントシミュレーション、ガベージコレクションといった、今日の
オブジェクト指向プログラミングの基本概念が全て導入されています。このことから、SIMULAは最初の
オブジェクト指向言語であると考えることができます。
SIMULAは、その名前が示すようにシミュレーションのために設計されましたが、その過程で今日の
オブジェクト指向言語で使われる多くの機能の基盤となるフレームワークを提供しました。SIMULA開発当時は「
オブジェクト指向」という言葉はまだ存在せず、
アラン・ケイが1970年代ごろにSIMULAの概念を用いて使い始めたのが最初とされています。そのため、SIMULAは「
オブジェクト指向として再認識が可能な最古の言語」と位置づけることができます。
SIMULAは、VLSI設計、
プロセス、プロトコル、
アルゴリズムといったシミュレーション分野や、
組版、
コンピュータグラフィックス、
教育といったアプリケーションソフトにも利用されました。SIMULA形式のオブジェクトは、
C++、
Java、C#などで再
実装されており、これらの言語がSIMULAの影響を受けていることが分かります。
C++の開発者であるビャーネ・ストロヴストルップは、
C++開発時にSIMULA67の影響を強く受けたことを認めています。
SIMULAの歴史
クリステン・ニガードは1957年からコンピュータシミュレーションの開発を始めました。彼は、コンピュータの動作とシミュレーションプログラムに求められるものの間に矛盾があると考え、既存の
コンピュータ言語では自身のアイデアを具現化するにはプログラミングスキル以外にも何かが必要だと感じていました。オルヨハン・ダールは
1962年1月にニガードの業務に参加し、
1962年3月までにはシミュレーション用
プログラミング言語のメインコンセプトが固まりました。
その後、ディスクリートイベント
システムを持つシミュレーション専用の
プログラミング言語である「SIMULA I」が開発されました。UNIVAC社は、UNIVAC 1107を発売するにあたり、
1962年3月下旬にニガードを招待しました。ニガードはそこで、UNIVACのボブ・バーマー
システムプログラミング部長にSIMULAのアイデアを説明しました。バーマーは
ALGOLの熱烈なファンであり、SIMULAプロジェクトに大きな可能性を感じました。
情報処理国際連合(IFIP)が主催する情報処理の第2回国際会議の議長を務めていたバーマーは、ニガードを会議に招待し、「SIMULA — An Extension of
ALGOL to the Description of Discrete-Event Networks」という論文を発表させました。ノルウェー計算機センターは、UNIVACとの契約に基づき、ダールがSIMULA Iを
実装するために、UNIVAC 1107を特別価格で譲り受けました。これはUNIVAC用
ALGOL 60コンパイラを元に
実装されました。
1965年1月には、UNIVAC 1107上で完全なSIMULA Iが利用可能になり、ダールとニガードはその後2年間、SIMULAの普及に尽力しました。SIMULAは複数の国に広がり、SIMULA Iは後に
バロース B5000やロシアのURAL-16にも移植されました。
1966年には、
アントニー・ホーアがレコードクラスのコンストラクタの概念を導入し、ダールとニガードは、一般的な
プロセス概念という要求を満たすためにプリフィックスの概念などを導入して拡張しました。
1967年3月、ダールとニガードは、
オスロで開催されたIFIPのシミュレーション用言語に関するワーキングカンファレンスで、クラスとサブクラスの宣言についての論文を発表しました。この論文がSIMULA67の最初の正式な定義となりました。
1967年6月には、言語を規格化し、複数の
実装を開始するためのカンファレンスが開催されました。ダールは
データ型とクラスの概念の統一を提案しましたが、これは激論を巻き起こし、委員会から却下されました。SIMULA67は、SIMULA標準化グループ(SSG)の最初の会議で、1968年2月に正式に標準化されました。
SIMULAは、Smalltalkやその後の
オブジェクト指向言語に大きな影響を与えました。SIMULAはコルーチンをサポートしただけでなく、アクターモデルの概念を呼び起こすのにも役立ちました。1960年代後半から1970年代前半にかけて、SIMULAの4つの主要な
実装が存在しました。
- - UNIVAC 1100用(ノルウェー計算センター(NCC)が開発)
- - System/360およびSystem/370用(スウェーデン国立防衛研究所(FOA)が開発)
- - CDC 3000用(オスロ大学のJoint Computer Installationで開発)
- - TOPS-10用(ENEA ABが開発)
これらの
実装は、様々なプラットフォームに移植されました。TOPS-10用では、メンバ変数とメソッドのpublic、protected、privateが
実装され、後にSIMULA 87に統合されました。SIMULA 87は最新の標準規格であり、Simula AS、Lund Simula、GNU Cimの3つの
実装が存在します。
2001年11月、米国電気電子学会(
IEEE)は「SIMULA 67の設計と
実装が
オブジェクト指向の基礎概念を導き出した」ことを讃え、フォン・ノイマンメダルをダールとニガードに授与しました。2002年2月には、「
プログラミング言語SIMULA I及びSIMULA 67の
実装が
オブジェクト指向を生み出す基礎的なアイデアを表彰して、2001年度
チューリング賞がACMより贈られました。
サンプルコード
最小のプログラム
simula
begin end;
これは、起動してすぐに終了するプログラムです。SIMULAでは、プログラム自身が値を返すreturn文を持ちません。
古典的なHello World
simula
begin
OutText("
Hello world|Hello_world.");
OutImage;
end;
これは、SIMULAで記述されたHello Worldの例です。SIMULAは大文字と小文字を厳密に区別します。
典型的なサブクラスと仮想関数
simula
begin
class Glyph;
virtual: procedure draw;
begin
end Glyph;
Glyph class Char(c);
character c;
begin
procedure draw;
begin
OutChar(c);
end draw;
end Char;
Glyph class Line(len);
integer len;
begin
procedure draw;
begin
integer i;
for i := 1 step 1 until len do
OutChar('-');
end draw;
end Line;
ref(Glyph) g;
g :- new Char('A');
g.draw;
OutImage;
g :- new Line(10);
g.draw;
OutImage;
end;
この例では、親クラスGlyphと2つのサブクラス(Char, Line)があります。仮想関数drawが宣言されており、各サブクラスで
実装されています。
名前呼び
SIMULAは、名前呼び(call by name)をサポートしており、Jensen's Deviceを容易に
実装できます。以下の例は、総和関数を
実装したものです。
simula
begin
integer procedure sum(integer name l, integer value u, text name expr);
begin
integer res;
res := 0;
while l <= u do begin
res := res + expr;
l := l + 1;
end;
sum := res;
end sum;
integer i;
integer a;
real Z;
a := 2;
Z := 1.0
sum(i, 100, 1/((i+a)*2));
OutReal(Z, 5, 10);
OutImage;
end;
シミュレーション
SIMULAには、ディスクリートイベントシミュレーションを行うためのシミュレーションパッケージが含まれています。このパッケージは、SIMULAの
オブジェクト指向とコルーチンのコンセプトに基づいています。
simula
begin
class Person(name);
text name;
begin
procedure enterFittingRoom;
begin
OutText(name & " waiting");
Wait (fittingroom.door);
OutText(name & " using fitting room.");
hold(normal(3,1,rng));
OutText(name & " finished.");
Activate fittingroom.door.first;
fittingroom.door.First.Out;
end enterFittingRoom;
hold (normal(12,4,rng));
enterFittingRoom;
end Person;
class FittingRoom;
ref(Link) door;
begin
door :- new Link;
end FittingRoom;
ref(FittingRoom) fittingroom;
ref(Person) Sam,Sally,Andy;
integer seed;
seed := 100;
rng := new Random(seed);
fittingroom :- new FittingRoom;
Sam :- new Person("Sam");
Sally :- new Person("Sally");
Andy :- new Person("Andy");
Activate Sam;
Activate Sally;
Activate Andy;
hold(100);
end
この例では、Sam、Sally、Andyが試着室を共有する様子をシミュレーションしています。PersonはProcessのサブクラスであり、holdメソッドを用いて動作を記述しています。メインプログラムは全てのオブジェクトを生成し、イベントキューに投入しています。
まとめ
SIMULAは、
オブジェクト指向プログラミングの先駆けとなる言語であり、後の
プログラミング言語に多大な影響を与えました。特に、クラスやオブジェクトといった概念は、現代のプログラミングにおいて不可欠なものとなっています。SIMULAは、その後のソフトウェア開発のあり方を大きく変えた、歴史的に重要な言語と言えるでしょう。