Simula – Wikipedia, wolna encyklopedia
![]() Logo języka | |
Pojawienie się | 1965 |
---|---|
Paradygmat | |
Typowanie | |
Aktualna wersja stabilna | Standard SIMULA |
Twórca |
Simula – 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].
Simula 67 wprowadziła obiekty[2], klasy[3], dziedziczenie oraz podklasy[4], metody wirtualne[5] i współprogramy[6].
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 m.in. na C++, Object Pascal, Java, C#.
Historia
[edytuj | edytuj kod]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 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[9]
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 używana w ramach przedmiotów uniwersyteckich, na przykład profesor Jaroslav Sklenar uczy Simuli studentów na Uniwersytecie Maltańskim[10].
Przykładowy kod
[edytuj | edytuj kod]Hello world
[edytuj | edytuj kod]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 | edytuj kod]Bardziej realistyczny przykład z użyciem klas[3], podklas[4] i metod wirtualnych:[5]
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 | edytuj kod]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ą 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
[edytuj | edytuj kod]- ↑ Dahl, Myhrhaug i Nygaard 1970 ↓, 1.3.1.
- ↑ Dahl, Myhrhaug i Nygaard 1970 ↓, 2, 5.3.
- ↑ a b Dahl, Myhrhaug i Nygaard 1970 ↓, 1.3.3, 2.
- ↑ a b Dahl, Myhrhaug i Nygaard 1970 ↓, 2.2.1.
- ↑ a b Dahl, Myhrhaug i Nygaard 1970 ↓, 2.2.3.
- ↑ Dahl, Myhrhaug i Nygaard 1970 ↓, 9.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].
- ↑ Jan Rune [1], Compiling Simula, Institute for Studies in Research and Higher Education, Oslo, Norway
- ↑ GNU Cim
- ↑ Jarek Sklenar Web Page. Staff.um.edu.mt. [dostęp 2016-02-16].
- ↑ Dahl, Myhrhaug i Nygaard 1970 ↓, 14.2.
Bibliografia
[edytuj | edytuj kod]- Ole-Johan Dahl , Bjørn Myhrhaug , Kristen Nygaard , Common Base Language, Norwegian Computing Center, 1970 .
- IBM System 360/370 Compiler and Historical Documentation The Simula Standard Petera Sylvestra