Back to site

Уводзіны ў ААП ў SIMULA

© 1997 Дж. Sklenar ( jaroslav.sklenar @ um.edu.mt )


Гэты дакумент заснаваны на IT-семінар 30 гадоў аб'ектна-арыентаванае праграмаванне (ААП), якая адбылася ў універсітэце Мальты на 1997/12/05. Першы аб'ектна-арыентаванага мовы (ООЛ) Simula 67 быў афіцыйна ўведзены Оле Ёхан Даль і Крысці Nygaard на ИФИП ТК 2 Рабочая канферэнцыя па Мовы мадэлявання ў Lysebu паблізу Осла ў маі 1967 года. 30 гадоў ўяўляюць адзін чалавек і некалькі пакаленняў кампутараў. Нягледзячы на ​​тое, выкарыстоўваецца ў працягу такога доўгага часу, усе сучасныя работы па праграмаванні праводзіцца сёння грунтуецца на прынцыпах ААП ўведзены ўпершыню ў вызначэнні Simula. І што больш важна, Simula змяшчае аб'екты, якія да гэтага часу не выкарыстоўваюцца ў поўнай меры і нават не разумеюць не толькі шырокай грамадскасці праграмавання, але і людзі з супольнасці ААП. Мэта размова была кароткім апісаннем асноўных асаблівасцяў Simula, у асноўным тых, хто не прысутнічае ў іншых OOLs. Тое ж самае Мэта гэтага дакумента.

Заўвагі:

  1. У наступным тэксце тэрмін аб'екта азначае асобнік класа (заўважым, што "аб'ектаў" Object Pascal і некаторых іншых OOLs на самай справе класы).
  2. Вы можаце спампаваць усе праграмы ( simprogs.zip ), прыведзеныя ў дадзеным дакуменце і некаторыя іншыя. Існуе таксама блок Turbo Pascal SIMSET.PAS вельмі падобны на Simset з Simula. Выкарыстоўвайце яго, калі вы хочаце працаваць са структурамі дадзеных з розным лікам элементаў. Разгарнуць ZIP файл у які-небудзь каталог, дзе вы знойдзеце спіс праграм, разам з кароткім апісаннем у файле Readme.
  3. Калі вы пачатковец у мадэляванні, разгледзець праглядаюць старонкі Мадэляванне , што тлумачыць асноўныя ідэі камп'ютэрнага мадэлявання.


ЗМЕСТ:

SIMULA - АСНОЎНЫЯ ФАКТЫ

SIMULA я HISTORY

SIMULA 67 ГІСТОРЫЯ

SIMULA тыпы дадзеных

SIMULA СПРАВАЗДАЧНАСЦІ

SIMULA Працэдуры

SIMULA класаў

SIMULA Пакеты = Укладзеныя класы

SIMULA стандартныя пакеты

Квазіпараллельно СІСТЭМЫ SIMULA

Мадэляванне = Сусветны паралельных працэсаў

SIMULA NESTED QPS

SIMULA NESTED Мадэляванне

Што дрэннага ў SIMULA?

Спасылкі

Вярнуцца на галоўную старонку аўтара


SIMULA - АСНОЎНЫЯ ФАКТЫ

Simula I = арыентаваны на працэс дыскрэтнай мовы мадэлявання на аснове Алгол 60. (1964 - 1965) Simu lation ла nguage.

Simula 67 = Генеральнай аб'ектна-арыентаванага мовы з сістэмай класаў падтрымкі звязаныя спісы (сістэмы класа Simset) і дыскрэтнай працэсу арыентаванага мадэлявання (клас мадэляванне сістэмы). (1967 - 1971) Sim ўзору і niversal nguage ла.

Simula = Simula 67 (нумар больш не выкарыстоўваецца, так як Simula я не быў выкарыстаны ў працягу вельмі доўгага часу).

Малюнак 1: Асноўныя часткі і інтэрфейс ліній у асяроддзі Simula.

Назад да зместу


SIMULA я Гісторыя

(Крыніца: Ян руне Holmevik: Кампіляцыя Simula - гл Спасылкі )

1952 Крысці Nygaard пачынае Працы Ў галіне даследавання аперацый, уключаючы запіс мадэляў. Праблема: Як канцэпцыю комплексу рэальным свеце. З самаго пачатку Simula прызначаны для абодвух апісанне сістэмы І мовы праграмавання.

1960 Алгол 60 з Яго сапраўднай рэкурсіўную структуру механізму блок на аснове стэка прынцыпе. Усё важныя структуры кіравання прадставіў. Simula прызначаны пакет з препроцессор Алгол 60.

1962 Оле-Ехан Даль І Крысці Nygaard сустрэць у нарвежскіх вылічальны цэнтр (НКЦ) у Асла. Пяршаі афіцыйнае прапанову мову прадстаўлены на ИФИП 62 Сусветным кангрэсе Ў Мюнхене.

1962 Simula праекта, падтрыманага UNIVAC, Што прывяло ды UNIVAC 1107 ўстаноўкі Ў НКК Ў 1963 Годзю.

1963 Канфлікт Паміж строгім Алгол стэка механізм І Simula Ў складаных аб'ектаў мадэлявання арыентаваны больш на чарзе прынцыпе. Препроцессор ідэя адмовіліся, Simula, Каб Быць Незалежны Алгол аснове мовы.

1963 Оле-Ехан Даль працы па Новай схеме размяшчэння захоўвання дадзеных на аснове двухмерных спіс Свабодная абласцей.

Арыгінальная ідэя пасіўных кліентаў перамяшчэння празь сетку актыўных кампанентаў (дзейнаснага падыход) стаў абмяжоўвалым фактарам. 1964 Іншыя наадварот Магчыма - актыўных кліентаў перамяшчэння празь пасіўны сеткі. Гэта прывяло ды аб'яднаўчай агульнай канцэпцыі працэсу:

Сістэма = мноства ўзаемадзейнічаюць працэсаў квазіпараллельно.

1964 Першы прататып Simula кампілятар працуе на UNIVAC НКЦ 1107 у снежні, Simula я кіраўніцтва з'явілася Ў маі 1965 года. На працягу першага года Simula прымяняецца ды шырокай вобласці аперацый даследчых задач.

Назад ды зместу


SIMULA 67 Гісторыя


(Крыніца: Ян руне Holmevik: Кампіляцыя Simula - гл Спасылкі )

1965,66 Simula я выкарыстаў у Швецыі, Германіі, ЗША (Burroughs B5500), Савецкі Саюз (Урал 16) І іншых краінах. Намаганні па ўкараненні І вучыць тваю мову.

Хору запісу класа 1965 Тоні канцэпцыі, прадстаўленай у бюлетэні Алгол. Пасля стараннага вывучэння, Nygaard і Даль прыняць ідэі, але свайго роду абагульненае паняцце дагэтуль прапаўшымі без вестак.

1966 Увядзенне Ідэя прэфікса. Працэсы (пазней аб'ектаў) з двух пластоў: пласта прэфікс, асноўны пласт. Ідэя падкласаў. Nygaard і Даль пачаць працу над новым генеральным мове высокага ўзроўню.

1967 (травень). Simula 1967 афіцыйна ўведзены Даль і Nygaard на ИФИП ТК 2 Рабочая канферэнцыя па Мовы мадэлявання ў Lysebu паблізу Осла.

1967 (чэрвень). Вызначэнне Simula 67 стандартных называецца Common Base стандарту.

1968 Першае пасяджэнне Simula Standards Group (SSG). Пасля прыняцця для працы з радкамі і ўводу / вываду зробленая Б'ёрн Myhrhaug, Simula афіцыйна замарожаны.

1973 Асацыяцыя Simula карыстальніка (агу), заснаваны. Simula выкарыстоўваецца ў больш чым 250 сайтаў таго ж года.

Рэалізацыі:

1969 CDC 3300, 3600 (Нарвегія - Універсітэт Осла, NDRE)

1971 UNIVAC 1100 (НКК)

1972 IBM 360/370 (НКК)

1972 CII 10070, IRIS 80 (Францыя)

1973/74 CDC 6000 (Францыя, Нідэрланды), CDC Cyber 70 (NDRE)

10 сьнежня 1975 (Швецыя) і інш

Часопісы:

Матэрыялы штогадовых канферэнцый агу (першы 1973 Осла)

Агу Рассылка

Назад да зместу


SIMULA тыпы дадзеных


Simula змяшчае усімі неабходнымі выгодамі высокага ўзроўню трэцяга пакалення мовах. Вось чаму наступных двух раздзелах вельмі кароткае рэзюмэ, тэкст з'яўляецца выключэннем.

Тыпы значэнняў

Цэлае кароткі цэлае
Рэальны Доўгія рэальнага
Булева знакаў

Спасылачныя тыпы

Object Reference дэкларацыі: Ref (ідэнтыфікатар аб'екта) (сярод іх няма трывіяльнага неадназначнасьць)
Тэкст канстанты: "А", "Simula", Notext

Тэкст канцэптуальна асобнік класа, які мае свае атрыбуты і метады.

Метады:
Булева працэдуры Сталае; (Праўда, калі пастаянная)
Тэкст працэдуры Main; (Асноўная радок - тэкст частцы галоўнага)
Цэлае працэдуры Пачаць; (Зыходнае становішча ў Галоўным)
Цэлае працэдуры Даўжыня; (колькасць знакаў)
Цэлае Працэдура Pos; (бягучая пазіцыя)
Працэдура SetPos (я); Integer я; (Змяненне пазіцыі)
Булева працэдуру больш; (Праўда, калі <= Даўжыня Pos)
Сімвал працэдуры GetChar; (знакаў з Pos)
Працэдура риЬспаг (С); знакаў C; (Захоўванне характар ​​Pos)
Тэкст працэдуры Sub (я, п); Integer я, п; (па радках ў I даўжыні п)
Тэкст працэдуры Газа; (Выдаляе права прабеламі)

Дэ-рэдагавання метады:
Цэлае працэдуры GetInt; (Чытае цэлае)
Доўгія Рэальныя працэдуры GetReal; (Чытае рэальныя)
Цэлае працэдуры GetFrac; (Як GetInt, ігнаруе прабелы)

Рэдагаванне метады:
Працэдура PutInt (я); Integer я; (Запісвае цэлае лік)
Працэдура PutFix (я, п); Integer я, п; (Запісвае дзесятковы значэнне)
Працэдура PutReal (г, п); Доўгія рэальнага г; цэлага ліку п; (Запісвае ў навуковым фармаце)
Працэдура PutFrac (я, п); Integer я, п; (групы 3, прабеламі)

Тэкст пакалення:
Тэкст працэдуры Бланкі (п); цэлы лік п, (п нарыхтовак Returns)
Тэкст працэдуры капіявання (T); Тэкст Т; (Вяртае копію T)

Масівы

Прыклады масівы абвешчаныя ў блокі (N, M, A, B з'яўляюцца глабальныя зменныя):
Цэлалікавай масіў MyList (1:100);
Array матрыца (1: N, 1: М); (няяўнай тып рэчыўны)
Масіў сімвалаў буфера (1: Калі> б, то яшчэ б);

Назад да зместу


SIMULA СПРАВАЗДАЧНАСЦІ


Проста заявы

Прызначэнне: = Прыклады: X: = Калі> У, то астатняе B, X: = Y = 0; (** даступна)

Даведнік Прызначэнне: - Прыклады: Чарга: - Новы кіраўнік, T: - Бланкі (80);

Працэдуры

Да Гото

Структураваныя заявы

Пачатак ... Канец;

Калі ... Тады ...: калі ... Тады ... Астатняе ...;

Пераключальнік Прыклад:

 Пераключальнік Мэта: = L1, L2, L3, ... ; Перайсці да мэты (Index_expression);   L1: ... L2: ... 


Хаця ... рабіць ... ;

Для (вельмі агульнае) Прыклад:

   Begin     Integer i;    
 For i:= 1, 13, 20 
step 10 until 40, 70, i+1 
while i lt 76,            100 
step 50 until 250, 1000, 1500 do  
OutInt(i,5); 
 End;  

Выхад: 1 13 20 30 40 70 71 72 73 74 75 100 150 200 250 1000 1500

Назад да зместу


SIMULA Працэдуры


Перадачы параметраў рэжымаў:

Малюнак 2: перадача параметраў рэжымаў ўжываецца ў тэкставы параметр.
Працэдуры

Прыклад працэдуры з двума ўваходнымі і адным выхадныя параметры: (Адлюстроўвае права водступ тэксту)

 
Begin
   Procedure RightText(T, N, FitsIn); Text T; Integer N;
               Name FitsIn; Boolean FitsIn;
   Begin

      Integer I;
      FitsIn := N >= T.Length;   
      For i:=1 step 1 until N-T.Length do OutText(" ");
      OutText(T)
   End of RightText;

   RightText("Short", 30); OutImage;
   RightText("And the long one", 30);
End of Program;

Output:

                         Short
              And the long one

 

Functions = Type Procedures

Прыклад цэлага функцыю з двума ўваходнымі параметрамі: (Вылічыць найбольшы агульны дзельнік)

 
Begin
  Integer Procedure GCD(M, N); Integer M, N;
  Begin
     While M<>N do
        If M<N then N := N - M else M := M - N;

     GCD := M
  End of GCD;

  Integer A, B;
  OutText("Enter an integer number: "); OutImage; A := InInt;
  OutText("Enter an integer number: "); OutImage; B := InInt; 
  OutText("Greatest Common Divisor of your numbers is ");

  OutInt(GCD(A,B), 4); OutImage;
End of Program;

Заўвага: функцыя можа быць выклікана як калі бы ён быў без тыпаў працэдуры.

Назад да зместу


SIMULA класаў


Малюнак 3: Simula класаў, якія складаюцца з чатырох частак.

Дэкларацыі:

 

Class Rectangle (Width, Height); Real Width, Height;
                           ! Class with two parameters;
 Begin
    Real Area, Perimeter;  ! Attributes;

    Procedure Update;      ! Methods (Can be Virtual);
    Begin

      Area := Width * Height;
      Perimeter := 2*(Width + Height)
    End of Update;

    Boolean Procedure IsSquare;
      IsSquare := Width=Height;

    Update;                ! Life of rectangle started at creation;
    OutText("Rectangle created: "); OutFix(Width,2,6);
    OutFix(Height,2,6); OutImage
 End of Rectangle;
 

Аб'ект пакалення:

Ref (прамавугольнік) R; (спасылка на зменную класа)

...

R: - новы прастакутнік (50, 40); мерапрыемстваў, звязаных з дадзеным аб'ектам пакалення:

      Memory allocation, reference stored to R.
      Copying values to parameters (value passing only).
      Starting the object's body (life rules).

 

Дэкларацыя падкласа:

Rectangle Class LocRectangle (X, Y); Integer X, Y;
Begin                                        ! More parameters;
   Boolean Tall;                             ! More attributes;
   Procedure Move (Dx, Dy); Integer Dx, Dy;  ! More methods;
   Begin
      X := X + Dx; Y := Y + Dy

   End of Move;
                                             ! Additional life rules;
   Tall := Height > Width;
   OutText("Located at: "); OutFix(X,2,6); OutFix(Y,2,6); OutImage
End of LocRectangle;

 

Аб'ект пакалення:

Ref(Rectangle) R; (Зменныя класа спасылка)
Ref(LocRectangle) LR;

...

R :- New Rectangle(50, 40);
LR :- New LocRectangle(20, 30, 100, 200); (Майце на ўвазе, што таксама параметры бацькоўскага класа прадастаўляюцца)

Activities ўдзел у вышэй пакалення аб'екта:

      Memory allocation, reference stored to LR.
      Copying values to all parameters (parent class first).
      Starting the body of the parent class, then the subclass.

 

Гэта можа быць абагульненая на прэфіксам паслядоўнасці любой даўжыні:

Class A; Begin ... LifeA End;
A Class B; Begin ... LifeB End;
B Class C; Begin ... LifeC End;
Ref(C) X;

...

X :- New C;

Калі не змяніць унутраны - гл наступны пункт, паслядоўнасць мерапрыемстваў, звязаных з вышэй пакалення аб'екта:

  LifeA LifeB LifeC

 

Парушэнне правілаў жыцця ў заяве Унутрана:

Прыклад заявы:

Class A; Begin LifeA1 Inner; LifeA2 End;
A Class B; Begin LifeB1 Inner; LifeB2 End;
B Class C; Begin LifeC1 Inner; LifeC2 End;
Ref(C) X;

 

X :- New C;

Паслядоўнасць мерапрыемстваў, звязаных з вышэй пакалення аб'екта:

LifeA1 LifeB1 LifeC1 (Унутраны ў жыцці З ігнаруецца) LifeC2 LifeA2 LifeB2

Заўвагі:
1) Адсутнасць Унутраная такая ж, як Унутраная перад класам канца.
2) асноўным адной ўнутранай дапускаецца ў целе класа.

Прыстаўка блокаў:

Давайце выкажам здагадку, што праграма з наступнага структурай:

Begin
   Class A(P); Integer P;
   Begin  LifeA1  Inner;  LifeA2  End;

   Part1
   A(3) Begin
     Block body
   End;
   Part2
End;

Мерапрыемстваў, звязаных з выкананнем вышэй прэфікс блока:

       Creating a class instance of A.
       Copying values to its parameter(s).
       Starting the body of the class, that includes execution of the block code.
 

Такім чынам, у вышэйпаказанай праграме паслядоўнасць дзеянняў такая:

           Part1   LifeA1   Block body   LifeA2   Part2

Прэфікс блока канцэптуальна асобнік класа без імя, якое мае:

- Параметры прэфікс класа

- Больш атрыбутаў (атрыбутаў класа + лакальных пераменных блока)

- Больш метадамі (метады класа + мясцовыя працэдуры блок)

- Больш складаныя правілы жыцця (цела класа корпус + блок).

Заўвагі:

1) Блок прэфікса механізм не вельмі зручны ў выпадку простых класаў. Магчыма выкарыстанне імпарту аб'яваў класа (параметры, атрыбуты і метады) у блоку. Яна павінна выкарыстоўвацца ў асноўным з асноўнымі класамі (гл. наступную кіраўніка), якія ўяўляюць модуляў, створаных па прынцыпах ААП. Прыстаўка блок асноўны клас (як, напрыклад, мадэляванне) могуць увозіць ўвесь асяроддзях праграмавання або спецыяльнага прызначэння Simula заснаваны мовах.

2) У Simula праграм няма відавочнага вызвалення памяці, паколькі зборшчык смецця аўтаматычна аднаўляе памяць, занятую не спасылаюцца асобнікаў класа.

Навігацыя ў прэфіксам паслядоўнасці

Наступны тэкст на аснове гэтых заяў:

Class A; Begin Ref(A) Link; Procedure Show; ... End;
A Class B; Begin Procedure Show; ... End;
B Class C; Begin Procedure Show; ... End;

Ref(A) XA, First, Current; Ref(B) XB; Ref(C) XC;

1. Кваліфікацыя па Агледзіце заяву

а) простыя

Агледзіце XA рабіць шоў, робіць у асноўным такім жа, як XA.Show;

Розніца ў тым, што з Праверце, калі = Няма XA, заява пасля рабіць ігнаруецца. Калі XA = Не, XA.Show прыводзіць да памылкі выканання час.

Б) Ні ў сказе У адваротным выпадку

Inspect XA do Begin
  Show; ...
End
Otherwise Begin
  OutText("Sorry, XA not created"); OutImage
End;

с) выпрабаванне тыпу ў сказе Калі

Паказана звязаны спіс з розных элементаў тыпу А, У, З, чыя галава паказальнік знаходзіцца на першым:

Current :- First;
While Current ne None do begin
  Inspect Current
    When A do Show    ! Show of A;

    When B do Show    ! Show of B;
    When C do Show    ! Show of C;
    Otherwise OutText("Not a (sub)class of A");
  OutImage;
  Current :- Current.Link
End While;

 

2. Імгненная Кваліфікацыя прапановай Qua

Няхай гэтыя заявы на аснове вышэйзгаданых заяў:

XA :- New B;  XB :- New B;
XA.Show;        ! Show of A;
XA Qua B.Show;  ! Show of B - it is possible to go down;
XB Qua A.Show;  ! Show of A - it is possible to go up;

XA :- New A;
XA Qua B.Show;  ! This is illegal - attributes of B do not exist;

Заўвага: Нармальная уласцівасцяў Гэты зменнай кваліфікацыяй для B абвешчаны працы (B) ВР:

Гэтыя нармальныя ўласцівасці могуць быць пераадолены шляхам праверкі або Qua. Паведамленне ад трэцяга правілы, якія звычайна пазней звязванне механізм (як, напрыклад, у Object Pascal) не працуе аўтаматычна ў Simula. Рашэнне гэтай праблемы з'яўляецца Праверце з тым, калі становішча - гл. вышэй прыклад. Simula падыход з'яўляецца, магчыма, менш дружалюбна да карыстальніку, але ён з'яўляецца больш агульным і праграміст усё пад кантролем.



3. Спасылка сама гэтага

Наступны код з'яўляецца метад, які дадае аб'ект у спіс першае:

Procedure Add_to_List(First); Name First; Ref(A) First;
Begin

   Link :- First; First :- This A
End;

 
4. Тэставанне кваліфікацыю, ёсць і ў

Наступныя selfexplaining сегменты кода на аснове дэкларацый працы (B) СБ і Ref () XA паказаць выкарыстанне вельмі зручным аператараў і В. Адзначым, што, напрыклад, Object Pascal не EN эквівалент ст. Адзінае рашэнне гэтай праблемы ў Object Pascal з'яўляецца ўкараненне метадаў, якія вяртаюць ідэнтыфікацыі продкаў.
If XB is B then
  OutText("XB is B")
Else
  OutText("XB is either subclass of B or None");
 
If XA in B then
  OutText("XA is either B or its subclass")
Else

  OutText("XA is either A or None");

 

5. Абарона атрыбуты

Схаваная атрыбуты могуць быць выкарыстаны толькі ў тэле класа, дзе яны былі абвешчаныя.

Абароненыя дадзеныя могуць быць выкарыстаны толькі ў органах клас, дзе яны былі абвешчаныя і ўсё падкласы.

Назад да зместу

SIMULA Пакеты = Укладзеныя класы


Малюнак 4: Simula класы могуць быць укладзенымі на любую глыбіню.

Класы, якія змяшчаюць заяву мясцовых класы завуцца асноўныя класы. Наступны прыклад кода вызначае асноўны клас, званы геаметрыі.
 
! The program defines the main class "Geometry". ;
! It represents a theory with terms "point, rectangle, circle, and line".;

Class Geometry;
Begin

  Class Point(X,Y); Real X,Y;

  Begin
    Procedure Print; Begin  ...  End;
    Procedure Shift(Dx, Dy); Real Dx, Dy; Begin  ...  End;
    Print;                  ! Life of point;
  End of Point;

  Class Rectangle(RecName, Width, Height);

       Text RecName; Real Width, Height;
  Begin
    Real Area, Perimeter;
    Procedure Update; Begin  ...  End;
    Procedure Show; Begin  ...  End;
    Update; Show;           ! Life of rectangle;

  End of Rectangle;

  Class Circle(Radius, Center); Real Radius; Ref(Point) Center;
  Begin
    Procedure Shift(Dx, Dy); Real Dx, Dy; Begin  ...  End;
    OutText("Circle created at "); ! Life of circle;
    Center.Print;

  End of Circle;

  Class Line(M,N); Ref(Point) M,N; ! Line defined by two points;
  Begin
    Real Slope;
    Slope :=  ...  ;       ! Life of line;
  End of Line;

  !Variables declared in geometry: ;
  Ref(Point) Origin, A, B;
  Ref(Line) X,Y;

  !Life of geometry: ;
  Origin :- New Point(0,0); ! Creating the origin;

  A :- New Point(1,0); B :- New Point(0,1);
  X :- New Line(Origin, A); ! Creating the axes;
  Y :- New Line(Origin, B);
  OutText("*** Geometry initialized ***"); OutImage;
End of Geometry;

Наступная праграма выкарыстоўвае асноўныя геаметрыі класа. Звярніце ўвагу, як класы, абвешчаныя ў геаметрыі выкарыстоўваецца для аб'явы падкласаў спецыялізаваных для рашаемай задачы. Пазней можна аб'явіць і выкарыстоўваць спасылацца на зменныя ў кваліфікаваных як імпартнага, так і лакальна абвешчаныя класы. Гэта асноўная ідэя Simula заснаваныя пакеты або пэўны карыстальнікам мовах (у чым розніца?)


External Class Geometry;
Geometry Begin
  ! Subclasses declared in the prefixed block: ;
  Point Class Color_Point(C); Character C; Begin  ...  End;

  Rectangle Class Square; Begin  ...  End;

  ! Variables declared in the prefixed block: ;
  Ref(Color_Point) A1;
  Ref(Point) C, D;
  Ref(Circle) K;
  Ref(Line) E, F;

  Ref(Rectangle) R1;
  Ref(Square) S1;

  ! Block body: ;
  C :- New Point(5,6);
  D :- New Point(20,30);
  A1 :- New Color_Point(3, 4, 'G');

  K :- New Circle(10, C);
  E :- New Line(C, D);
  F :- X;
  K.Shift (1,1);
  R1 :- New Rectangle("Rec_R1", 5, 4);
  S1 :- New Square("Square_S1", 4, 6);

  S1.Show;
End of prefixed block;

Назад да зместу


SIMULA стандартныя пакеты


Навакольнае асяроддзе - сістэма аб'ектаў

Атрыбутаў, даступных для:

Існуюць метады для:

BasicIO - знешні свет

Усе ўваходныя і выходныя аперацыі прадстаўлены метады файлавых аб'ектаў. Агульнага продка называлі файла - гл. Малюнак 5 - рэалізуе аб'екты, агульныя для ўсіх файлаў. Яго падкласы ByteFile і ImageFile (тэкставы файл - "вобраз" з'яўляецца яго тэкст буфера). І далей спецыялізаваных ў адпаведнасці з метадам доступу (ўвод, вывад, прамы доступ). OutFile ёсць яшчэ адзін нашчадак PrintFile, які рэалізуе старонкі арыентаваных вываду тэксту. Звярніце ўвагу, што Simula не набралі файлы, зробленыя з напрыклад запісаў. Гэты тып файлаў можа быць рэалізавана байт файла. Малюнак 5 змяшчае яшчэ некалькі важных метадаў з selfexplaining імёны.

Малюнак 5: Іерархія класаў Simula файл.

Рамачнай праграмы

Усе сістэмныя аб'екты ў Simula канцэптуальна рэалізаваны як класы з пэўнымі атрыбутамі, метады і лакальныя класы. Карыстальнік праграмы напісаныя як калі б яны былі ўключаны ў наступны кадр. Звярніце ўвагу, што жыццё правілы класа BasicIO стварэння і адкрыцця сістэмных файлаў перад пачаткам кода карыстальніка. Пасля яе заканчэння сістэмныя файлы закрыты. Карыстальнік код ўстаўляецца ў падвойных заяву праверыць. Гэта азначае, што метады сістэмных файлаў (як, напрыклад, GetInt, OutImage і г.д.) не павінны папярэднічаць імя файла.

Begin
  Class Environment; ...
  Environment Class BasicIO ... ;
  Begin
    Ref(InFile) SysIn; Ref(OutFile) SysOut; ...

    Class Simset ... ;
    Simset Class Simulation ... ;
    Procedure Terminate_Program;
    Begin ... ; GoTo STOP End;
     ...
    SysIn :- New InFile ( ... );

    SysOut :- New PrintFile ( ... );
    SysIn.Open ( ... );
    SysOut.Open ( ... );
    Inner;                 ! This starts the user program;
   STOP: SysIn.Close ( ... );
    SysOut.Close ( ... )

  End BasicIO;

BasicIO Begin
    Inspect SysIn do
      Inspect SysOut do

Begin                ! User program starts by this begin;

       User statements
      End;                 ! Last line of user program;
  
End;
End;
  

Simset - свет звязаныя спісы

Сістэмы класа Simset рэалізуе кругавой двухбаковай звязаныя спісы з галавой пункта, якія ўдзельнічаюць у сувязі, якія былі першапачаткова называўся "мноства" - гл Малюнак 6.

Малюнак 6: Simula звязаныя спісы рэалізаваны ў сістэме класа Simset.

Вышэй спісы прадстаўлены трыма класамі - гл Малюнак 7. Сувязь гэта веды аб двухбаковай сувязі як такой. Гэта з'яўляецца яшчэ адным спецыялізаваным як загаловак і сябра элементаў.

Малюнак 7: класы, абвешчаныя ў сістэме класа Simset.

Метады спісу звязаных класаў:

Сувязь

Кіраўнік

Спасылка

Метады могуць быць аб'яднаныя, каб прадставіць комплекс мерапрыемстваў. Напрыклад працэдуры заяву:

Queue1.Last.Precede (Queue2.First);

выдаляе апошні элемент з queue1 і ўстаўляе яго ў пачатку Queue2.

Назад да зместу

Квазіпараллельно СІСТЭМЫ SIMULA


Жыццё правілаў аб'екты Simula з'яўляюцца сопрограммы, якія могуць быць часова прыпынена, а затым аднаўляецца. Ёсць два ўзроўню (квазі) паралелізму ў Simula. Першы ўзровень не працуе з часам, праграміст "думае ў квазіпараллельно". На другім узроўні ўводзіцца паняцце часу, праграміст працуе з паралельнымі (з пункту гледжання карыстальніка) працэсаў. Першы ўзровень можа быць прыменена да ўсіх класах, другога ўзроўню ажыццяўляецца класа Працэс мадэлявання класа сістэмы. На малюнку 8 паказаны магчымыя стану сопрограммы (арган) аб'екта X. Звярніце ўвагу, што падпраграму, якая не выкарыстоўваць любы з наступных аб'ектаў на першы прыкладаецца, то спыняецца (аб'ектаў іншых OOLs заўсёды спыняецца). Спыненая аб'ект можа быць выкарыстаны (можна выклікаць яго метады і / або для доступу да яго атрыбуты). Гэта Simula аб'ектаў (метады, даступныя ва ўсіх класах), якія падтрымліваюць працу з квазіпараллельно сістэмы (КПТ):

Адлучаць спыняе выкананне бягучага аб'екта (які выконвае Адлучыць). Бягучы аб'ект адрываецца. Кіраванне перадаецца ў кропку, дзе бягучы аб'ект быў або створаных або адноўленая.

Рэзюмэ (Y) актывізуе індывідуальны аб'ект Y, якая становіцца аднавіліся. Бягучы аб'ект адрываецца.

Call (Y) падобны на рэзюмэ, але аб'ект Y прывязваецца да бягучага аб'екту. Бягучы аб'ект адрываецца. Бягучы аб'ект будзе адноўлены пасля адлучэння Ю.

Малюнак 8: дыяграма станаў сопрограммы Simula.


QPS Прыклад 1: Гульня ў шахматы кіравання з дапамогай двух спадароў падыходу.

У наступнай праграме Ёсць тры сопрограммы: два гульца і асноўнага блока. Адзначым, што першыя два ходу адмысловыя. Гулец можа выйграць з некаторай верагоднасцю, з трэцяга года ход: Draw (0,3, насенны) з'яўляецца Булева функцыі, якая вяртае ісціну з верагоднасцю 0,3. Звярніце ўвагу, як асноўны блок стварае два гульца, звязвае іх супернікам атрыбуты і перадае кіраванне Белага. Тады гульцы пастаянна здзяйсняюць свае дзеянні і аднавіць суперніка пакуль адзін з іх пераможа. Гэта спыняе сваё цела і кіраванне перадаецца на асноўны блок.


Begin
   Boolean Mate;
   Ref(Player) White, Black, Winner;
   Integer Seed;

   Class Player(PName); Text PName;

   Begin
     Ref(Player) Opponent;
     Integer Move;
          ! The life follows;
      Detach;
      OutText(PName); OutText("'s First Move"); OutImage;

      Resume(Opponent);
      OutText(PName); OutText("'s Second Move"); OutImage;
      Resume(Opponent);
      Move := 2;
      While not Mate do begin
         Move := Move+1;

         OutText(PName); OutText("'s Move # ");
         OutInt(Move,3); OutImage;
         If Draw(0.3,Seed) then begin
            Mate := true; Winner :- This Player;
         End If;
         Resume(Opponent);

      End While;
   End of Player;

   Begin   ! QPS head;
      OutText("Creating Players, Starting the white one"); OutImage;
      White :- New Player("White");
      Black :- New Player("Black");

      White.Opponent :- Black;
      Black.Opponent :- White;
      Seed := 17;
      Resume(White);
      OutText("Finish: "); OutText(Winner.PName);
      OutText(" won in move"); OutInt(Winner.Move,3); OutImage;

   End of QPS
End of program;


Гэта водступам выхад вышэй праграмы. Водступы паказвае аб'ект, які генеруе выхад - злева направа: Базавы блок, белы, чорны.

Creating Players, Starting the white one
  White's First Move
    Black's First Move
  White's Second Move
    Black's Second Move

  White's Move #   3
    Black's Move #   3
  White's Move #   4
    Black's Move #   4
Finish: Black won in move  4


QPS Прыклад 2: Гульня ў шахматы кіравання з дапамогай Майстры і двух рабоў падыходу.

У наступнай праграме Ёсць таксама тры сопрограммы: два гульца і асноўнага блока. Розніца паміж гэтай і папярэдняй праграмы з'яўляецца актыўная роля асноўнага блока. Гульцы не адновіць адзін аднаго. Яны проста робяць рухацца і адлучыць. Асноўны блок актывізуе іх, пакуль адзін з іх пераможа. Звярніце ўвагу на выкарыстанне Call - гульцы неаднаразова, прыкладзеныя да асноўнага блоку.
 

Begin
   Boolean Mate;
   Ref(Player) White,Black,Winner;
   Integer Seed;

   Class Player(PName); Text PName;

   Begin
     Ref(Player) Opponent;
     Integer Move;

     ! The life follows;
      Detach;
      OutText(PName); OutText("'s First Move"); OutImage;

      Detach;
      OutText(PName); OutText("'s Second Move"); OutImage;
      Detach;
      Move := 2;
      While true do begin
         Move := Move+1;

         OutText(PName); OutText("'s Move # ");
         OutInt(Move,3); OutImage;
         If Draw(0.05,Seed) then begin
            Mate := true; Winner :- This Player;
         end;
         Detach;

      End While;
   End Player;

   Begin
      OutText("Creating Players, Starting the game"); OutImage;
      White :- New Player("White");
      Black :- New Player("Black");

      White.Opponent :- Black;
      Black.Opponent :- White;
      Seed := 11;
      While not Mate do begin
         Call(White);
         If not Mate then Call(Black)

      End While;
      OutText("Finish: "); OutText(Winner.PName);
      OutText(" won in move"); OutInt(Winner.Move,3); OutImage;
   End
End;


Гэта водступам выхад вышэй праграмы. Водступы паказвае аб'ект, які генеруе выхад - злева направа: Базавы блок, белы, чорны.

Creating Players, Starting the game
  White's First Move
    Black's First Move

  White's Second Move
    Black's Second Move
  White's Move #   3
    Black's Move #   3
  White's Move #   4
    Black's Move #   4

  White's Move #   5
    Black's Move #   5
  White's Move #   6
Finish: White won in move  6


QPS Прыклад 3: Гульня ў шахматы кіравання з дапамогай Майстры і двух рабоў падыход рэалізаваны ў выглядзе пакета (асноўны клас).

У наступнай праграме асноўных Шахматы клас аб'яўляе два мясцовых класа: гулец і суддзя. Правілы жыцця галоўнага класа падрыхтаваць гульню шляхам стварэння і злучэння двух гульцоў і рэферы. Усе тры аб'екта адлучыць і цела асноўнага класа спыняецца. Гульня павінна быць запушчана праграма (блок з прэфіксам шахматы). Прыстаўка імпарту ўсе заявы і рыхтуе гульні. Заўважым, што прэфікс блока проста актывуе рэферы і ацэньвае гульню.


Class Chess;     ! Main class with local: Player, Referee;
   Begin
   Boolean Mate;
   Ref(Player) White,Black,Winner;
   Ref(Referee) Master;

   Integer Seed;

   Class Player(PName); Text PName;
   Begin
     Ref(Player) Opponent;
     Integer Move;
                ! The life of Player;

      Detach;
      OutText(PName); OutText("'s First Move"); OutImage;
      Detach;
      OutText(PName); OutText("'s Second Move"); OutImage;
      Detach;
      Move := 2;

      While true do begin
         Move := Move+1;
         OutText(PName); OutText("'s Move # ");
         OutInt(Move,3); OutImage;
         If Draw(0.05,Seed) then begin
            Mate := true; Winner :- This Player;

         end;
         Detach;
      End While;
   End Player;

   Class Referee;
   Begin

      Detach;
      While not Mate do begin
         Call(White);
         If not Mate then Call(Black)
      End While
   End of Referee;

   Begin     ! Life of Chess;
      Seed := 11;
      OutText("Creating the Players and the Master"); OutImage;
      White :- New Player("White");
      Black :- New Player("Black");
      White.Opponent :- Black;

      Black.Opponent :- White;
      Master :- New Referee;
   End
End of Chess;
Наступная праграма выкарыстоўвае асноўныя Шахматы класа:
 
External Class Chess;

Chess Begin
    OutText("Resuming the Master"); OutImage;
    Resume(Master);
    OutText("Finish: "); OutText(Winner.PName);
    OutText(" won in move"); OutInt(Winner.Move,3); OutImage;
End of Program;


Гэта водступам выхад вышэй праграмы. Водступы паказвае аб'ект, які генеруе выхад - злева направа: Цела шахматы, прэфікс блока, белы, чорны.

Creating the Players and the Master
  Resuming the Master

    White's First Move
      Black's First Move
    White's Second Move
      Black's Second Move
    White's Move #   3
      Black's Move #   3

    White's Move #   4
      Black's Move #   4
    White's Move #   5
      Black's Move #   5
    White's Move #   6
  Finish: White won in move  6

Назад да зместу

Мадэляванне = Сусветны паралельных працэсаў


Асноўныя паняцці мадэлявання класа сыстэма працэс - паслядоўнасць імгненных падзей (прадстаўлены сегменты кода), падзеленых пасіўны перыяды. 9 паказаны класы, абвешчаныя ў мадэляванне і метады іх. Мал падзеі Апавяшчэнне (падклас Link) уяўляе запланаванага падзеі, якія адбудуцца ў пэўны час - EvTime -. Працы ў гэты працэс, сегмент кода будзе актываваны. Будучыні SQS ( падклас кіраўнік) з'яўляецца спіс падзей адсартаваныя па часе. Гэта звычайны каляндар дыскрэтных моў мадэлявання. Канцэптуальна гэта спарадкаваны звязаны спіс, ўнутраная рэалізацыя, як правіла, на аснове больш эфектыўнай структуры дрэва. Відавочна, што гэты спіс не могуць быць даступныя непасрэдна з праграмы карыстальніка. Ёсць планаванне аб'ектаў - убачым пазней, што падтрымка працы з часам і ўзаемнай сінхранізацыі працэсаў. Працэсы карыстальнікаў праграмы з'яўляюцца падкласа агульнага бацькоўскага працэсу. Першыя два метаду праверкі яго статусу, два іншых вяртання наступнага запланаванага падзеі і яго час актывацыі.

Малюнак 9: Класы Мадэляванне класа сістэмы.

Аб'екты класа мадэляванне сістэмы ажыццяўляецца "нізкі ўзровень" квазіпараллельно метады: адлучыць, рэзюмэ, тэлефануйце, але яны з'яўляюцца больш зручнымі для карыстальнікаў. Карыстальнік мадэлявання "лічыць, паралельна". Дынаміка імітацыйнай мадэлі выяўляецца ў тэрмінах ўзаемадзейнічаюць паміж паралельнымі працэсамі. Гэты спосаб вельмі натуральна - гэта дакладна, як сапраўдныя творы свеце.

Штаты аб'екта працэсу:

Тэрміны, паслядоўнасць і сінхранізацыя Паслугі:


Мадэляванне Прыклад 1: шматканальная сістэма масавага абслугоўвання - актыўнага кліента падыход.

На малюнку 10 паказана мадэляваных сістэмы. Гэта абстракцыя, напрыклад банка, у якім кліентам чакаць у чэргах для любога з лічыльнікаў галасоў. Інтэрвал паміж паступленнямі з'яўляецца выпадковай, раўнамерна размеркаваных паміж 1 да 3 хвілін. Ўсе серверы маюць тыя ж выпадковае час службы, што звычайна распаўсюджваецца з сярэднім значэннем 8 хвілін і стандартнае адхіленне 2 хвіліны. Мадэлявання павінны знайсці сярэдні час кліент праводзіць у сістэме. (Майце на ўвазе, што аналітычная мадэль вышэй сістэмы не даступныя). Мадэляванне падобных сістэм у Simula (менавіта ў класе мадэляванне сістэмы Simula) заўсёды пачынаецца з ідэнтыфікацыі працэсаў. Адзін працэс, відавочна, генератар кліентаў - гэта будзе паўторна генерыраваць кліентаў, запісваць яго час прыбыцця, і чакаць выпадковых затрымак. Каб выказаць дынаміку сістэмы, Ёсць два лагічных падыходаў. Першы (у гэтым прыкладзе) заснавана на актыўных кліентаў і пасіўнай сервераў. Супрацьлеглы падыход - актыўных сервераў, пасіўнага кліентаў паказана ў наступным прыкладзе. Актыўныя кліент жыцця правілы прадстаўлены наступныя крокі:

  1. Калі ёсць вольны сервер, працягвайце. Чакаць у чарзе, у адваротным выпадку.
  2. Карыстаючыся серверам, генерыраваць выпадковыя затрымкі, які ўяўляе часу абслугоўвання.
  3. Выпуск сервера.
  4. Калі ёсць чаканне кліента (калі чаргу не пустая), выдаліце ​​яго з чаргі і актываваць яго. (Актываваны кліент пачне сваю кроку 2.)
  5. Абнаўленне статыстыкі.

Малюнак 10: чарзе сістэмы з адной чарзе і больш сервераў.

У наступных версіях праграмы імітацыйнай мадэлі гэтай сістэмы. Звярніце ўвагу, што асноўнай мэтай было паказаць логіку мадэлі ў праграму як мага больш простым. Рэальны імітацыйныя мадэлі, вядома, падкажуць для ўсіх зменных параметраў і забяспечыць вынікі (напрыклад, у сярэднім прыклад і максімальная даўжыня чаргі, і г.д.). У наступнай праграме Ёсць два працэсы, якія існуюць на працягу ўсяго эксперыменту: генератар і асноўнай праграмы (блок з прэфіксам мадэляванне), што проста чакае, пакуль эксперымент скончаны, і затым адлюстроўвае вынік. Тады існуе розны лік кліентаў працэсаў, якія існуюць часова. Пасля абнаўлення статыстыкі кліентаў спыніць. Звярніце ўвагу на выкарыстанне стандартных функцый для генерацыі выпадковых затрымак. Ёсць стандартныя функцыі ў Simula для найбольш часта выкарыстоўваюцца дыстрыбутываў. Усе прыведзеныя цэлай зменнай як насенне, якія будуць выкарыстоўвацца генератар выпадковых. Так што ўсё выпадковыя велічыні могуць выкарыстоўваць асобныя патокі выпадковых лікаў або долі агульны.
 

! Active customer approach;
Simulation Begin
  Real  TrialDuration;    ! Experiment length [min];
  Ref(Head)  Queue;       ! The queue;
  Integer  Servers;       ! Total number of servers;
  Integer  BusyServers;   ! Numbers of working servers;
  Integer  TrialSeedG, TrialSeedS;    ! Seeds of random generators;

  Long Real  TotalTime, TimeSpent;    ! Variables for statistics;
  Integer  CustomersOut;  ! Number of served customers;
  Real  MinInt, MaxInt;   ! Uniform interval between arrivals;
  Real  SMean, SStd;      ! Normal service duration;

  Process Class Generator;
  Begin

    While true do begin
      Activate New Customer(Time);  ! Time is the current (arrival) time;
      ! Interval between arrivals: ;
      Hold(Uniform(MinInt, MaxInt, TrialSeedG));
    End While;
  End of Generator;

  Process Class Customer(Arrival);  Real Arrival;
  Begin
    Ref(Customer)  Next;

    If not Queue.Empty or (BusyServers >= Servers) then
    Wait(Queue);          ! Customer has to wait in the Queue;

      ! Service can start: ;
    BusyServers := BusyServers + 1;  ! Seize a server;
      ! This is the teller service: ;
    Hold(Normal(SMean, SStd, TrialSeedS));
    BusyServers := BusyServers - 1;  ! Release the server;
    If not Queue.Empty then begin

      Next :- Queue.First;
      Next.Out;           ! First from Queue served;
      Activate Next after Current;
    End If;
    CustomersOut := CustomersOut + 1;    ! Statistics;
    TotalTime := TotalTime + (Time - Arrival);

  End of Customer;

 ! MAIN program body: ;
  TrialSeedG := 7;  TrialSeedS := 23;  ! Seeds for random variables;
  MinInt := 1; MaxInt := 3;            ! Min and Max intervals;
  SMean := 8; SStd  := 2;              ! Random normal servers;
  OutText("Enter the number of Servers : "); OutImage;

  Servers := InInt;                    ! Initial numbers;
  TrialDuration := 600;                ! Other variables initialized to 0;
  Queue :- New Head;                   ! Create an empty queue;
  Activate New Generator;              ! This starts the experiment;
  Hold(TrialDuration);                 ! Experiment duration;
  TimeSpent := TotalTime/CustomersOut;

  OutText("Average time spent in the system: ");
  OutFix(TimeSpent, 3, 10); OutImage;
  InImage
End of program;


Мадэляванне Прыклад 2: шматканальная сістэма масавага абслугоўвання - Active Server падыходу.

Мадэляваных сістэмы такая ж, як і ў папярэднім прыкладзе - гл Малюнак 10. Розніца заключаецца ў актыўным сэрвэры, што неаднаразова абслугоўвае кліентаў з чаргі, пакуль не ачысціцца чаргу. Затым сервер пассивирует. Кліенты спачатку актываваць ўсе прастою сервераў (калі такія маюцца), а затым ісці ў чарзе. Гэта, вядома, не вельмі эфектыўны, але просты. Кліенты актываваных сервераў пасля завяршэння службы. У астатняе жыццё кліентам толькі абнаўленне статыстыкі. Асноўная праграма стварае і актывізуе ўсе серверы, але яны адразу ж пасівацыі, таму што чарга пустая. Тады асноўная праграма ўключае генератар і чакае, пакуль эксперымент скончаны.
 
! Active server approach;
Simulation Begin
  Real  TrialDuration;       ! Experiment length [min];
  Ref(Head)  Queue;          ! The queue;
  Integer  Servers;          ! Total number of servers;

  Integer  TrialSeedG, TrialSeedS;    ! Seeds of random generators;
  Long Real  TotalTime, TimeSpent;    ! Variables for statistics;
  Integer  CustomersOut;     ! Number of served customers;
  Real  MinInt, MaxInt;      ! Uniform interval between arrivals;
  Real  SMean, SStd;         ! Normal service duration;
  Ref(Server) Array ServBank(1:10);   ! Max. number of servers is 10;

  Integer i;

  Process Class Generator;
  Begin
    While true do begin
      Activate New Customer(Time);
       ! Interval between arrivals: ;

      Hold(Uniform(MinInt, MaxInt, TrialSeedG));
    End While;
  End of Generator;

  Process Class Server;
  Begin
    Ref(Customer) ServedOne;

    While true do
      If not Queue.Empty then begin
        ServedOne :- Queue.First;
        ServedOne.Out;      ! First from Queue served;
        Hold(Normal(SMean, SStd, TrialSeedS));
        Activate ServedOne after Current

       end
      Else
        Passivate;
  End of Server;

  Process Class Customer(Arrival);  Real Arrival;
  Begin

    For i:=1 step 1 until Servers do
      If ServBank(i).Idle then
        Activate ServBank(i) after Current;
    Wait(Queue);

     ! Service finished: ;
    CustomersOut := CustomersOut + 1;  ! Statistics;

    TotalTime := TotalTime + Time - Arrival;
  End of Customer;

 ! MAIN program body: ;
  TrialSeedG := 7;  TrialSeedS := 23;  ! Seeds for random variables;
  MinInt := 1; MaxInt := 3;            ! Min and Max intervals;
  SMean := 8; SStd  := 2;              ! Random normal servers;

  OutText("Enter the number of Servers : "); OutImage;
  Servers := InInt;                    ! Initial numbers;
  TrialDuration := 600;
  Queue :- New Head;
  For i:=1 step 1 until Servers do begin
    ServBank(i) :- New Server;

    Activate ServBank(i)               ! Create and activate all servers;
  End For;
  Activate New Generator;              ! This starts the experiment;
  Hold(TrialDuration);                 ! Experiment duration;
  TimeSpent := TotalTime / CustomersOut;
  OutText("Average time spent in the system: ");

  OutFix(TimeSpent, 3, 10); OutImage;
  InImage
End of program;

Назад да зместу


SIMULA NESTED QPS


Квазіпараллельно сістэмы (КПТ) у Simula у асноўным блоку (як правіла, але не абавязкова прэфікс адзін), цела якога стварае некаторыя аб'екты, якія разам з асноўным блокам склаў сістэмы квазіпараллельно сопрограммы. Таму што Simula (у адрозненне, напрыклад Pascal) з'яўляецца сапраўдным блок арыентаваны мова, блок (што звычайна азначае QPS) можа адбывацца ў любым месцы ў кодзе, як заяву. Гэта азначае, што КПТ можа ўтрымліваць мясцовыя (укладзеныя) QPS's, якія таксама могуць утрымліваць лакальныя QPS і г.д. Гэта простае правіла дае спосаб стварэння неверагодна складаных структур з наступствамі, якія да гэтага часу не выкарыстоўваюцца ў поўнай меры і нават не зразумеў. Наступная праграма контуры магчымага выкарыстання укладзеных QPS ў шахматы кіравання. Наступная кіраўнік пакажа праграмы мадэлявання з укладзенымі мадэлявання.


Укладзеныя QPS Прыклад: шахматы кіравання з дапамогай мадэлявання гульні, як частка рашэння.

Давайце выкажам здагадку, што шахматыст, як частка свайго рашэння імітуе бягучую гульню, каб праверыць магчымыя вынікі наступнага кроку. Наступная праграма (па два падыходу магістр) з'яўляецца схема аднаго з магчымых рашэнняў. Адзначым, што клас гульца мае метад TestStrategy называецца частка кожнага рашэнні. Гэты метад рэалізуе QPS падобныя на знешняй. Ён змяшчае лакальны клас TestPlayer, якія могуць быць вельмі падобныя на знешні гулец, за выключэннем TestStrategy (ён можа мець што-то падобнае, але ўкладзенасці павінен спыніцца на пэўным узроўні). Цела TestStrategy з'яўляецца унутраным QPS, вынікі якіх выкарыстоўваюцца гульца на верхнім узроўні.
Begin
  Boolean  Mate;
  Ref(Player)  White, Black, Winner;
  Integer  Seed;

  Class Player(PName);  Text PName;
  Begin

    Ref(Player) Opponent;
    Integer Move; 

    Procedure TestStrategy;
    Begin
      Class TestPlayer ... ;

      Begin
        ! Internal experiment, similar to the outer QPS;
         ...
      End of internal QPS;
    End of TestStrategy;

   ! The life of Player;

    Detach;
    TestStrategy;
    OutText(PName);  OutText("'s First Move");  OutImage;
    Resume(Opponent);
    TestStrategy;
    OutText(PName);  OutText("'s Second Move");  OutImage;

    Resume(Opponent);
    Move := 2;
    While not Mate do begin
      Move := Move+1;
      TestStrategy;
      OutText(PName);  OutText("'s Move # ");

      OutInt(Move,3);  OutImage;
      If  Draw(0.3,Seed)  then  begin
        Mate := true;
        Winner :- This Player;
      End If;
      Resume(Opponent);

    End While;
  End of Player;

  Begin   ! This block is the outer QPS head;
    OutText("Creating Players,  Starting the white one");  OutImage;
    White :- New Player("White");
    Black :- New Player("Black");

    White.Opponent :- Black;
    Black.Opponent :- White;
    Seed := 17;
    Resume(White);
    OutText("Finish: ");  OutText(Winner.PName);
    OutText(" won in move");  OutInt(Winner.Move,3);  OutImage;

  End of outer QPS;
End of program;

Назад да зместу


SIMULA NESTED Мадэляванне


Ёсць два ўзроўню quasiparallelism ў Simula, як можна рэалізаваць укладзеныя сістэмы. Папярэдняга прапановы чале з нізкім узроўнем ўкладзенасці QPS's. Мадэляванне сістэмы класа ўводзіцца паняцце часу. Гэта азначае, што калі укладзены, будуць і іншыя мясцовыя (укладзеныя) раз. Асноўная ідэя заключаецца ў малюнку 11. Трымайце заявы з затрымкамі X і Z ставяцца да асноўнай (вонкавай) часу. Трымайце заяву з затрымкай у знаходзіцца ў іншым альтэрнатыўным свеце. Такім чынам, у Simula можна мадэляваць сістэмы знайшоў да гэтага часу толькі ў навуковай фантастыцы. Ёсць практычнае прымяненне. У прынцыпе можна мадэляваць сістэмы, якія ўтрымліваюць мадэлявання як частка працэсу прыняцця рашэнняў. Разгледзім такую ​​сітуацыю: ёсць некаторыя складаныя сістэмы і групы экспертаў, якія прапануюць розныя рашэнні, вынікі якіх не могуць быць правераны ў трывіяльнае або аналітычным шляхам. (Хіба гэта не звычайны выпадак у практыцы?) Для праверкі і ацэнкі іх прапаноў рашэнне, спецыялісты праводзяць імітацыйных эксперыментаў, параўнаць вынікі і выбраць найбольш перспектыўныя рашэнні. Зараз выкажам здагадку, што ўсё гэта будзе мадэлявацца.

Малюнак 11: Асноўныя ідэі Укладзеныя мадэляванне.


Укладзеныя Прыклад мадэлявання: сеткі масавага абслугоўвання, часткай якога аптымізуецца паўтараецца укладзеных мадэлявання.

На малюнку 12 паказана мадэляваных сістэмы. Гэта абстракцыя, напрыклад банка, у якім кліентам спачатку стаяць у адной чарзе да касіра. Пасля таго, абслугоўваецца касірам, кліентаў абслугоўваецца касірам. Існуе яшчэ адна чаргу, дзе кліентам чакаць для касіраў. Выпадковы інтэрвал паміж паступленнямі і выпадковыя моманты часу службы лічыльнікаў і касіраў вядомыя. Выкажам здагадку, што існуе пэўны лік клеркаў, якія могуць працаваць як у якасці лічыльнікаў і ў якасці касіраў. Упраўленне банк хоча, каб праверыць шлях клеркаў вылучаюцца ў якасці лічыльнікаў і ў якасці касіраў на працягу тыповага зрух з трох перыядаў: у працы, у рэжыме чакання, і вельмі напружаным з рознымі інтэрваламі паміж паступленнямі ад кліентаў. Каб знайсці лепшае размеркаванне палітыкі, укладзеных мадэлявання могуць быць выкарыстаны такім чынам: у пачатку кожнага перыяду, унутраныя паўторнага мадэлявання правераць паводзіны першым этапе для рознага колькасці лічыльнікаў (відавочна, у дыяпазоне ад 1 да агульнае вядомае лік клеркаў). Выкарыстоўваючы вынікі гэтых эксперыментаў ўнутранага мадэлявання, кіравання абярэ лік клеркаў, якія будуць працаваць у якасці лічыльнікаў, іншыя будуць працаваць у якасці касіраў. Каб зрабіць праграму просты, рашэнне зрабіць карыстальніку, які даецца выніках ўнутранага мадэлявання, а затым увесці лік лічыльнікаў і колькасць касіраў. Рашэнне крытэрый сярэдняе час, праведзены на першым этапе. Палітыкі як такой, таксама ацэньваецца сярэдняе час, праведзены ва ўсёй сістэме.

Малюнак 12: чарзе сеткі з двух сервераў шматканальны.

Наступныя "Праграма" план праграмы мадэлявання (што варта). Звярніце ўвагу, што ўнутраны блок з прэфіксам Разлік вырабляецца раз у тры разы за ўсе магчымыя ліку лічыльнікаў. Ён змяшчае дэкларацыю класаў падобныя на знешнія. Розніца заключаецца ў простай паводзіны кліента, таму што ёсць толькі адна служба этапе. Існуе таксама ніякіх дадатковых укладанняў. Асноўным ўнутраныя мадэлявання падобны на прыклад, прыведзены ў частцы пра Мадэляванне сістэмы класа (актыўны падыход заказчыка).
Simulation Begin
  Declaration of global variables

  Process Class Generator;  Begin ... End;
  Process Class Customer;  Begin ... End;

  Initialize the global experiment

  For Period:=1 step 1 until 3 do begin
    For Trial:=1 step 1 until MaxClerks do

      Simulation Begin

        Declaration of internal global variables
        Process Class Igenerator;  Begin ... end;
        Process Class Icustomer;  Begin ... End;

        Perform and evaluate one inner experiment

      End of internal simulation;

    Show results of internal experiments;
    Select the best numbers of tellers and cashiers;

    Perform a part of outer experiment for this period

  End For;

  Evaluate the global experiment
End of program;

Наступная праграма з'яўляецца укладзенай імітацыйнай мадэлі з названай структуры.

 
!  NESTED мадэлявання з выкарыстаннем класа Мадэляванне Simula's    ;
!                                                           ;
!  Прыкладам можа служыць мадэль банка. Кліенты першага    ;
!  абслугоўваюцца лічыльнікаў, то па касіраў.                   ;

!  Хуткасць ўводу змяненняў у тры перыяду: ёсць занятыя ;
!  перыяду, то перыяд прастою і зноў заняты.        ;
!  Для кожнага перыяду паўтараецца ўнутраны вопыт мадэлявання ;
!  імітуе першую чаргу на пэўную хуткасць уваходнага  ;
!  і для рознага колькасці сервераў. Затым ён паказвае,    ;
!  Вынікі (сярэдні час, праведзены на першы сервер) і    ;
!  запытвае ў карыстальніка лік лічыльнікаў і лік;
!  касіраў. Падліковая заўсёды скончыць службу,    ;
!  ўжо пачалася. Мадэляванне павінна знайсці          ;

!  Час, праведзенае ў банку (сярэдняя і максімальная)   ;
!  для рознага колькасці служачых у тры перыяду.      ;
!                                                           ;

Simulation Begin
                                       ! Global variables: ;
   Integer Period,Trial;               ! Period, Trial number;
   Real Array MinInt,MaxInt(1:3);      ! Min and Max intervals;

   Real Array Duration(1:3);           ! Duration of periods [min];
   Ref(Head) Queue1,Queue2;            ! The two queues;
   Integer MaxClerks, Tellers, Cashiers;  ! Total numbers;
   Integer BusyTellers, BusyCashiers;  ! Numbers of working clerks;
   Real S1Mean, S1Std, S2Mean, S2Std;  ! Random normal servers;
   Integer SeedG, SeedS1, SeedS2;      ! Seeds of the random generators;

   Long Real TotalTime, MaxTime;       ! Variables for statistics;
   Integer CustomersOut;               ! Number of served customers;

   Process Class Generator;
   Begin
      While true do begin
             ! Interval between arrivals: ;

         Hold(Uniform(MinInt(Period),MaxInt(Period),SeedG));
         Activate New Customer(Time);
      End While;
   End of Generator;

   Process Class Customer(Arrival); Real Arrival;
   Begin

      Ref(Customer) Next;
      Real Spent;

      If (not Queue1.Empty) or (BusyTellers >= Tellers) then
         Wait(Queue1);   ! Has to wait in Queue1;
                         ! Service can start;

      BusyTellers := BusyTellers + 1;
      Hold(Normal(S1Mean, S1Std, SeedS1));  ! This is the teller service;
      BusyTellers := BusyTellers - 1;

      If (not Queue1.Empty) and (BusyTellers < Tellers) then begin
         Next :- Queue1.First;

         Next.Out;                          ! First from Queue1 served;
         Activate Next after Current;
      End If;

      If (not Queue2.Empty) or (BusyCashiers >= Cashiers) then
         Wait(Queue2);   ! Has to wait in Queue2;

                         ! Service can start;
      BusyCashiers := BusyCashiers + 1;
      Hold(Normal(S2Mean, S2Std, SeedS2));  ! This is the cashier service;
      BusyCashiers := BusyCashiers - 1;

      If (not Queue2.Empty) and (BusyCashiers < Cashiers) then begin

         Next :- Queue2.First;
         Next.Out;                          ! First from Queue2 served;
         Activate Next after Current;
      End If;

      CustomersOut := CustomersOut + 1;
      Spent := Time - Arrival;

      TotalTime := TotalTime + Spent;
      If Spent > MaxTime then MaxTime := Spent;
   End of Customer;

   Procedure Report;          ! Experiment evaluation;
   Begin

      OutText("  *** Report on external simulation ***"); OutImage;
      OutInt(CustomersOut,6); OutText(" customers ready at time ");
      OutFix(Time,2,10); OutImage;
      OutText("Average time in system: ");
      OutFix(TotalTime/CustomersOut,2,10); OutImage;
      OutText("Maximum time in system: ");

      OutFix(MaxTime,2,10); OutImage;
   End of Report;

! MAIN program body;

    SeedG  := 11;                    ! Seeds of random variables;
    SeedS1 := 13;
    SeedS2 := 17;

    MinInt(1) := 1; MaxInt(1) := 4;  ! Min and Max intervals;
    MinInt(2) := 2; MaxInt(2) := 9;
    MinInt(3) := 1; MaxInt(3) := 3;
    Duration(1) := 120;              ! Duration of periods;
    Duration(2) := 240;
    Duration(3) := 120;

    MaxClerks  := 6;
    S1Mean := 6;                     ! Random normal servers;
    S1Std  := 1;
    S2Mean := 8;
    S2Std  := 2;
    Queue1 :- New Head;

    Queue2 :- New Head;
    Period := 1;
    Activate New Generator;

For Period:=1 step 1 until 3 do begin

 Real Array TimeSpent(1:MaxClerks);
 OutText("  *** Results of internal simulation *** Period ");

 OutInt(Period,1); OutImage;
 OutText("      Tellers     Average time spent"); OutImage;

 For Trial:=1 step 1 until MaxClerks do
 ! ********************************************************** ;
  Simulation Begin
                                       ! Internal Global variables: ;

   Real TrialDuration;                 ! Internal experiment [min];
   Ref(Head) Queue;                    ! The queue;
   Integer Servers;                    ! Total number;
   Integer BusyServers;                ! Numbers of working clerks;
   Integer TrialSeedG,TrialSeedS;      ! Seeds of the random generators;
   Long Real TotTime;                  ! Variables for statistics;

   Integer CustOut;                    ! Number of served customers;

   Process Class IGenerator;
   Begin
      While true do begin
         Hold(Uniform(MinInt(Period),MaxInt(Period),TrialSeedG));
         Activate New ICustomer(Time);   ! Interval between arrivals: ;

      End While;
   End of IGenerator;

   Process Class ICustomer(Arrival); Real Arrival;
   Begin
      Ref(ICustomer) Next;

      If not Queue.Empty or (BusyServers >= Servers) then
         Wait(Queue);    ! Has to wait in Queue;
                         ! Service can start;
      BusyServers := BusyServers + 1;
      Hold(Normal(S1Mean, S1Std, TrialSeedS));  ! Teller's service;
      BusyServers := BusyServers - 1;

      If not Queue.Empty then begin
         Next :- Queue.First;
         Next.Out;                       ! First from Queue served;
         Activate Next after Current;
      End If;

      CustOut := CustOut + 1;
      TotTime := TotTime + Time - Arrival;
   End of ICustomer;

  ! Internal MAIN program body;

    TrialSeedG := 7;                  ! Seeds for random variables;

    TrialSeedS := 23;
    Servers := Trial;
    TrialDuration := 600;
    Queue :- New Head;
    Activate New IGenerator;
    Hold(TrialDuration);             ! Internal experiment duration;

    TimeSpent(Trial) := TotTime/CustOut;
    OutInt(Trial,13);
    OutFix(TimeSpent(Trial),3,23); OutImage;

   End of internal simulation;
 ! ********************************************************** ;

  OutText("Enter the number of tellers : "); OutImage;
  Tellers := InInt;
  OutText("Enter the number of cashiers : "); OutImage;
  Cashiers := InInt;
  Hold(Duration(Period));
  Report;

  OutText("Press Enter to Continue."); OutImage; InImage;
 End For;
End of program;

Гэта выхад з імітацыйнай мадэлі разам з лікамі ў палях ўводу. Агульная колькасць служачых складае 6, нумары, выдзеленыя ў якасці лічыльнікаў і касіраў ўводзяцца карыстальнікам. Звярніце ўвагу на максімальнае час знаходжання ў сістэме. Яна захоўваецца разумныя да трэцяга перыяду, калі ён падняў на 63,93 хвілін (адзначым, што агульны сярэдні тэрмін службы складае 6 8 = 14 хвілін). Так што зразумела, што ў трэцім вельмі напружаны перыяд, яшчэ адзін клерк б значна палепшыць паводзіны сістэмы. Гэтая гіпотэза была правераная іншым мадэлявання працаваць з тымі ж дадзенымі, за выключэннем яшчэ аднаго касіра ў трэці перыяд (4 лічыльнікаў, 3 касіраў). Гэта дало наступныя вынікі: сярэдні час, праведзены ў сістэме 19,67 (21,84 на 2 касіраў), максімальнае час, праведзены ў сістэме 36,58, што з'яўляецца чаканае паляпшэнне. Так вынікі мадэлявання прапанова кіравання выдзеліць яшчэ адзін касір ў трэцім вельмі напружаны перыяд, у адваротным выпадку сістэма паводзіць сябе так з 6 клеркаў.
 
  *** Results of internal simulation *** Period 1
      Tellers     Average time spent
            1                181.404
            2                 52.691
            3                  6.132

            4                  5.979
            5                  5.972
            6                  5.972
Enter the number of tellers :
3
Enter the number of cashiers :
3

  *** Report on external simulation ***
    42 customers ready at time     120.00
Average time in system:      18.52
Maximum time in system:      25.95
Press Enter to Continue.
  *** Results of internal simulation *** Period 2
      Tellers     Average time spent

            1                 36.620
            2                  6.090
            3                  6.045
            4                  6.038
            5                  6.038
            6                  6.038

Enter the number of tellers :
2
Enter the number of cashiers :
4
  *** Report on external simulation ***
    91 customers ready at time     360.00
Average time in system:      17.29
Maximum time in system:      27.16

Press Enter to Continue.
  *** Results of internal simulation *** Period 3
      Tellers     Average time spent
            1                205.290
            2                103.226
            3                  7.937

            4                  5.993
            5                  5.974
            6                  5.972
Enter the number of tellers :
4
Enter the number of cashiers :
2

  *** Report on external simulation ***
   119 customers ready at time     480.00
Average time in system:      21.84
Maximum time in system:      63.93
Press Enter to Continue.

Назад да зместу


Што дрэннага ў SIMULA?


Simula ніколі не стала шырока распаўсюджвацца распаўсюджаны мову. Існуюць розныя прычыны, якія тлумачаць гэты факт. Нават нягледзячы на ​​тое прычын усе залежаць адзін ад аднаго, наступная спроба згрупаваць іх з розных Ponts гледжання.

Увогуле:

Моўныя асаблівасці:

  • Абмежаваны доступ да файлаў аб'ектаў (типизированные файлы)
  • Адсутнічае тыпы дадзеных (справаздачы, наборы)
  • Ніякіх папярэдніх паралелізму і падтрымкі рэальнага часу
  • Няма падтрымкі GUI
  • Доўгія выкананыя файлы для кароткатэрміновых праграм

ААП магчымасці:

  • Няма множнае спадкаваньне
  • Няма інтэрфейсаў

Мадэляванне:

  • Няма аўтаматычнага збору статыстыкі
  • Няма генератар справаздач
  • Няма карысных спецыялізаваных аб'ектаў (рэсурсаў)

Назад да зместу


Спасылкі

Кнігі / дакументы

Бертуисл, GM, O.-J. Даль, В. Myhrhaug і К. Nygaard: SIMULA Бегін, Ауэрбах выдаўцоў Inc, 1973.

Кулі, RJ: Уводзіны ў праграмаванне на SIMULA , Оксфард, Blackwell Scientific Publications, 1987.

Kirkerud, Б.: аб'ектна-арыентаванае праграмаванне з Simula, Addison-Wesley, 1989.

Holmevik, JR (1994). "Зборка SIMULA: гістарычнае даследаванне тэхналагічнага генезісу". IEEE Аналы гісторыі вылічальнай тэхнікі, 16 (4), з 25-37, 1994. Артыкул была таксама прадстаўлена на 18-й Канферэнцыі агу ў 1992 годзе, і апублікаваная ў SIMULA Рассылка vol.20 (1), кастрычнік 1992 года.
Дзякуючы's ласкавага дазволу г-н Holmevik вы можаце спампаваць лакальную копію сваёй працы Кампіляцыя SIMULA .


Перыядычныя выданні

Матэрыялы штогадовых канферэнцый агу. (Першы 1973 г. Осла).


Вэб месцах

DIRO Simula дома з'яўляецца Simula арыентаваных старонкі адбылося ў дэпартаменце d'Informatique інш Recherche opérationnelle (Універсітэта Манрэаля). Яна змяшчае шмат цікавых ідэй і далейшыя спасылкі.

Агу (Асацыяцыя Simula карыстальніка) размешчаны на ISIMA, Універсітэт Блез Паскаль, Францыя. Ён змяшчае (сярод іншых) інфармацыю аб агу канферэнцыях і шырокую бібліяграфію.

 

Published (Last edited): Jun 2 , source: http://staff.um.edu.mt/jskl1/talk.html