MODSIM – podstawy języka
Języki symulacyjne - MODSIM
1
Michał Kapałka
mkapalka@wat.edu.pl
MODSIM – Podstawy języka
1.
Podstawowe cechy języka:
a.
język obiektowo zorientowany do programowania symulacji
dyskretno-zdarzeniowej
b.
składnia zbliżona do składni języków: Ada, Modula 2, Pascal
c.
wersje dla systemów: Windows, Windows NT, UNIX, OS/2 na
platformy sprzętowe PC oraz RISC
d.
MODSIM II wymaga preinstalowanego środowiska C/C++ (np..
MSVC v 1.5)
2.
Umożliwia realizację:
a.
upływu czasu
b.
interakcji obiektów
c.
wizualizacji i animacji
d.
monitorowania przebiegu symulacji
3.
Programy w MODSIM
Moduły:
- dokładnie jeden moduł główny
•
MAIN MODULE (nazewnictwo: Mnazwa.mod)
- dowolną liczbę par modułów skojarzonych w osobnych plikach:
•
DEFINITION MODULE - zawiera deklaracje struktur, procedur i
obiektów; udostępnia procedury innym modułom, nie może być
kodu wykonywalnego (nazewnictwo: Dnazwa.mod)
•
IMPLEMENTATION MODULE - zawiera kod wykonywalny oraz
dodatkowe deklaracje (nazewnictwo: Inazwa.mod)
- stałe, typy, zmienne i procedury zadeklarowane w module
DEFINITION są widoczne w skojarzonym IMPLEMENTATION oraz
mogą być importowane z innych modułów
Importowanie:
•
elementy zaimportowane do modułu DEFINITION nie są
widoczne w IMPLEMENTATION
•
nie można importować z modułu MAIN
•
do importowania służy polecenie IMPORT, np.
FROM UtilMod IMPORT DateTime, Delay;
•
sekwencja FROM ... IMPORT ... musi być umieszczona na
początku modułu (przed innymi sekwencjami poleceń)
Identyfikatory:
•
Nazwy zdefiniowanych przez użytkownika elementów
programowych, np. modułów, stałych, zmiennych, typów,
procedur itd.
•
Wymagania:
o
nierozdzielony ciąg znaków (bez spacji, myślników oraz
podkreśleń)- liter i/lub cyfr
o
pierwszy znak- litera (!)
•
Uwaga: w MODSIM rozróżnia się małe/wielkie litery
•
Przykład:
o
licznik, LICZNIK, Pole1, liczbaStanowiskObslugi...
Deklaracje:
•
Słowa kluczowe położone przed częścią kodu programowego,
opisującą definiowane przez użytkownika wyrażenia
przyjmujące stałe i zmienne wartości oraz opisujące nowe typy
danych
•
Definiowanie stałej wartości:
o
CONST
•
MaxLiczbaPacjentow = 30;
•
Definiowanie nowego typu danych:
o
TYPE
•
DniWolne = ( Sobota, Niedziela );
•
DynamicznaTablica = ARRAY INTEGER OF
REAL;
•
Definiowanie wyrażenia przyjmującego wartości zmienne:
o
VAR
•
liczbaPacjentow : INTEGER;
•
tablica : DynamicznaTablica; {zmienna referencyjna}
•
Automatyczna inicjalizacja wartości zmiennych podstawowego
typu :INTEGER: 0,REAL : 0.0,BOOLEAN : FALSE,STRING: null
,CHAR: CHR(0)
Operatory:
Podstawowe działania
:=
przypisanie
+
dodawanie/konkatenacja łańcuchów string
-
odejmowanie/znak ujemności
*
mnożenie
/
dzielenie rzeczywiste
DIV
dzielenie całkowitoliczbowe
MOD
modulo
Relacje logiczne
= ,<> ,<, <=, >
Działania logiczne
OR , AND, NOT
Uwaga: operandy muszą być kompatybilne
Instrukcje sterujące:
Instrukcja warunkowa IF
Instrukcja wyboru CASE
IF Wyrażenie logiczne1
Sekwencja działań
[ ELSIF Wyrażenie logiczne2
Sekwencja działań]
[ ELSIF Wyrażenie logiczne3
Sekwencja działań]
[ ELSE
Sekwencja działań ]
END IF;
CASE [typ prosty | string]
WHEN a..e, m: Sekwencja działań
WHEN p: Sekwencja działań
WHEN x...z: Sekwencja działań
[ OTHERWISE
Sekwencja działań ]
END CASE;
Instrukcje pętli WHILE
Instrukcje pętli LOOP
WHILE Wyrażenie logiczne
Sekwencja działań
END WHILE;
LOOP
Sekwencja działań
END LOOP;
Instrukcje pętli REPEAT
Instrukcje pętli FOR
REPEAT
Sekwencja działań
UNTIL Wyrażenie logiczne;
FOR ident := wyrażenie TO | DOWNTO
wyrażenie [BY wyrażenie]
Sekwencja działań
END FOR;
Instrukcje pętli FOREACH
FOREACH obiekt IN GROUP
Sekwencja działań
END FOREACH;
Instrukcja natychmiastowego opuszczenia pętli: EXIT
Uwaga: -END występuje w parze z nazwą pętli
Procedury:
•
Nazwana, ograniczona kluczowymi słowami część kodu
programowego, dostępna z innych części programu poprzez
nazwę, realizująca określone operacje
•
Typy:
o
funkcje- określają zwrotnie wartość
o
procedury- nie zwracają żadnych wartości
•
Deklaracja :
PROCEDURE NazwaProcedury(IN w1:W1;INOUT w2:W2;OUT
w3:W3)[ : TypZwracanejWartości];
CONST ...TYPE ... VAR ...
MODSIM – podstawy języka
Języki symulacyjne - MODSIM
2
Michał Kapałka
mkapalka@wat.edu.pl
BEGIN
......
[RETURN ...]
END PROCEDURE;
•
Wywołanie procedury:
o
[w := ] NazwaProcedury(... , ... , ...);
•
Lista parametrów:
o
IN- wartość przekazywana do procedury
o
OUT- wartość zwracana przez procedurę po słowie
RETURN
o
INOUT- wartość zmiennej przekazana do procedury i
zwrócona do tej zmiennej, bez tworzenia kopii
zmiennej
Złożone typy danych:
Struktury statyczne :
FIXED ARRAY- uporządkowany skończony zbiór elementów jednego
typu
Pole = (..., figuraSzachowa, ...);
planszaSzachowa = FIXED ARRAY [1..8],[1..8] OF Pole;
•
elementy tablicy są jednego typu
•
elementy tablicy muszą mieć ustalony rozmiar
•
alokują ilość pamięci, zależną od ilości i typu
zadeklarowanych w definicji tablicy elementów
•
dostęp do elementów tablicy przez indeksy: plansza[2, 3]
•
nie mogą być przekazywane jako parametr IN procedur
FIXED RECORD- zdefiniowana przez użytkownika struktura danych
złożona ze skończonej liczby nazwanych pól prostego lub złożonego
typu
SrodekWalki = FIXED RECORD;
typ : TypSrodkaWalki;
zasieg : REAL;
szybkostrzelnosc : REAL;
jednostkaAmunicyjna : INTEGER;
END RECORD;
•
elementy rekordu muszą mieć ustalony rozmiar
•
alokują ilość pamięci, zależną od ilości i typu zadeklarowanych w
definicji rekordu pól
•
dostęp do pola uzyskuje się przez złożenie nazwy rekordu
oraz nazwy pola, np. srodekwalki.zasieg
•
może być używany w operacjach arytmetycznych oraz
wyrażeniach logicznych, np. srodekwalki.zasieg := 500.0;
Struktury dynamiczne :
ARRAY : tablica dynamicznie powoływana i usuwana przez
procedury wbudowane NEW oraz DISPOSE
VAR kolejkiSklepu : ARRAY INTEGER, INTEGER OF BOOLEAN;
k : INTEGER;
BEGIN
... NEW( kolejkiSklepu, 1..5);
FOR k := 1 TO 5
NEW(kolejkiSklepu[k], 1..k); DISPOSE(kolejkiSklepu[k]);
END FOR; ...
DISPOSE(kolejkiSklepu);
•
w przypadku tablicy wielowymiarowej należy pamiętać
o oddzielnym powołaniu jej pól
•
procedurą DISPOSE można zwalniać tylko wcześniej
zaalokowane obszary pamięci
•
do chwili powołania tablicy typ ARRAY jest
inicjalizowany na wartość NILARRAY
•
tablice mogą być operandami w wyrażeniach logicznych
’ = ’, ’ < > ’.
RECORD : struktura danych podobna do FIXED RECORD
- różnice:
•
zajmuje pamięć dopiero po wykonaniu NEW(...), zwalnia
natychmiast po wykonaniu DISPOSE(...)
•
pola mogą być dynamicznymi strukturami danych
TYPE
graczType = RECORD
imie : STRING;
team : STRING;
pozycja : positionType;
kolejnyGracz : graczType;
END RECORD;
VAR
team, gracz : playerType;
BEGIN
NEW(gracz);
team :=gracz;
NEW(gracz);
gracz.kolejnyGracz := team;
team := gracz;...
•
dla rekordu predefiniowane są typy:
NILREC - wartość zmiennej typu RECORD do chwili zaalokowania
pamięci
ANYREC - kompatybilny z każdym typem RECORD, nie wolno
używać go w procedurze NEW
•
rekordy mogą być operandami w wyrażeniach logicznych z
operatorami: ’ = ’ , ’ < > ’
Obiekty:
OBJECT : dynamicznie powoływana i usuwana struktura danych (
poprzez NEW(...) i DISPOSE(...) )
•
zajmuje pamięć dopiero po wykonaniu NEW(...), zwalnia
natychmiast po wykonaniu DISPOSE(...)
•
pola opisują cechy obiektu- mogą być dowolnego typu
•
metody opisują zachowanie obiektu- są odpowiednio
formułowanymi procedurami
MODSIM II zapewnia:
•
dziedziczenie
•
polimorfizm
•
hermetyzację danych i metod
•
interakcje obiektów
•
hierarchiczność- kompatybilność typów w dzedziczeniu
Podstawowe metody:
ASK - działanie natychmiastowe, podobne do działania procedury
lub funkcji- nie wytraca czasu symulacji
Deklaracja:
ASK METHOD nazwa_metody [(lista parametów)]
ASK METHOD PodajStan( INOUT stan : REAL );
Wywołanie:
ASK obiekt [TO] nazwa_metody [(lista parametrów)]
ASK kasa TO PodajStan( aktualnyStan );
TELL - związana jest z upływem czasu symulacji;
w jednej chwili może być wykonywane kilka metod TELL
Deklaracja:
TELL METHOD nazwa_metody [(lista parametrów)]
TELL METHOD Obsluga( IN czas : REAL );
Wywołanie:
TELL obiekt [TO] nazwa_metody [(lista parametrów)] [ IN
opóźnienie]
TELL kasa TO Obsluga( 5.0 );
WAIT DURATION,WAIT FOR, WAIT FOR … TO FIRE – związane z
synchronizacją i upływem czasu