Logo języka | |
| Pojawienie się | 1965 |
|---|---|
| Paradygmat | |
| Typowanie | |
| Aktualnawersja stabilna | Simula 67 |
| Twórca | |
Simula – dwajęzyki programowania, Simula I oraz Simula 67, opracowane w latach 60. XX w. wNorweskim Ośrodku Obliczeniowym w Oslo przezOle-Johana Dahla,Bjørna Myhrhauga iKristena Nygaarda. Syntaktycznie jest to rozszerzenie językaALGOL 60[1].
Simula 67 wprowadziłaobiekty[2],klasy[3],dziedziczenie oraz podklasy[4],metody wirtualne[5] iwspółprogramy[6].
Simulę uważa się za pierwszyobiektowy język programowania. Simula została stworzona z myślą o tworzeniusymulacji komputerowych.
Simula miała bezpośredni wpływ m.in. naC++,Object Pascal,Java,C#.
Poniższy opis bazuje na eseju historycznym Jana Rune Holmevika[7][8].
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 rozszerzeniemkompilowalnym doALGOLA 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 firmyUNIVAC w ramach promowania jej nowego komputera – UNIVAC 1107. Podczas swojej wizyty Nygaard przedstawił koncepcje zawarte w Simuli Robertowi Bemerowi, dyrektorowi programowania systemów wUNIVAC. Bemer był wielkim zwolennikiemALGOLA 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 firmyBurroughs oraz na rosyjski komputer URAL-16.
W 1966C.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 wOslo 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 koncepcjitypu 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:
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:
W listopadzie 2001 Dahl i Nygaard zostali odznaczeni MedalemJohna 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 odebraliNagrodę Turinga przyznaną im w 2001 roku „za współtworzenie koncepcji obiektowych języków programowania i opracowania języka Simula”.
Simula jest używana w ramach przedmiotów uniwersyteckich, na przykład profesor Jaroslav Sklenar uczy Simuli studentów naUniwersytecie Maltańskim[10].
PrzykładowyHello world w Simuli:
BeginOutText ("Hello World!");Outimage;End;W Simuli wielkość liter nie ma znaczenia.
Bardziej realistyczny przykład z użyciem klas[3], podklas[4] i metod wirtualnych:[5]
BeginClass Glyph;Virtual:Procedure printIsProcedure print;BeginEnd; GlyphClass Char (c);Character c;BeginProcedure print; OutChar(c);End; GlyphClass Line (elements);Ref (Glyph)Array elements;BeginProcedure print;BeginInteger i;For i:= 1Step 1Until 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 definiujeklasę Glyph z dwoma podklasami – Char oraz Line. Implementacjawirtualnej metodyprint 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.
Simula zawiera pakiet „simulation”[11], 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ą zrozkładu normalnego). Symulacja opisanej sytuacji może zostać zaimplementowana w ten sposób:
SimulationBeginClass FittingRoom;BeginRef (Head) door;Boolean inUse;Procedure request;BeginIf inUseThenBegin 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; ProcessClass Person (pname);Text pname;BeginWhileTrueDoBegin 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;ActivateNew Person ("Sam");ActivateNew Person ("Sally");ActivateNew Person ("Andy"); Hold (100);End;Główny blok jest poprzedzony słowemSimulation 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.
| 1GL | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2GL/ Język drugiej generacji/ Asembler | |||||||||||||||
| 3GL / Język trzeciej generacji |
| ||||||||||||||
| 4GL/ Język czwartej generacji/ Język dziedzinowy |
| ||||||||||||||
| 5GL/Logiczne | |||||||||||||||
| Ezoteryczne | |||||||||||||||
| Inne |