Simula

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Simula
Pojawienie się 1965
Paradygmat obiektowy
Typowanie statyczne
Twórca Ole-Johan Dahl, Kristen Nygaard

Simula to dwa języki programowania, Simula I oraz Simula 67, opracowane w latach 60. XX w. w Norweskim Ośrodku Obliczeniowym w Oslo przez Ole-Johana Dahla , Bjørna Myhrhauga i Kristena Nygaarda. Syntaktycznie jest to rozszerzenie języka ALGOL 60.[1]:1.3.1

Simula 67 wprowadziła obiekty,[1]:2, 5.3 klasy,[1]:1.3.3, 2 dziedziczenie oraz podklasy,[1]:2.2.1 metody wirtualne[1]:2.2.3 i współprogramy[1]:9.2.

Simulę uważa się za pierwszy obiektowy język programowania. Simula została stworzona z myślą o tworzeniu symulacji komputerowych.

Simula miała bezpośredni wpływ na wygląd takich języków jak C++, Object Pascal, Java, C#.

Historia[edytuj]

Poniższy opis bazuje na eseju historycznym Jana Rune Holmevika.[2][3]

Kristen Nygaard zaczął pisać symulacje komputerowe w 1957 roku. Dostrzegł on potrzebę znalezienia lepszego sposobu na opisywanie symulowanych procesów i interakcji. Postanowił stworzyć język programowania, który mu w tym pomoże. Uświadomił sobie, że potrzebuje kogoś bardziej od siebie biegłego w programowaniu. Ole-Johan Dahl dołączył do niego w styczniu 1962. Krótko po tym postanowili, że tworzony przez nich język będzie rozszerzeniem kompilowalnym do ALGOLA 60. W maju 1962 został stworzony język "SIMULA I", służący do tworzenia symulacji komputerowych.

Pod koniec maja 1962 Kristen Nygaard został zaproszony do firmy UNIVAC w ramach promowania jej nowego komputera - UNIVAC 1107. Podczas swojej wizyty Nygaard przedstawił koncepcje zawarte w Simuli Robertowi Bemerowi, dyrektorowi programowania systemów w UNIVAC. Bemer był wielkim zwolennikiem ALGOLA i koncepcja Simuli bardzo do niego przemawiała. Bemer przewodniczył również spotkaniu na drugiej międzynarodowej konferencji o przetwarzaniu informacji, organizowanej przez International Federation for Information Processing (IFIP). Zaprosił Nygaarda, który zaprezentował swój referat “SIMULA - rozszerzenie ALGOLA do opisu sieci zdarzeń dyskretnych" ("SIMULA - An Extension of ALGOL to the Description of Discrete-Event Networks").

Norweski Ośrodek Obliczeniowy nabył po obniżonej cenie UNIVACA 1107 w sierpniu 1963. Dahl zaimplementował na nim kompilator języka SIMULA I w ramach umowy z firmą UNIVAC. Implementacja bazowała na kompilatorze ALGOLA 60. Prace zostały zakończone w styczniu 1965. Kilka następnych lat Dahl i Nygaard spędzili na uczeniu Simuli. Rozprzestrzeniła się ona na wiele krajów. SIMULA I została później zaimplementowana na komputer B5500 firmy Burroughs oraz na rosyjski komputer URAL-16.

W 1966 C.A.R. Hoare wprowadził koncepcję klasy rekordowej, którą Dahl i Nygaard nieco rozszerzyli (wprowadzając m. in. prefiksowanie), tak by pasowała ona do pojęcia procesu w ich systemie. Dahl i Nygaard zaprezentowali swój artykuł na temat deklaracji klas i podklas na konferencji IFIP dotyczącej języków symulacji w Oslo w maju 1967. Artykuł ten stał się pierwszą formalną definicją Simuli 67. W czerwcu 1967 odbyła się konferencja mająca na celu standaryzację języka oraz rozpoczęcie jego implementacji. Dahl zaproponował połączenie koncepcji typu oraz klasy w jedno. Doprowadziło to do poważnych dyskusji i propozycja została odrzucona przez komitet. SIMULA 67 została formalnie ustandaryzowana na pierwszym spotkaniu organizacji SIMULA Standards Group w lutym 1968.

Pod koniec lat sześćdziesiątych i na początku siedemdziesiątych istniały cztery główne implementacje Simuli:

  • UNIVAC 1100 Norweskiego Ośrodka Obliczeniowego
  • IBM System/360 i IBM System/370 Norweskiego Ośrodka Obliczeniowego
  • CDC 3000 Uniwersytetu w Oslo
  • TOPS-10 Szwedzkiego Instytutu Badań dla Obrony Narodowej (Swedish Research Institute for National Defence)

Implementacje te zostały przeniesione na wiele różnych platform. W implementacji dla systemu TOPS-10 zostały zaimplementowane koncepcje publicznych, prywatnych i chronionych zmiennych i metod. Koncepcje te zostały później wcielone do Simuli 87. Simula 87 jest to ostatni standard, przeniesiony na wiele różnych platform. Istnieją jego trzy główne implementacje:

  • Simula AS
  • Lund Simula
  • GNU Cim[4]

W listopadzie 2001 Dahl i Nygaard zostali odznaczeni Medalem Johna von Neumanna (IEEE John von Neumann Medal) “za wprowadzenie koncepcji będących podstawą dla programowania obiektowego przez zaprojektowanie i implementację SIMULI 67". W lutym 2002 odebrali Nagrodę Turinga przyznaną im w 2001 roku "za współtworzenie koncepcji obiektowych języków programowania i opracowania języka Simula”.

Simula jest wciąż używana w ramach wielu różnych przedmiotów uniwersyteckich, na przykład Jarek Sklenar uczy Simuli studentów na University of Malta[5].

Przykładowy kod[edytuj]

Hello world[edytuj]

Przykładowy Hello world w Simuli:

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

W Simuli wielkość liter nie ma znaczenia.

Klasy, podklasy i metody wirtualne[edytuj]

Bardziej realistyczny przykład z użyciem klas[1]:1.3.3, 2, podklas[1]:2.2.1 i metod wirtualnych:[1]:2.2.3

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;

Powyższy przykład definiuje klasę Glyph z dwoma podklasami - Char oraz Line. Implementacja wirtualnej metody print jest zdefiniowana w podklasach. Wykonanie programu rozpoczyna się od wykonania bloku “Main program”. W Simuli nie istnieje koncepcja klas abstrakcyjnych - klasy z czystymi (pozbawionymi implementacji) metodami wirtualnymi mogą być zainicjowane. Jednak wywołanie takiej metody skutkuje błędem wykonania.

Symulacja[edytuj]

Simula zawiera pakiet “simulation”[1]:14.2, służący do tworzenia symulacji w systemie zdarzeń dyskretnych.

Sam, Sally i Andy kupują ubrania. Muszą dzielić między siebie jedną przymierzalnię. Każde z nich rozgląda się po sklepie przez około 12 minut, a następnie korzysta z przymierzalni przez 3 minuty (oba czasy pochodzą z rozkładu normalnego). Symulacja opisanej sytuacji może zostać zaimplementowana w ten sposób:

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;

Główny blok jest poprzedzony słowem Simulation dla umożliwienia symulacji. Pakiet “simulation” może zostać użyty na każdym bloku. Można nawet zagnieżdżać w sobie bloki z symulacjami (by symulować wykonywanie symulacji).

Obiekt przymierzalni używa kolejki (door). Gdy ktoś żąda dostępu do przymierzalni, a jest ona zajęta, musi on poczekać w kolejce (Wait (door)). W momencie gdy ktoś opuszcza przymierzalnie, pierwsza osoba (o ile taka istnieje) jest budzona z oczekiwania (Activate door.first) i usuwana z kolejki (door.First.Out).

Person to podklasa klasy Process. Jej zachowanie jest zdefiniowane poprzez wywołania “hold” (gdy osoba rozgląda się po sklepie lub jest zajęta przymierzaniem) oraz wywołania metod na obiekcie przymierzalni w momencie próby wejścia do przymierzalni oraz wychodzenia z niej.

Główny program tworzy wszystkie obiekty oraz aktywuje wszystkie osoby. Następnie czeka 100 minut symulowanego czasu, zanim zakończy działanie.

Przypisy

  1. a b c d e f g h i j Ole-Johan Dahl, Bjørn Myhrhaug, and Kristen Nygaard (1970), :[1], Common Base Language, Norwegian Computing Center
  2. Jan Rune Holmevik. Compiling Simula: A historical study of technological genesis. „IEEE Annals of the History of Computing”. 16 (4), s. 25–37, 1994. DOI: 10.1109/85.329756. [dostęp 2010-05-12]. 
  3. Jan Rune [2], Compiling Simula, Institute for Studies in Research and Higher Education, Oslo, Norway
  4. GNU Cim
  5. Jarek Sklenar Web Page. Staff.um.edu.mt. [dostęp 2016-02-16].

Źródła[edytuj]