CSL-CROOK - Podstawowe elementy języka
Modelowanie jest techniką służącą do uzyskiwania informacji o charakterystykach układu bez uruchamiania tego układu dokonywania na nim eksperymentów. Model jest budowany w taki sposób aby wyniki uzyskiwane z działań na modelu lub z jego modyfikacji były zgodne z wynikami jakich należy oczekiwać z działań na układzie rzeczywistym lub z jego modyfikacji. Technika modelowania znajduje się szerokie zastosowanie w badaniach operacyjnych, a także może być stosowana do badań w takich dziedzinach jak psy przemysłowe, systemy rozliczeń finansowych lub metody marketingu. W szczególności modelowanie umożliwia ocenę efektów różnych podejść i strategii w rozmaitych układach przed ich zrealizowaniem, eliminując potrzebę dokonywania wielu zmian po ich uruchomieniu.
Modelowanie jest rzadko stosowane do układów stacjonarnych. O wiele bardziej interesujące i przydatne jest jego użycie do układów działających w tzw. czasie rzeczywistym, przy czym w prawie wszystkich takich układach występuje zagadnienie kolejek. Kolejka powstaje wówczas, gdy pewna gdy pewna liczba pozycji ewidencyjnych musi odczekiwać przed wprowadzeniem w odpowiednich stanach do przetwarzania. Prędkość wzrostu kolejki zależy od prędkości z jaką kolejne pozycje dołączają się do kolejki oraz od czasu potrzebnego na przetworzenie poszczególnych pozycji. Obydwie czynności mogą zmienić się w sposób losowy lub stochastyczny; problem polega na uzyskaniu informacji o sposobie w jaki zmienia się rozmiar kolejki. Można na przykład uzyskiwać informację o średniej długości kolejki lub o prawdopodobieństwie przekroczenia określonej jej długości. Jeśli mamy do czynienia z pewnym stopniem złożoności procesu (np: jeśli występuje szereg wzajemnie powiązanych kolejek) analiza matematyczna zagadnienia staje się niezmiennie skomplikowana.
Technika modelowania służy do stworzenia modelu poprzez opracowanie odpowiednich list pozycji w każdym stanie procesu oraz przesyłanie tych pozycji jedna za drugą we właściwym porządku chronologicznym. Cała wymagana informacja o procesie może być uzyskana poprzez badanie zachowania się modelu. Technika ta może być wprawdzie realizowana ręcznie - za pomocą ołówka i papieru, tym niemniej, z wyjątkiem najprostszych przypadków, jest to praca na tyle uciążliwa, że staje się niezbędne użycie komputera. Takie języki jak FORTRAN i ALGOL posiadają tylko podstawowe udogodnienia z punktu widzenia modelowania, wobec czego powstało szereg języków specjalizowanych takich jak: SIMULA, GPSS czy CSL. Oprócz uproszczenia w pisaniu programów modelujących, języki te znajdują wiele zastosowań poza dziedziną modelowania, zwłaszcza dzięki zawartym w nich wydatnym udogodnieniom dla sprawdzenia i przegrupowania elementów w listach.
CSL jest problemowym językiem programowania tak pomyślanym, aby umożliwić programiście wyrażenie struktury modelu sposobem możliwie najbliższym temu, w jaki opisywałby on działanie procesu rzeczywistego, który ma być modelowany. Załóżmy na przykład, że badanym układem jest zakład fryzjerski z kilkoma fryzjerami. Część opisu funkcjonowania takiego zakładu może być następująca:
Istnieje kolejka wolnych w danej chwili fryzjerów oraz kolejka klientów czekających na obsłużenie. Jeśli jest jeden lub więcej wolnych fryzjerów oraz jeden lub więcej czekających klientów, wówczas pierwszy z wolnych fryzjerów staje się zajęty a liczba czekających klientów zmniejsza się o jeden. Może to być wyrażone w języku CSL poprzez szereg wyrażeń jak:
KLIENCI GT 0 FIND N WOLNIFRYZJERZY FIRST FRYZJER. N FROM WOLNIFRYZJERZY KLIENCI=KLIENCI - 1
Składniki modelu są nazywane obiektami a każdy obiekt jest elementem klasy podobnych obiektów. Na przykład w modelu przedstawiającym ruch statków, cumowanie, ładowanie i rozładowanie w porcie, mogą występować klasy nazywane STATEK, NABRZEŻE, DZWIG, itd. Obiekt jest identyfikowany poprzez nazwę klasy wraz z następującym po niej oznaczeniem nazywanym indeksem obiektu. Na przykład obiekty z klasy STATEK mogą być oznaczone STATEK.1, STATEK.2, STATEK.3, ... Z każdym obiektem może być związany szereg zmiennych indeksowych, np: STATEK.1(1), STATEK.1(2), zwanych atrybutami , które mogą być używane do przechowywania informacji cyfrowej opisującej właściwości lub stan obiektu.
O wiele bardziej użytecznym i efektywnym sposobem rejestrowania stanów obiektów jest umieszczenie nazw obiektów w zbiorach. Zbiór jest zestawem obiektów wziętych z pewnej klasy. Zbiór jest charakteryzowany zazwyczaj szczególną własnością lub stanem wspólnym dla wszystkich obiektów w zbiorze. Na przykład zbiory o nazwach WMORZU, WPORCIE mogą być określone wewnątrz klasy STATEK. Istnieją dwa rodzaje zbiorów: zbiory uporządkowane i zbiory boole'owskie. Zbiory uporządkowane mogą zawierać obiekty w dowolnym porządku, przy czym porządek ten jest określony sposobem formowania zbioru podczas czynności w trakcie modelowania. Zbiory uporządkowane mogą być zatem używane do reprezentowania kolejek. Zbiory boole'owskie stanowią zawsze zestawienie obiektów w takim porządku, w jakim występują w klasach, wobec czego zbiory te nie mogą być używane do reprezentowania kolejek. Zbiory boole'owskie mogą być natomiast przetwarzane szybciej niż zbiory uporządkowane. Zazwyczaj możliwe jest zdefiniowanie zbiorów w modelu w taki sposób aby stan każdego z obiektów był w każdej chwili całkowicie określony poprzez zbiory, do których ten obiekt należy. Każda zmiana stanu obiektu może być więc zarejestrowana poprzez przeniesienie tego obiektu z jednego zbioru do drugiego. W języku CSL przewidziano szereg udogodnień do opero wania zbiorami. Obiekty mogą być dodawane do zbiorów lub usuwane z nich, zarówno pojedynczo jak grupami. Możliwe jest też badanie elementów składowych poszczególnych zbiorów. Możliwe jest też badanie elementów składowych poszczególnych zbiorów. Przy uwzględnieniu poszczególnych ograniczeń można powiedzieć, że wszystkie te operacje mogą być wykonywane zarówno na zbiorach uporządkowanych jak i na zbiorach boole'owskich.
Program w języku CSL jest złożony z szeregu działań. Na każde działanie składa się z kolei szereg czynności zmieniających stan modelu. Czynności te mogą być wykonywane jeśli tylko spełniony jest odpowiedni zespół warunków. Właściwości logiczne języka są dostosowane do opisanej struktury funkcjonalnej. Programista musi określić zestawy warunków tworząc łańcuch badań. Możliwe jest uzyskanie dwojakiego wyniku: jeśli wszystkie warunki są spełnione wówczas wynik jest prawdą dla całego łańcucha, w przeciwnym przypadku wynik jest fałszem.
Tak więc dowolna liczba badań może być połączona w pojedyncze decyzje, dzięki czemu nie jest konieczne wykonywanie specjalnych czynności w specjalnie wybranym czasie. Seria badań określona w łańcuchu badań, może być także wykonana na każdym z elementów przetworzonego zbioru po kolei. Wymagana do tego decyzja jest tworzona w dostosowaniu do liczby elementów zbioru, które muszą spełnić określone warunki.
Szeroko rozumiane możliwości obróbki zbiorów oraz funkcje logiczne języka CSL mogą być wykorzystane do przetwarzania danych otrzymywanych z procesu rzeczywistego, zamiast danych z procesu modelowego. Dzięki temu program CSL może być stosowany do sterowania bieżącym ciągiem operacji lub do podejmowania decyzji taktycznych na najbliższą przyszłość w odniesieniu do rozważanego układu.
Program modelujący wymaga pewnych sposobów do reprezentowania biegu czasu symulacji. W modelu typu dyskretnego, takim jaki jest model utworzony przez program CSL, wystarczy brać pod uwagę tylko te momenty czasowe, w których następują zmiany stanu. Czas przesuwa się zatem naprzód skokowo w momentach przejść z jednego stanu do następnego. W celu określenia momentów, w których mają miejsce te zmiany, programista musi określić pewną liczbę atrybutów czasowych, które mają być przyporządkowane obiektom w taki sam sposób, jak ich atrybuty, albo też atrybuty te mogą występować jako oddzielne zmienne.
Podczas przebiegu modelowania, w atrybutach czasu są umieszczone wartości reprezentujące czas jaki musi upłynąć przed każdą mającą nastąpić zmianą, czyli zdarzeniem - np. zmianą stanu obiektu lub rozpoczęciem określonej czynności. Program postępu czasu określa najmniejszą z tych wartości i powoduje odjęcie jej od wartości znajdujących się we wszystkich atrybutach czasu. Równocześnie zmienna zwana CLOCK (zegar) ulega zwiększeniu o wybraną przez program wartość postępu czasu. Zmienna ta reprezentuje zatem całkowity czas przebiegu modelowania.
Alfabet języka
- litery alfabetu łacińskiego od A do Z
- cyfry arabskie od 0 do 9
- znaki specjalne: + , - , * , / , = , (,) , . , $, SP
Nazwy
Nazwą jest ciąg liter użytych do identyfikacji zmiennych, tablic, obiektów, zbiorów i klas. Pierwszym znakiem nazwy musi być litera. Nie dotyczy to nazw funkcji i nazw podprogramów. Nazwa funkcji lub podprogramów musi być poprzedzona znakiem "$", dla poinformowania translatora ,że nazwa ta musi pozostać niezmieniona przy tłumaczeniu programu i nie może być zastąpiona nową nazwą w programie wygenerowanym przez translator CSL. Nazwa nie może być identyczna z jakimkolwiek słowem strukturalnym języka CSL i powinna mieć tylko jedno znaczenie wewnątrz danego segmentu.
Nazwy mogą składać się z sekwencji do 18 liter z kodu ISO-7. Niedopuszczalne jest stosowanie znaków specjalnych.
Instrukcje i dyrektywy
Program w języku CSL może być wprowadzony do translatora z klawiatury, taśmy papierowej lub zbioru dyskowego. Program taki zawiera dyrektywy i instrukcje. Instrukcje dostarczają informacji o koniecznych do wykonania czynnościach. Dyrektywy dostarczają maszynie informacji o budowie programu i organizacji obliczeń (opisane w pierwszej części opracowania). Każda instrukcja musi zaczynać się od nowego wiersza i może być kontynuowana, lecz nie dłużej niż w dwóch następnych wierszach.
Format wiersza
Jeden wiersz składa się z 80 znaków. Instrukcje są zapisane w kolumnach od 7-72 każdego wiersza. Kolumny od 73-80 tworzą pole identyfikacji wiersza i nie podlegają obróbce przez translator. Mogą zawierać dowolne wskaźniki identyfikacyjne. Są one reprodukowane podczas translacji w wydruku programu źródłowego.
Instrukcje w programie mogą być numerowane. Numeracja jest dokonywana za pomocą odpowiednio dobranych liczb z zakresu od 1 do 3999 zapisanych w kolumnach od 2 do 5 wiersza instrukcji. Numery te (etykiety) muszą się kończyć w 5-tej kolumnie i nie mogą się powtarzać w obrębie tego samego segmentu programu oraz nie muszą być uporządkowane wg kolejności.
Kolumna 6 w wierszu przeznaczona jest na znak kontynuacji poprzedniego wiersza. Znakiem kontynuacji może być dowolny znak w 6 kolumnie różny od zera lub spacji.
Wiersze zawierające komentarze są oznaczone przez literę "C" w pierwszej kolumnie wiersza. Wiersze komentarza nie są przetwarzane przez translator. Tekst komentarza może być zapisany gdziekolwiek w pozostałej części wiersza, aż do kolumny 80. Jest on reprodukowany podczas translacji w wydruku programu źródłowego.
Instrukcje zapisane w FORTRANIE mogą być włączone do segmentów napisanych w języku CSL, jednak pod warunkiem oznaczenia ich literą "F" znajdującą się w pierwszej kolumnie wiersza. Jeżeli instrukcja fortranowska posiada wiersze kontynuacji to muszą one również być poprzedzone literą "F" w pierwszej kolumnie wiersza. Nie dotyczy to instrukcji we/wy zapisanych w fortranie, które zostały przyjęte bez zmian w języku CSL.
Standardową pozycją początkową dla każdej instrukcji jest 7 kolumna wiersza. Przesunięcie w prawo od tej pozycji może mieć miejsce tylko wówczas, gdy dana instrukcja stanowi część instrukcji złożonej. Instrukcja złożona składa się z instrukcji nagłówkowej, po której następuje grupa wcięta. Grupa wcięta stanowi sekwencję instrukcji o wspólnym stopniu wcięcia wierszy, większym niż stopień wcięcia instrukcji nagłówkowej (grupa wcięta przesunięta jest w prawo o 2 kolumny). Instrukcja złożona może się składać z dalszych instrukcji złożonych (wewnętrznych). Wewnętrzna instrukcja złożona składa się z instrukcji nagłówkowej o stopniu wcięcia odpowiadającemu grupie wciętej, w której pojawia się dana instrukcja wewnętrzna oraz z następującej po niej grupie wciętej o nowym stopniu wcięcia, jeszcze bardziej na prawo o 2 kolumny. Dopuszczalne jest 19 stopni wcięć wierszy, czyli poszczególne grupy instrukcji rozpoczynają się w kolumnach 7, 9, 11, 13, ..., 43, 45.
Zmienne i stałe liczbowe
W języku CSL wszystkie wartości liczbowe mogą przybierać postać typu:
- INTEGER (całkowite)
- REAL (rzeczywiste)
Stała całkowita może przybierać wartości w zakresie od -32768 do +32767. Liczba typu INTEGER jest zapisywana w programie jako sekwencja cyfr ze znakiem lub bez znaku i bez kropki dziesiętnej.
Stała rzeczywista jest zapisywana w programie jako sekwencja cyfr ze znakiem lub bez znaku i z kropką dziesiętną lub wykładnikiem po literze E.
Wszystkie zmienne wyrażone w języku CSL mają wartości typu INTEGER. Jeżeli zmienną należy użyć jako wartość typu REAL, to zmiana typu wartości odbywa się za pomocą instrukcji FLOAT. Zmienne wymagające stosowania wartości typu REAL muszą być deklarowane przez instrukcję FLOAT (float-point).
Instrukcja deklarująca ma postać:
- FLOAT n1 [, n2 [, n3 ..... ]]
gdzie:
- n1, n2, n3,... - nazwy zmiennych
Grupa zmiennych może być definiowana łącznie jako tablica. Może ona być używana w wypadku, gdy jest zadeklarowana instrukcją ARRAY następującej postaci:
- ARRAY n1(i1 [, i2][, i3]) [, n2(j1[, j2][, j3])]
gdzie:
- n1, n2, n3, ... - nazwy tablic
- i1, i2, i3, ... - wartości indeksów (max liczba indeks=3)
Zmienne oraz zmienne indeksowane w języku CSL mogą być wyrażone jako wartości liczbowe i mogą być używane do budowy wyrażeń arytmetycznych.
Wyrażenia arytmetyczne
CSL, podobnie jak język FORTRAN, umożliwia programiście zapisywanie wyrażeń arytmetycznych. Mogą one zawierać stałe liczbowe, zmienne, funkcje, nawiasy i operatory arytmetyczne. (+, -, *, /, **, - operatory arytmetyczne). Nawiasy okrągłe mogą być używane jak w zapisie algebraicznym, tj. Do wskazania kolejności wykonywania działań. Funkcje standardowe, które są dostępne w FORTRANIE-CROOK mogą występować w wyrażeniach. Mogą być także używane funkcje definiowane przez programistę w postaci segmentów. Nazwa funkcji musi być poprzedzona znakiem "$" dla poinformowania translatora,że nazwa ta musi pozostać niezmieniona przy tłumaczeniu programu.
W wyrażeniach muszą być przestrzegane znane reguły obowiązujące w FORTRANIE.
Źródło: Translator języka CSL-CROOK dla minikomputera MERA-400 w systemie operacyjnym CROOK-4, Instrukcja Programisty (wersja-17/2), Janusz Gocałek, Jacek Klauziński, Poznań, 1985