Simula-50年間のOOP

この記事は、Simulaの非常に短い紹介です。



Simula((SIMIUlation LAnguage))、クラスとオブジェクトを備えた最初のプログラミング言語であり、ほとんど忘れられていませんが、現代のOOPはコードに存在する形で成長しました。 これは、現実をシミュレートするための言語です。 新しいプログラミング言語の開発者は、オブジェクト指向プログラミングメカニズムを言語に追加するときにSimulaを「振り返り」ます。 ただし、Simulaが言及されることはめったにないため、ロシアのウィキペディアの発行時点ではHelloWordしかなく、ネットワークには多数の古いリンクがあります。







C ++を作成する理由について話しているBjörnStraustrupは、次のように述べています。「この言語は、作成者が割り込み駆動型のシミュレーションプログラムを作成する必要があるために生まれました。 SIMULA-67言語は、効率を考慮しない場合に最適です。」



なぜこれが必要なのですか
JavaのSimula静的メソッドに導かれました。 より正確には、すべてはJavaの静的メソッドを悪と呼ぶYegor Bugaenkoによるレポートのレビューから始まりました。 要するに、彼の意見では、それらは手続き型プログラミング要素をJavaに導入し、OOPを破壊します。 したがって、疑問が生じました-これらのメソッドがJava言語で表示された理由-言語の作成者を導いたものは何ですか? これに対する答えを求めて、質問はSmalltalk(1971)に掘り下げられ、JavaでのOOPが(正直なところ)引き継がれました。 結局のところ、静的メソッドが存在し、それらはクラスメソッドと呼ばれています。 しかし、Smalltalkも空からやってきたわけではありません。 彼の前身はSimula(1965)でした。 結局のところ、同様の方法がありました。 もちろん、それらは異なって呼ばれました。 特に、彼は「フリーブロック」という名前に出会いました。 また、「フリーブロック」は通常の手順です。 結局のところ、Simulaの祖先はAlgol 60でした。Simulaの最初のバージョンは、Algol 60の「上部構造」でした。



物語



実際、この言語は50年以上前のものです。 Simula Iとして知られる最初のバージョンは、1964年から1965年に登場しました。 これは、Algol-60言語の拡張版(より正確には、プリプロセッサ)でした。 この言語の著者は、ノルウェーの科学者クリステン・ニューゴルとオレ・ヨハン・ダールです。 言語の最初のバージョンは、36ビットのUNIVAC 1107コンピューターで機能しました。



すでに1967年に、Simula-67がリリースされました。現在は単にSimulaと呼ばれています。

わが国では、言語の最初のバージョンがUral-16コンピューターで起動されました。

1968年、言語標準は公式に凍結されました。



この言語は前世紀の70年代に広がりましたが、その後その名声は薄れていきます。

この人気の低下にはいくつかの理由がありますが、現代的には-マーケティングの欠如(製品の開発、価格の低さ、PRの低さ)



設置



GNU Cimを使用してトレーニングします。GNUCimは、実際にはCのSimulaコードのコンパイラです。



Linuxインストール



$ wget http://simula67.at.ifi.uio.no/Cim/cim-3.37.tar.gz $ tar -xf cim-3.37.tar.gz $ cd cim-3.37 $ ./configure $ make $ sudo make install $ sudo ldconfig /usr/local/lib
      
      





Macのインストール



 $ wget http://simula67.at.ifi.uio.no/Cim/cim-3.37.tar.gz $ tar -xf cim-3.37.tar.gz $ cd cim-3.37 $ CFLAGS='-O0 -m32' ./configure $ make $ sudo make install
      
      





Windowsへのインストール

サイトhttp://folk.uio.no/simula67/cim.shtmlからプログラムをダウンロードします



こんにちは世界!



プログラムをノートに書きます:



 Begin OutText ("Hello World!"); Outimage; End;
      
      





test1.cimとして保存します

次に、これを行います(Linuxバージョン):



  cim test1.cim ./test1
      
      





そして、私たちは待望の

Hello World!



シンタックスからわかるように、古典的なAlgol60。このコードに関するほとんどの質問は、わが国では子孫のPascalが学習用の主要言語として使用されているため、ほとんど変わりません。



フィーチャクラス



 Begin Class Rectangle (Width, Height); Real Width, Height; Begin Real Area, Perimeter; Procedure Update; Begin Area := Width * Height; OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage; Perimeter := 2*(Width + Height); OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage; End of Update; Update; OutText("Rectangle created: "); OutFix(Width,2,6); OutFix(Height,2,6); OutImage; End of Rectangle; Ref(Rectangle) R; R :- New Rectangle(50, 40); End;
      
      





結果:



四角形が更新されています、面積= 2000.00

四角形が更新されています、周囲= 180.00

作成された長方形:50.00 40.00





メインプロシージャ内で、Real型の2つのWidthおよびHeightパラメーターを持つRectangleクラスを作成しました。 実数。 現代の用語では、これらはコンストラクターのパラメーターですが、オブジェクトが作成されたときだけでなく、オブジェクトが存在するときにも存在します。 さらに、同じタイプのArea属性とPerimeter属性を追加しました。 ご覧のとおり、Updateプロシージャが呼び出されたときに計算されます。 このプロシージャはクラス内で宣言されているため、メソッドになります。 属性とメソッドの下にあるものは、オブジェクトのライフまたはボディと呼ばれます。

すなわち 実際、これは新しいオブジェクトが作成されたときに呼び出されるコードです。 「Ref(Rectangle)R;」は、RectangleクラスのR変数の宣言を意味します。 次の行は、この変数を初期化しています。



Updateプロシージャ内のOutText呼び出しに注意してください-Javaの静的メソッドの類似点は何ですか?



では、継承を見てみましょう



 Begin Class Rectangle (Width, Height); Real Width, Height; Begin Real Area, Perimeter; Procedure Update; Begin Area := Width * Height; OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage; Perimeter := 2*(Width + Height); OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage; End of Update; Update; OutText("Rectangle created: "); OutFix(Width,2,6); OutFix(Height,2,6); OutImage; End of Rectangle; Rectangle Class ColouredRectangle (Color); Text Color; Begin OutText("ColouredRectangle created, color = "); OutText(Color); OutImage; End of ColouredRectangle; Ref(Rectangle) Cr; Cr :- New ColouredRectangle(10, 20, "Green"); End;
      
      





結果:



四角形が更新されています、面積= 200.00

四角形が更新されています、周囲= 60.00

作成された長方形:10.00 20.00

ColoredRectangleが作成され、色=緑



例からわかるように、サブクラスは通常のクラスとして定義されていますが、親のクラス名のプレフィックスが付いています。



また、追加のパラメーターのみを指定する必要があります。 親が持っていたパラメーターは自動的に追加されます。



ご覧のとおり、オブジェクトを作成するときは、すべてのパラメーターをリストする必要があります-最初に親、次に子孫。



現実世界のシミュレーション



では、何かを「刺激」しましょう。 それでも、この言語はもともと実世界のオブジェクトをモデル化するために作成されました。



歩行者の信号機の動作をシミュレートします。 信号機には2つの状態しかありません。 毎分、新しい人が交差点に近づき、信号機の状態に応じて、通りを横断するか、待機します。



 Simulation Begin Procedure report (message); Text message; Begin OutFix (Time, 2, 0); OutText (": " & message); OutImage; End; Integer u; Ref (Semaphor) s; Integer i; Process Class Semaphor; Begin Boolean isRed; Ref (Head) waitingPersons; waitingPersons:- New Head; isRed := false; report ("GREEN ON"); While True Do Begin Hold (2.3); isRed := true; report ("RED ON"); Hold (4.25); isRed := false; report ("GREEN ON"); While not s.waitingPersons.Empty Do Begin Activate s.waitingPersons.First; s.waitingPersons.First.Out; End; End; End; Process Class Person (pid); Integer pid; Begin OutFix (Time, 2, 0); OutText (" Peson "); OutInt(pid, 3); OutText (" is near the crossover."); OutImage; If s.isRed Then Begin Wait (s.waitingPersons); End; OutFix (Time, 2, 0); OutText (" Peson "); OutInt(pid, 3); OutText (" is going."); OutImage; End; Process Class PersonGenerator; Begin While True Do Begin i := i + 1; Hold (1); Activate new Person(i); End; End; s:- New Semaphor; i := 0; Activate s; Activate New PersonGenerator; Hold (20); End;
      
      





結果:



0.00:緑点灯

1.00 Peson 1はクロスオーバーの近くにあります。

1.00 Peson 1が予定されています。

2.00 Peson 2はクロスオーバーの近くにあります。

2.00 Peson 2が予定されています。

2.30:赤点灯

3.00 Peson 3はクロスオーバーの近くにあります。

4.00 Peson 4はクロスオーバーの近くにあります。

5.00 Peson 5はクロスオーバーの近くにあります。

6.00 Peson 6はクロスオーバーの近くにあります。

6.55:緑点灯

6.55 Peson 3が予定されています。

6.55 Peson 4が予定されています。

6.55 Peson 5が予定されています。

6.55 Peson 6が予定されています。

7.00 Peson 7はクロスオーバーの近くにあります。

7.00 Peson 7が予定されています。

8.00 Peson 8はクロスオーバーの近くにあります。

8.00 Peson 8が予定されています。

8.85:赤点灯

9.00 Peson 9はクロスオーバーの近くにあります。

10.00 Peson 10はクロスオーバーの近くにあります。

11.00 Peson 11はクロスオーバーの近くにあります。

12.00 Peson 12はクロスオーバーの近くにあります。

13.00 Peson 13はクロスオーバーの近くにあります。

13.10:緑点灯

13.10 Peson 9が予定されています。

13.10 Peson 10が予定されています。

13.10 Peson 11が予定されています。

13.10 Peson 12が予定されています。

13.10 Peson 13が予定されています。

14.00 Peson 14はクロスオーバーの近くにあります。

14.00 Peson 14が予定されています。

15.00 Peson 15はクロスオーバーの近くにあります。

15.00 Peson 15が予定されています。

15.40:赤点灯

16.00 Peson 16はクロスオーバーの近くにあります。

17.00 Peson 17はクロスオーバーの近くにあります。

18.00 Peson 18はクロスオーバーの近くにあります。

19.00 Peson 19はクロスオーバーの近くにあります。

19.65:緑点灯

19.65 Peson 16が予定されています。

19.65 Peson 17が予定されています。

19.65 Peson 18が予定されています。

19.65 Peson 19が予定されています。



メイン手順はシミュレーションから始まります。 合計シミュレーション時間は20分です。 レポート手順は補助的なものであり、シミュレーション時間の現在の値でデータを出力します。 緑色の状態のセマフォの信号は2.3分、赤色の状態では4.25分です。 状態はisRed変数によって設定されます。 waitingPersonsラインは、赤信号があったためすぐに通りを渡ることができなかった歩行者です。



PersonGeneratorは歩行者ジェネレーターです。毎分、新しい歩行者が信号機に近づきます。 ホールドは、シミュレーションの時間経過の役割を果たします。



プロセスは、このシミュレーションの「アクティブな」参加者のすべてのクラスの祖先です。

ご覧のとおり、コードは非常に直感的で複雑ではなく、言語に深く浸ることなく簡単なシミュレーションを実行できます。



古いプログラミング言語を勉強することで、現代言語の多くのものの起源を見つけることができます。 この場合、Simulaが動作しているコンピューターを考えると、Simulaがその先をどれだけ進んでいるかは驚くべきことです。 この言語でコードを書くことは理にかなっているとは言いません。 すべての例が、英語版のウィキであっても初めて動作するわけではないためです。 特に、仮想メソッドでは問題が発生しましたが、これは特定のコンパイラに関連している可能性が高いです。 しかし、トレーニングタスクと簡単なシミュレーションのために、Simulaは非常に便利なように思えました。



便利なリンク:



1. Linux、Mac、Windowsへのインストール

2. マルタ大学からのPLOの紹介ロシア語へ翻訳もあります。

3. クヌート自身による記事

4. 多くのリンクが機能するサイト



All Articles