| Translations Blog |

Free Drawings

SIMULAdagi OOPga kirish

Tarjima qilingan maqola - INTRODUCTION TO OOP IN SIMULA

Muallif(lar) - J.Sklenar

Maqolaning manbasi:

http://staff.um.edu.mt/jskl1/talk.html

© 1997 J.Sklenar ( [email protected] )


Ushbu hujjat 5/12/1997 yil Malta Universitetida o'tkazilgan " Ob'ektga asoslangan dasturiy ta'minotning 30 yillari" deb ataluvchi IT seminarigaasoslangan . Birinchi ob'ektga asoslangan Til (OOL) Simula 67 Ole Johan Dahl va Kristen Nygaard tomonidan 1967 yil may oyida Oslo yaqinidagi Lysebu shahrida Simfoniya tillarini o'rganish bo'yicha IFIP TC 2 ishchi konferentsiyasida rasman taqdim etildi. 30 yil bir inson va bir nechta kompyuter avlodlarini ifodalaydi. Uzoq vaqt davomida foydalanishga qaramasdan, bugungi kunda amalga oshirilgan barcha zamonaviy dasturlash ishlari Simula tushunchasida OOP birinchi marta kiritilgan printsiplarga asoslangan. Bundan ham muhimi, Simula hozirgi kunga qadar to'liq ishlatilmayotgan va hatto umumiy dasturiy ta'minot bilan emas, balki OOP jamoatchiligining odamlar tomonidan ham tushunilmagan ob'ektlarni o'z ichiga oladi.Nutqning maqsadi Simula xususiyatlarini, asosan, boshqa OOLlarda mavjud bo'lmagan asosiy xususiyatlardan qisqacha tanishtirildi. Ushbu hujjatning maqsadi ham xuddi shunday.

Eslatmalar:

  1. Quyidagi matnda term ob'ekti sinf namunasini bildiradi (ob'ekt Paskalning "ob'ektlari" va boshqa OOLlarning aslida sinflar ekanligini e'tiborgaoling).
  2. Ushbu hujjatda keltirilgan barcha dasturlarni ( simprogs.zip ) va yana bir nechasini yuklab olishingiz mumkin. Bundan tashqari, Simula Simsisga juda o'xshash SIMSET.PAS bilan Turbo Paskal birligi ham mavjud. Ma'lumotlar tuzilmalari bilan turli xil elementlar bilan ishlashni xohlasangiz, foydalaning. Ba'zi bir katalogdagi zip faylini kengaytiring, bu erda Readme faylidagi qisqa ma'lumot bilan dasturlarning ro'yxatini topasiz.
  3. Agar siz Simulationda yangi bo'lsangiz, sahifani ko'rib chiqishni ko'rib chiqing Kompyuter Simulationning asosiy g'oyalarini tushuntiruvchi simulyatsiya.

MUNDARIJA:

SIMULA - ASOSIY FAKTLAR

SIMULA I TARIXI

SIMULA 67 TARIX

SIMULA DATA TURLARI

SIMULA HAQIDA

SIMULA JARAYONLARI

SIMULA SINIFLARI

SIMULA PAKETLERI = NESTED SINFLARI

SIMULA STANDARD PAKETLARI

SIMULA QUASIPARALLEL TIZIMLARI

SIMULATION = PARALLEL PROCESSLAR DUNYOSI

SIMULA NESTED QPS

SIMULA NESTED SIMULATION

SIMULA BILAN NIMA XATO ?

 

SIMULA - ASOSIY FAKTLAR


Simula I = Algol 60 ga asoslangan jarayonga asoslangan alohida simulyatsiya tili. (1964-1965) Simu lation la nguage.

Simula 67 = Umumiy ro'yxatga olingan (tizim sinfi Simset ) va alohida jarayonga yo'naltirilgan simulyatsiya (tizim sinfi simulyatsiyasi) ni qo'llab-quvvatlaydigan tizim sinfi bilan umumiy ob'ektga yo'naltirilgan til. (1967 - 1971 yillar) Sim pa u niversal la nguage.

Simula = Simula 67 (Bu raqam endi ishlatilmaydi, chunki Simula I juda uzoq vaqt ishlatilmadi).

Shakl 1: Simula muhitida asosiy qismlar va interfeys satrlari.

 


SIMULA I TARIXI


(Manba: Jan Rune Xolmevik : Simula kompilyatsiya qilish - mana bu yozuvlarga qarang)

1952 Kristen Nygaard Operatsion tadqiqotlar, shu jumladan, simulyatsiya modellarini yozishni boshlaydi. Muammo: murakkab real dunyoni kontseptsiyalash. Simula boshidan buyon sistemaning ta'rifi va dasturlash tili bo'lishni maqsad qilgan.

1960 Algol 60, suyakka asoslangan prinsipga asoslangan haqiqiy rekursiv blok mexanizmini qurgan . Barcha muhim nazorat tuzilmalari joriy etildi.Simula preprocessor bilan Algol 60 paketiga mo'ljallangan.

1962 yilda Ole-Johan Dahl va Kristen Nygaard Osloda Norvegiya Hisoblash Markazida (NCC) uchrashishdi. Mundichdagi IFIP 62 Dunyo Kongressida birinchi rasmiy til taklifi taqdim etildi.

1963 Simula loyihasi UNIVAC tomonidan qo'llab-quvvatlandi , natijada 1963 yilda UNVAC 1107-sonli qo'shma korxona o'rnatildi.

1963 Sog'lom Algol stack mexanizmi va Simula ning murakkab simulyatsiya imkoniyatlari o'rtasidagi to'qnashuv quyruq qoida uchun ko'proq yo'naltirilgan. Preprocessor g'oyasi tark etdi, Simula mustaqil Algol tiliga aylandi .

1963 Ole-Johan Dahl ikki o'lchovli erkin hududlar ro'yxatiga asoslangan yangi saqlashni taqsimlash sxemasida ishlaydi.

1964 Faol komponentlar ( faoliyat yondashuvi ) tarmog'i orqali o'tadigan passiv mijozlarning asl g'oyasi cheklovchi omil bo'ldi . Boshqacha qilib aytganda, faol mijozlar passiv tarmoq orqali harakat qilishadi. Bu umumlashtiruvchi umumiy jarayon kontseptsiyasiga olib keldi:

Tizim = interaktiv quasiparallel jarayonlarning to'plami.

1964 Dekabr oyida NCC-ning UNIVAC 1107-da ishlaydigan Simula kompilyatorining birinchi prototipi, Simula I qo'llanmasi 1965-yil mayda paydo bo'ldi. Birinchi yil davomida Simula Operatsion tadqiqotlarning keng doirasiga murojaat qildi.

 


SIMULA 67 TARIXI


(Manba: Jan Rune Xolmevik : Simula kompilyatsiya qilish - mana bu yozuvlarga qarang)

1965,66 Simula I Shvetsiya, Germaniya, AQSh (Burroughs B5500), Sovet Ittifoqi (URAL 16) va boshqa mamlakatlarda foydalanar edim. Tilni tanishtirish va o'rgatish.

1965 Tony Hoare ning rekord klassi kontseptsiyasi Algol blyutasida taqdim etildi. Nygaard va Dahl diqqat bilan tekshirilgandan so'ng, g'oyalarni qabul qiladilar, biroq umumiy tasavvur hali ham yo'qolib ketgan.

1966 Prefiks fikrini tanishtirish. Ikki qatlamdan iborat bo'lgan jarayonlar (keyingi obyektlar): prefiks qatlami, asosiy qatlam. Subklasslar fikrlari.Nygaard va Dahl yangi umumiy oliy darajadagi tilda ishlashni boshlaydi.

1967 (may). Simlo 67 rasmiy ravishda Dalli va Nygaard tomonidan Osloning yaqinidagi Lysebu shahrida Simplatsiya tillari bo'yicha IFIP TC 2 ishchi konferentsiyasida taqdim etildi.

1967 (iyun). Common Base Standard deb nomlangan Simula 67 standartining ta'rifi.

1968 Simula Standartlar Guruhining birinchi yig'ilishi (SSG). Bjorn Myhrhaug tomonidan amalga oshirilgan mag'lubiyatga ishlov berish va I / U qabul qilinganidan so'ng, Simula rasmiy ravishda muzlatilgan .

1973 Simula Users (ASU) Jamiyati ta'sis etildi. Simula shu yili 250 dan ortiq saytlarda foydalangan.

Amaliyotlar:

1969 CDC 3300, 3600 (Norvegiya - Oslo universiteti, NDRE)

1971 UNIVAC 1100 (NCC)

1972 IBM 360/370 (NCC)

1972 CII 10070, IRIS 80 (Frantsiya)

1973/74 CDC 6000 (Frantsiya, Niderlandiya), CDC Cyber ​​70 (NDRE)

1975 DEK 10 (Shvetsiya) va boshqalar.

Muddatli adabiyotlar:

ASU ning yillik konferentsiyalarining materiallari (dastlab 1973 yilda Osloda)

ASU axborotnomasi

 


SIMULA DATA TURLARI


Simula yuqori darajadagi uchinchi avlod tillaridagi barcha umumiy vositalarni o'z ichiga oladi. Shuning uchun keyingi ikkita bo'lim qisqa xulosalar bo'lib, matn faqatgina istisno bo'lib qolmoqda.

Qiymat turlari

Integer    Short Integer
Real    Long Real
Boolean    Character

Ariza turlari

Object Reference   Declaration:  Ref( Object Identifier) (None is the trivial value)
Text   Constants:  "A", "Simula", Notext

Matn kontseptual deb ataladi va uning atributlari va usullari mavjud.

Usullari : 
Boolean Procedure Constant; (Agar haqiqiy bo'lsa) 
Text Procedure Main; (Asosiy satr - matn Asosiy qismidir) 
Integer Procedure Start; (Boshlang'ich joy) 
Integer Procedure Length; (Belgilar soni) 
Integer Procedure Pos; (Hozirgi lavozim) 
Procedure SetPos(i); Integer i; (O'zgartirish holati) 
Boolean Procedure More; (To'g'ri, agar Pos <= Length) 
Character Procedure GetChar; (Posdan olingan belgilar) 
Procedure PutChar(c); Character c; (Posga belgi qo'yish) 
Text Procedure Sub(i, n); Integer i,n; ( I uzunlikdagi substring) 
Text Procedure Strip; (To'g'ri bo'shliqlarni olib tashlaydi)

De-editing usullari : 
Integer Procedure GetInt; (Tamsayı o'qiydi) 
Long Real Procedure GetReal; (Haqiqiy o'qiydi) 
Integer Procedure GetFrac; ( GetInt kabi, bo'shliqlarni hisobga olmaydi)

Editing usullari: 
Procedure PutInt(i); Integer i; (Tamsax qiymatini yozadi) 
Procedure PutFix(i, n); Integer i,n; (O'nlik qiymati yozadi) 
Procedure PutReal(r, n); Long Real r; Integer n; (Ilmiy shaklda yozadi) 
Procedure PutFrac(i, n); Integer i,n; (3-guruh, bo'shliqlar)

Matn yaratish
Text Procedure Blanks(n); Integer n; (Blanklarni qaytaradi) 
Text Procedure Copy(T); Text T; (T nusxasini qaytaradi)

Massivlar

Bloklarda e'lon qilingan massiv misollari (n, m, a, b global o'zgaruvchilar): 
 Integer Array MyList (1:100);
 Array Matrix (1:n, 1:m); (Yopiq tip haqiqiydir) 
Character Array Buffer(1: If a>b then a else b);

 


SIMULA HAQIDA


Oddiy so'zlar

Assignment  :=   Misollar:  X := If a>b Then a Else b ;  X:=Y:=0; ( ** available )

Reference Assignment :-   Misollar:  Queue :- New Head;   T :- Blanks(80);

Procedure

Go to   Goto

Structured statements

Begin ... End;

If ... Then ... If ... Then ... Else ... ;

Switch  Misol:

 
Switch Target := L1, L2, L3, ... ;
 
Goto Target( Index_expression );
 
  L1: ...
 
  L2: ...

 
While ... do ... ;

For  (juda oddiy)  Misol:

 
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;

Output: 1 13 20 30 40 70 71 72 73 74 75 100 150 200 250 1000 1500

 


SIMULA JARAYONLARI


Parametrlarni o'tkazish usullari:

Shakl 2: Parametrlarni o'tkazish tartibi matn parametrlariga qo'llaniladi.

Jarayonlar

Ikki kirish va bitta chiqish parametrlari bilan namuna amaliyoti: (O'ng chizilgan matnni ko'rsatadi)

   
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

Ikki kirish parametri bilan namuna tamsayı funksiyasi: (eng katta umumiy divisorni hisoblaydi)

 
Begin
  Integer Procedure GCD(M, N); Integer M, N;
  Begin
     While M<>N do
        If M

     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;

Eslatma: Funktsiyani noma'qul jarayonlar deb atash mumkin.

 


SIMULA SINIFLARI


3-rasm: Simula sinflari to'rt qismdan iborat.

Deklaratsiya:


   

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;


 

Ob'ektni ishlab chiqarish:

Ref(Rectangle) R; (Sinf mos yozuvlar o'zgaruvchisi)

...

R :- New Rectangle(50, 40); Ushbu ob'ektni yaratishda ishtirok etadigan faoliyat:


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

 

Subklasslar deklaratsiyasi:


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; 

 

Ob'ektni ishlab chiqarish:

Ref(Rectangle) R; (Sinf mos yozuvlar o'zgaruvchilar) 
Ref(LocRectangle) LR;

...

R :- New Rectangle(50, 40);
LR :- New LocRectangle(20, 30, 100, 200); (Bundan tashqari, ota-sinf uchun parametrlari bor ekanligini unutmang, iltimos)

Yuqorida ko'rsatilgan ob'ektni ishlab chiqarishga taalluqli tadbirlar:


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

 

Bu har qanday uzunlikdagi prefiks qatoriga umumlashtirilishi mumkin

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

...

X :- New C;

Ichki tomonidan o'zgartirilmagan bo'lsa - keyingi paragrafga qarang, yuqorida ko'rsatilgan ob'ektni ishlab chiqarish bilan bog'liq faoliyat turlari:

     LifeA LifeB LifeC

-

Deklaratsiya bo'yicha hayot qoidalarini buzish Ichki :

Namuna deklaratsiyasi:

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;

Yuqoridagi ob'ektni ishlab chiqarishga oid faoliyatning ketma-ketligi:

LifeA1 LifeB1 LifeC1 (C hayotining ichki hayotida) LifeC2 LifeB2 LifeA2

Eslatmalar : 
1) Yo'qolgan Ichki narsa, sinf oxirigacha darhol Inner bilan bir xil. 
2) Sinflarning tanasida ko'pincha bir Innerga ruxsat beriladi.

 

Prefiks bloklari:

Quyidagi tuzilma bilan dastur qabul qilamiz:


Begin
   Class A(P); Integer P;
   Begin  LifeA1  Inner;  LifeA2  End;
   Part1
   A(3) Begin
     Block body
   End;
   Part2
End;

Yuqorida ko'rsatilgan blokni bajarish bilan bog'liq faoliyat:


       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.


 

Yuqoridagi dasturda operatsiyalar ketma-ketligi quyidagicha:


              Part1      LifeA1      Badanni bloklash      LifeA2      Part2 

 

Oldindan bog'langan blok kontseptual bo'lib , unda nomga ega bo'lmagan sinf namunasi :

- prefiks sinfining parametrlari

- ko'proq xususiyatlar (sinf atributlari + mahalliy blok o'zgaruvchilari)

- ko'proq usullar (sinf usullari + mahalliy bloklar)

- murakkabroq hayotiy qoidalar (sinfning tanasi + blokli tanasi).

Eslatmalar:

1) Blok prefiks mexanizmi oddiy kurslarda juda foydali emas. Mumkin bo'lgan foydalanish - bu sinfga sinf deklaratsiyalarini (parametrlar, atributlar va usullar) import qilish. OOP asoslari tomonidan yaratilgan modullarni aks ettiradigan asosiy sinflar (keyingi bobga qarang) asosan ishlatilishi kerak.Asosiy sinfi tomonidan blokni prefiks qilish (misol uchun, Simulyatsiya kabi) barcha dasturlash muhiti yoki Simula asoslangan tillarni o'z ichiga olishi mumkin.

2) Simula dasturlarida aniq xotira ajratmasligi mavjud emas, chunki Garbage Collector shikastlangan sinflar tomonidan ishg'ol qilingan xotirani avtomatik ravishda tiklaydi.

 

Oldindan tartibda navigatsiya

Quyidagi matn ushbu xabarlarga asoslanadi:

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. Inspect bayonotining malakasi

a ) Asosiy

Inspect XA do Show; asosan XA.Show bilan bir xil bo'ladi ;

Taqqoslash XA = yo'q bo'lsa Inspect bilan amalga oshiriladi , keyin bajarilgan so'zlar e'tiborga olinmaydi. Agar XA = yo'q bo'lsa, XA.Shou natijasi ish vaqti xatoligiga sabab bo'ladi.

b) Yoki boshqa moddalar bo'yicha testdan o'tish

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

c) Punktsiya bo'yicha testning turi qachonki 

A, B va C turidagi turli xil narsalar bilan bog'langan ro'yxatni ko'rsatish, ularning boshi ko'rsatkichi birinchi bo'lib:


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 ilova shartlari bo'yicha bir martalik malaka

Yuqorida keltirilgan bayonotlarga asoslanib, bu bayonotlarni o'qing:


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;

Eslatma : Ref ( B) XB deb e'lon qilingan B mos keladigan mos yozuvlar o'zgaruvchining normal xususiyatlari :

Ushbu normal xususiyatlarni Inspect yoki Qua tomonidan engib o'tish mumkin. Uchinchi qoida bo'yicha odatiy kech ulanish mexanizmi (masalan, ob'ekt Paskalda) Simulada avtomatik ravishda ishlamaydi . Ushbu muammoni hal etish bilan Inspect maqolalarni o'qing qachonki - yuqoridagi misolga qarang. Simulaning yondashuvi foydalanuvchi uchun kamroq bo'lishi mumkin, lekin u umumiydir va dasturchi nazorat ostida bo'lgan hamma narsaga ega.

 

3. Buni O'ziga havola qilish (This)

Quyidagi kod ob'ektni ro'yxatga qo'shadigan A usuli bo'lib, birinchi:


Procedure Add_to_List(First); Name First; Ref(A) First;
Begin
   Link :- First; First :- This A
End;

-
4. Is va In ixtiyoriy testlarni malaka oshirish

Ref (B) XB va Ref (A) XA deklaratsiyalariga asoslanib, o'z- o'zidan tushunish kodi segmentlari foydalanuvchi va foydalanuvchilarning juda qulay operatorlaridan foydalanishni ko'rsatadi. E'tibor bering, masalan, ob'ekt Paskalning Is va In ning ekvivalenti yo'q. Ob'ektni Paskal-dagi ushbu muammoning yagona In echimi ajdodlarni identifikatsiya qilish usullarini amalga oshirishdir.


  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. Atributlarni muhofaza qilish

Hidden sifatlar faqatgina e'lon qilingan sinfning tanasida ishlatilishi mumkin.

Protected atributlar faqat ular e'lon qilingan sinf sinflarida va barcha quyi sinflarda qo'llanilishi mumkin.


SIMULA PAKETLERI = NESTED ISHLARI


Shakl 4: Simula sinflari har qanday chuqurlikda joylashgan bo'lishi mumkin.

Mahalliy sinflarni e'lon qilgan sinflarga asosiy sinflar deb nomlanadi. Keyingi namunadagi kod Geometriya deb nomlangan asosiy sinfni belgilaydi.



 

! 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; 

Keyingi dastur asosiy sinf Geometriyadan foydalanmoqda. Geometriyada e'lon qilingan sinflar qanday qilib muammoni hal etishga ixtisoslashgan subklasslarni e'lon qilish uchun foydalaniladi. Keyinchalik import va mahalliy sifatida e'lon qilingan sinflarga malakali mos yozuvlar o'zgaruvchilarini e'lon qilish va ulardan foydalanish mumkin. Bu Simula asoslangan paketlar yoki foydalanuvchi tomonidan belgilangan tillarning asosiy g'oyasi (farq nimada?)


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 STANDARD PAKETLARI


Atrof-muhit - tizimning imkoniyatlari

Xususiyatlar quyidagilar uchun mavjud:

Quyidagi usullar mavjud:

 

BasicIO - tashqi dunyo

Barcha kirish va chiqish operatsiyalari fayl moslamalari usullari bilan ifodalanadi. File deb ataladigan umumiy ata - 5-rasmga qarang - barcha fayllar uchun umumiy imkoniyatlar mavjud. Uning pastki sinflari ByteFile va ImageFile (matnli fayl - "tasvir" matn buferi). Ikkalasi ham kirish usuliga (kirish, chiqish, to'g'ridan-to'g'ri kirish) ko'ra ixtisoslashgan. OutFile , sahifa yo'naltirilgan matnli chiqimlarni amalga oshiruvchi yana bir tushadigan PrintFile ega. Simula'da , masalan, yozuvlar yozilgan fayllar yo'qligiga e'tibor bering. Ushbu turdagi fayllar byte fayllari yordamida amalga oshirilishi mumkin.5-rasmda selfexplaining nomlari bilan bir necha muhim usullar mavjud.

Shakl 5: Simula fayl sinflarining ierarxiyasi.

Dastur doirasi

Simuladagi barcha tizimlar kontseptual ravishda ma'lum atributlar, usullar va mahalliy sinflar bilan mashg'ulotlar sifatida qo'llaniladi. Foydalanuvchining dasturlari quyidagi ramkaga qo'shilganidek yoziladi. Sinf BasicIO ning hayot qoidalari foydalanuvchi kodini ishga tushirishdan avval tizim fayllarini yaratadi va ochadi. Uning tugatilishidan so'ng tizim fayllari yopiladi. Foydalanuvchi kodi ikkita Inspect iborasiga kiritiladi. Bu shuni anglatadiki, tizim fayllari (masalan, GetInt , OutImage , va boshqalar) usullari fayl nomidan oldin bo'lmasligi kerak.



 

  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 - bog'langan ro'yxatlarning dunyo

Simset tizimi sinfi, dastlab "siljishlar" deb ataladigan ulanishga jalb qilingan bosh element bilan birga dumaloq ikki tomonlama bog'langan ro'yxatlarni amalga oshiradi - 6-rasmga qarang.

Shakl 6: Simula tizimidagi Simset tizimida qo'llaniladigan ro'yxatlar.

Yuqoridagi ro'yxatlar uchta sinf bilan ifodalanadi - 7-rasmga qarang. Bog'lanish - ikki tomonlama aloqalar haqida ma'lumot. Bundan tashqari, nom va a'zo elementlari sifatida ixtisoslashgan.

7-rasm. Sinf sinfida e'lon qilingan sinflar Simset.

Tegishli sinflar usullari:

Linkage

Head

Link

Murakkab usullarni ifodalash uchun uslublar birlashtirilishi mumkin. Masalan, protsedura bayonoti:

Queue1.Last.Precede ( Queue2.First);

navbatdagi navbatni Queue1 dan o'chiradi va navbatning boshida qo'shimchalar Queue2.

 


SIMULA QUASIPARALLEL TIZIMLARI


Simula predmetlarining hayot qoidalari vaqtinchalik to'xtatilishi va keyinroq qayta tiklanishi mumkin bo'lgan korutinlardir . Simulada ikkita darajadagi parallelizm mavjud. Birinchi daraja vaqt bilan ishlamaydi, dasturchi " kvazipparda o'ylaydi". Ikkinchi daraja vaqt tushunchasini kiritadi, dasturchi parallel ravishda (foydalanuvchi nuqtai nazaridan) ishlaydi. Birinchi daraja barcha sinflarga qo'llanilishi mumkin, ikkinchi daraja sinf sinfi tomonidan amalga oshiriladi. 8-rasmda ob'ekt X ning bir qismini (tanasining) mumkin bo'lgan holatlari ko'rsatilgan. E'tibor bering, keyingi vositalaridan hech birini ishlatmaydigan, birinchi navbatda biriktiriladi va keyin bekor qilinadi (boshqa OLE ob'ektlari har doim tugatiladi). To'xtatilgan ob'ekt hali ham qo'llanilishi mumkin (uning usullarini chaqirish va / yoki uning atributlariga kirish mumkin). Ular quasipparallel tizimlar (QPS) bilan ishlashni qo'llab-quvvatlaydigan Simula uskuna (barcha sinflarda mavjud bo'lgan usullar):

Detach mavjud ob'ektning bajarilishini to'xtatadi (Detachni bajaruvchi). Joriy ob'ekt alohida holga keladi. Tekshiruv joriy ob'ektni yaratilgan yoki qayta tiklangan nuqtaga o'tkaziladi.

Resume(Y) qaytadan boshlangan Y ob'ektini faollashtiradi. Joriy ob'ekt alohida holga keladi.

Call(Y) Resume-ga o'xshash, ammo ob'ekt Y hozirgi ob'ektga biriktiriladi. Joriy ob'ekt alohida holga keladi. Joriy ob'ekt Y ni ajratib olingandan so'ng qayta tiklanadi.

 

8-rasm. Simula diagrammalarining davlat diagrammasi.


QPS 1-misol : Ikki Magistr yondashuvidan foydalangan holda shaxmat o'yinlarini nazorat qilish.

Quyidagi dasturda uchta tarkibiy qism mavjud : ikkita o'yinchi va asosiy blok. Birinchi ikkita harakat maxsus ekanligiga e'tibor bering. Bir o'yinchi uchinchi harakatdan boshlab ma'lum ehtimollik bilan g'alaba qozonishi mumkin: Draw ( 0.3, Seed) 0.3 ehtimollik bilan haqiqiy qaytadigan booleanfunktsiyadir. Asosiy blok ikki futbolchini qanday tashkil etganiga e'tibor bering, ularni Opponentning atributlari bilan bog'laydi va Oqni nazoratdan o'tkazadi. Keyin futbolchilar bir necha bor o'z harakatlarini qiladilar va raqibga qaytmasdan birovga qaytadilar. Bu ularning tanalarini tugatadi va nazorat asosiy blokka o'tkaziladi.



 

Begin


   Boolean Mate;

   Ref(Player) White, Black, Winner;

   Integer Seed;


 

   Class Player(PName); Text PName;

   BBegin
   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;

Bu yuqoridagi dasturning indentli chiqishi. Indentatsiya - bu chiqishni hosil qiladigan ob'ektni - chapdan ko'rsatadi: Main block (asosiy blok), White (oq), Black (qora).


  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-misol : Magistr va ikkita qul qulashi yordamida shaxmat o'yinlarini boshqarish.

Quyidagi dasturda ham uchta tarkibiy qism mavjud : ikkita o'yinchi va asosiy blok. Bu va oldingi dastur o'rtasidagi farq asosiy blokning faol roli hisoblanadi. Aktyorlar bir-birlarini qaytara olmaydilar. Ular faqatgina harakat qilishadi va ajratadilar. Asosiy blok ularni bittadan bitguncha faollashtiradi. Call foydalanishga e'tibor bering - o'yinchilar asosiy blokka qayta-qayta biriktiriladi.


  

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;

Bu yuqoridagi dasturning indentli chiqishi. Indentatsiya - bu chiqishni hosil qiladigan ob'ektni - chapdan ko'rsatadi: Main block (asosiy blok), White (oq), Black (qora).


  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 Misol 3 : Magistr va ikkita qul qulashi yordamida shaxmat o'yinlarini boshqarish (asosiy sinf).

Quyidagi dasturda asosiy Chess ikkita mahalliy mashg'ulotni e'lon qiladi: Player va Referee. Asosiy toifadagi hayot qoidalari o'yinni ikki futbolchi va hakamni yaratib, bog'lash orqali tayyorlaydi. Barcha uch narsalar ajralib chiqadi va asosiy sinfning tanasi tugaydi. O'yin dastur tomonidan boshlanishi kerak (shaxmatdan oldingi blok). Prefiks barcha deklaratsiyalarni import qiladi va o'yinni tayyorlaydi. Eslatib o'tamiz, prefed blok faqat hakamni faollashtiradi va o'yinni baholaydi.



 

 


  SClass 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; 

  Keyingi dastur shaxmatning asosiy sinfidan foydalanadi: 

  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; 

Bu yuqoridagi dasturning indentli chiqishi. Chiziq chizilgan ob'ektni ko'rsatadi - chapdan: Body of Chess, Prefixed block, White, Black.


  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 
 

SIMULATION = PARALLEL PROCESSLAR DUNYOSI


Tizim sinfi Simulation asosiy tushunchasi passiv davrlar bilan ajratilgan oniy voqealar (kod segmentlari bilan ifodalanadigan) Process ketma-ketligi. 9-rasmda Simulyatsiya e'lon qilingan sinflar va ularning usullari ko'rsatilgan. Event Notice (voqealar bayonnomasi) (Linkning pastki klassi) ma'lum vaqt ichida - EvTime - kelajakda amalga oshiriladigan rejalashtirilgan voqeani ifodalaydi. Proc kod segmentini faollashtiradigan jarayondir. SQS (boshning pastki klassi) - vaqt bo'yicha buyurtma qilingan voqealar ro'yxati. Diskret simulyatsiya tillarining odatiy Taqvimidir. Kontseptual ravishda buyurtma bog'langan ro'yxat, ichki dastur, odatda, yanada samarali daraxt tuzilishi asoslangan. Shubhasiz, ushbu ro'yxatga to'g'ridan-to'g'ri foydalanuvchi dasturidan kirish mumkin emas . Vaqt rejalashtirish vositalari mavjud - keyinroq ko'rib chiqiladi, jarayonlarni vaqt va o'zaro sinxronizatsiya bilan qo'llab-quvvatlaydi. Foydalanuvchi dasturining Process umumiy ajdodlar quyi sinflaridan iborat. Birinchi ikkita uslub uning holatini tekshiradi, ikkinchisi esa keyingi rejalashtirilgan tadbirni va uni yoqish vaqtini qaytaradi.

Shakl 9: Tizim sinfi simulyatsiyasi sinflari.

Tizim sinfi Simulyatorining imkoniyatlari "past darajadagi" quasiparallal usullar bilan amalga oshiriladi: ajratish, davom ettirish, qo'ng'iroq qilish, lekin ular foydalanuvchilar uchun osondir. Simulyatsiya foydalanuvchisi "parallel ravishda o'ylaydi". Simulyatsiya modelining dinamikasi parallel jarayonlarning o'zaro ta'sirida ifodalanadi. Bu juda tabiiydir - bu haqiqiy dunyo qanday ishlaydi.

Jarayon ob'ektining davlatlari:

Timing, Sequencing and Synchronizing Facilities:


Simulyatsiya 1-misol : Ko'p kanalli kuyruklama tizimi - Foydalanuvchi bilan xaridorlar yondashuvi.

10-rasmda simulyatsiya qilingan tizim ko'rsatilgan. Bu, masalan, mijozlarning biron bir navbatchi uchun navbatda kutib turadigan bankning ajralmas qismi. Kiritilganlarning oralig'i tasodifiy, 1 dan 3 minut orasida bir xil tarzda taqsimlanadi. Barcha serverlar bir xil tasodifiy ish vaqtiga ega, bu odatda o'rtacha qiymati 8 daqiqa va standart og'ish 2 daqiqaga bo'linadi. Simulyatsiya tizimida mijozning sarflagan o'rtacha vaqtini topishi kerak. (Yuqoridagi tizimning analitik modeli mavjud emasligiga e'tibor bering ). Simulada shunga o'xshash tizimlarni simulyatsiya qilish ( Simula tizimining simulyasiyasida aniq) har doim jarayonlarni identifikatsiyalash bilan boshlanadi. Bir jarayonlar, albatta, mijozlar ishlab chiqaruvchisi - u bir necha marta mijozlarni ishlab chiqaradi, borar vaqtini qayd qiladi va tasodifiy kechikishni kutadi. Tizimning dinamikasini ifodalash uchun ikkita mantiqiy yondashuv mavjud. Avval (bu misolda ishlatilgan) faol mijozlar va passiv serverlarga asoslangan. Aksincha yondashuv - faol serverlar, passiv mijozlar keyingi misolda ko'rsatiladi. Faol mijozlar quyidagi qoidalar bilan tasvirlangan hayotiy qoidalarga ega:

  1. Bepul server bo'lsa, davom eting. Aks holda kutib turing.
  2. Serverni tortib olib, tasodifiy kechiktirish hosil qiling, bu xizmat vaqtini aks ettiradi.
  3. Serverni qo'yib yuboring.
  4. Agar kutayotgan mijoz bo'lsa (quyruq bo'sh bo'lmasa) uni navbatdan olib tashlang va uni yoqing. (Faollashtirilgan mijoz 2-qadamni boshlaydi).
  5. Statistikani yangilash.

10-rasm: Bir qator va undan ko'p serverlardan iborat navbat tizimi.

Quyidagi dastur yuqoridagi tizimning simulyatsiya modelidir. Asosiy maqsadi, dasturning mantig'ini iloji boricha soddalashtirib ko'rsatishdir. Haqiqiy simulyatsiya modellari barcha o'zgarmaydigan parametrlar uchun so'raladi va ko'proq natijalar beradi (masalan, o'rtacha va maksimal quyosh uzunligi, va hokazo ). Quyidagi dasturda eksperiment davomida mavjud bo'lgan ikkita jarayon mavjud: generator va asosiy dastur (simulyatsiya bilan oldindan bloklangan), tajriba tugagunga qadar kutadi va natijada natijani ko'rsatadi. Keyinchalik, vaqtinchalik mavjud bo'lgan mijozlarning turli xil jarayonlari mavjud. Statistikani yangilashdan so'ng mijozlar to'xtatiladi. Tasodifiy kechikishlar yaratish uchun standart funktsiyalardan foydalaning. Simula'da eng ko'p ishlatiladigan tarqatish uchun standart funktsiyalar mavjud. Barcha tasodifiy ishlab chiqaruvchi tomonidan foydalaniladigan urug' sifatida tamsayı o'zgaruvchisi berilgan. Shunday qilib, barcha tasodifiy qiymatlar tasodifiy sonlarning alohida oqimlaridan foydalanishi yoki umumiy holda bo'lishishi mumkin.


   

! 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; 

Simulyatsiya misollari 2 : Ko'p kanalli kuyruklama tizimi - Active Server yondashuvi.

Simulyatsiya qilingan tizim avvalgi misolda bo'lgani kabi bir xil - qarang. 10-rasm. Taqqoslash - bu navbatdagi bo'shliqqa qadar ketma-ket mijozlarga xizmat ko'rsatadigan faol server . Keyin server passivates. Avval mijozlar barcha bekor serverlarni faollashtiradi (keyinchalik) va navbatga o'tadi. Bu, albatta, juda samarali emas, lekin sodda. Xizmatni tugatgandan so'ng mijozlar serverlar tomonidan faollashtirilgan. Hayotlarining qolgan qismida mijozlar faqat statistikani yangilaydi. Asosiy dastur barcha serverlarni yaratadi va faollashtiradi, biroq ular darhol bo'sh qoladi, chunki navbatda bo'sh qoladi. Keyin asosiy dastur generatorni faollashtiradi va tajriba tugagunga qadar kutadi.


   

! 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


Simulada quasparallel tizim (QPS) asosan bloklari (odatda, biroq prefits emas) bo'lib, tanasi asosiy blok bilan birgalikda quasiparralporutlar tizimini tashkil etgan ba'zi narsalarni yaratadi. Simula (Masalan, Paskaldan farqli o'laroq) haqiqiy bloklarga asoslangan tildir, chunki blokda (odatda QPS degan ma'noni anglatadi) kodning istalgan joyida ifodalanishi mumkin. Ya'ni, QPSda mahalliy (ichki) QPS-lar mavjud bo'lishi mumkin , bu ham mahalliy QPS va boshqalarni o'z ichiga olishi mumkin. Ushbu oddiy qoida, hozirgacha to'liq ishlatilmagan va hatto tushunilmagan natijalar bilan ajoyib murakkab tuzilmalarni yaratishga yordam beradi. Keyingi dasturda shaxmat nazoratida ichki QPSni ishlatish mumkin. Keyingi bobda ichki simulyatsiya bilan simulyatsiya dasturi namoyish etiladi.


Nested QPS namunasi : qarorning bir qismi sifatida simulyatsiya o'yinini qo'llagan shaxmat nazorati.

Keling, shaxmatchining qarorining bir qismi sifatida kelgusi harakatlarning mumkin bo'lgan natijalarini tekshirish uchun joriy o'yinni takrorlang. Quyidagi dastur (ikki Masters yondashuviga asoslanib) - mumkin bo'lgan echimning xulosasi. Sinfdorning TestStrategy uslubiga ega ekanligini Player har bir qarorning bir qismi sifatida chaqirilgan. Ushbu usul tashqi tomonga o'xshash QPS amalga oshiradi. TestStrategy tashqari tashqi o'yinchiga juda o'xshash bo'lishi mumkin bo'lgan (u xuddi shunday narsaga ega bo'lishi mumkin, ammo ichki joylashish muayyan darajada to'xtab turishi kerak bo'lgan) mahalliy TestPlayer sinfidan iborat . TestStrategy tanasi ichki QPS bo'lib, uning natijalari yuqori darajadagi Player tomonidan ishlatiladi.


  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 SIMULATION


Simula'da ikkita darajadagi quasparallelism mavjud, ikkalasi ham ichki tizimlarni qo'llashi mumkin. Oldingi bobda past darajadagi ichki QPS-lar bilan bog'liq. Tizim sinfi Simulyatsiyasi vaqt tushunchasini taqdim etadi. Bu degani, agar ichki bo'lsa, boshqa mahalliy (ichki) vaqtlar bo'ladi. Asosiy fikr 11-rasmda keltirilgan. Hold va x kechikishlar x va z kechiktirilishi asosiy (tashqi) vaqtga to'g'ri keladi. Kechikish y bilan Hold bayonoti boshqa muqobil dunyoda. Shunday qilib, Simulada hozirgacha faqat fan-fantastika tizimlarida simulyatsiya qilish mumkin. Amaliy ilovalar mavjud. Asosan, qaror qabul qilishning bir qismi sifatida simulyatsiya o'z ichiga olgan tizimlarni simulyatsiya qilish mumkin. Bu vaziyatni ko'rib chiqaylik: muayyan murakkab tizim va turli xil qarorlar taklif etadigan mutaxassislar guruhi, natijalari noyob yoki analitik tarzda sinovdan o'tkazilmaydi. (Amaliyotda bu odatiy hol emasmi?) O'z qarorlari bo'yicha takliflarni sinab ko'rish va baholash uchun mutaxassislar simulyatsiya tajribalarini o'tkazadilar, natijalarni solishtiradilar va eng istiqbolli qarorni tanlaydilar. Endi bularning barchasi simulyatsiya qilinadi.

  

11-rasm: Nested simulyatsiya haqidagi asosiy tushunchalar.


Ichki joylashtirilgan simulyatsiya namunasi : Tomning takrorlangan ichki simulyatsiyasi tomonidan optimallashtirilgan navbatchi tarmoq.

12-rasmda simulyatsiya qilingan tizim ko'rsatilgan. Bu, masalan, mijozlar birinchi navbatda kassetani kutib turgan bankni o'ziga jalb qiladi. Kassir tomonidan xizmat ko'rsatilgandan so'ng mijozga kassir xizmat ko'rsatiladi. Bundan tashqari, mijozlar kassirlarni kutayotgan yana bir navbat bor.Kelganlar va tasodifiy xizmatchilarning kassirlarning tasodifiy xizmat vaqtlari orasidagi tasodifiy oraliq ma'lum. Tasavvur qilaylik , bir necha xodimi bor, bu ham gapiruvchi, ham kassir sifatida ishlashi mumkin. Bank rahbariyati ish beruvchilar va kassirlar sifatida uch davrdan iborat odatdagidek o'zgarish vaqtida: mijozlar bilan band, bo'sh va juda band bo'lgan mijozlar kelishini tekshirishni istaydi. Eng yaxshi taqsimlash siyosatini topish uchun, ichki simulyatsiya quyidagi tarzda qo'llanilishi mumkin: har bir davrning boshida ichki takroran simulyatsiya turli bosqichlarda (birinchi navbatda 1 dan 1 gacha) jami ma'lum miqdordagi yozuvchi). Ushbu ichki simulyatsiya tajribalaridan olingan natijalarni qo'llash orqali boshqaruv xodimlar sonini tanlaydi, boshqalari esa kassirlar sifatida ishlaydi. Dasturni soddalashtirish uchun qarorni ichki simulyatsiya natijalari berilgan foydalanuvchi amalga oshiradi, so'ngra so'zlovchilar sonini va kassirlar sonini kiritish talab etiladi. Qaror mezonlari - birinchi bosqichda sarflangan o'rtacha vaqt. Bunday siyosat, shuningdek, butun tizimda sarflangan o'rtacha vaqt bilan baholanadi.

12-rasm: Ikki ko'p kanalli serverlardan tashkil etilgan navbatning tarmog'i.

Quyidagi «dastur» simulyatsiya dasturining kontseptsiyasi hisoblanadi. Simulyatsiya tomonidan prefikslangan ichki blok barcha mumkin bo'lgan raqamlar uchun uch marotaba amalga oshiriladi. U tashqi kurslarga o'xshash sinflarni e'lon qilishni o'z ichiga oladi. Farqi mijozning oddiy xatti-harakati , chunki faqat bitta xizmat ko'rsatish bosqichi mavjud. Bundan tashqari, ichki joylashtirish ham yo'q. Ichki simulyatsiya asosan tizim sinfi Simulyatsiyasi (faol mijozlar yondashuvi) bobida keltirilgan misolga o'xshaydi.


  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; 

Keyingi dastur yuqoridagi tuzilishga ega bo'lgan nested simulyatsiya modelidir.


   

!  NESTED Simulation using the Simula's class SIMULATION    ;
!                                                           ;
!  The example is a model of a bank. Customers are first    ;
!  served by tellers, then by cashiers.                     ;
!  The input rate changes in three periods: there is a busy ;
!  period, then an idle period and again a busy one.        ;
!  For each period the repeated inner simulation experiment ;
!  simulates the first queue for the particular input rate  ;
!  and for various numbers of servers. Then it shows the    ;
!  results (average time spent at the first server) and     ;
!  prompts the user for the number of tellers and the number;
!  of cashiers. Tellers always finish a service that has    ;
!  already started. The simulation should find the          ;
!  time customers spend in the bank (average and maximum)   ;
!  for various numbers of clerks in the three periods.      ;
!                                                           ;
 
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; 

Bu simulyatsiya modelining chiqishi kiritilgan raqamlar bilan birga. Ishtirokchilarning umumiy soni 6 tani tashkil qiladi, foydalanuvchi va kassir sifatida ajratilgan raqamlar foydalanuvchi tomonidan kiritiladi. Tizimda sarflangan maksimal vaqtni eslang. Uchinchi muddatgacha u o'rtacha 63,93 minutgacha ko'tarilgan (umumiy o'rtacha xizmat muddati 6 + 8 = 14 daqiqa). Demak, uchinchi juda band davrda yana bitta kotar tizimning xatti-harakatlarinisezilarli darajada yaxshilaydi. Bu gipoteza uchinchi davrda yana bir kassir (4 ta, 3 kassir) tashqari, xuddi shu ma'lumotlar bilan boshqa simulyatsiya bilan sinovdan o'tkazildi. Bu natijalarni berdi: tizimda o'rtacha vaqt 19.67 (21.84 kassirlar uchun), tizimda o'tkaziladigan maksimal vaqt 36.58 , ya'ni kutilgan yaxshilanish. Shunday qilib, simulyatsiya natijasi boshqaruvning uchinchi juda band davrida yana bir kassirni ajratish taklifi bo'lib, aks holda tizim 6 kishidan iborat.


   

  *** 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. 

Mundarija sahifasiga qaytish


SIMULA BILAN NIMA XATO?


Simula hech qachon keng tarqalmagan keng tarqalgan tilga aylangan. Bu haqiqatni tushuntirish uchun turli sabablar mavjud. Garchi sabablar bir-biriga bog'liq bo'lsa ham, quyidagi fikrlarni turli xil fikrlar bilan guruhlashga urinishdir.

Asosan:

Til xususiyatlari:

OOP xususiyatlari:

Simulyatsiya:

Flower Heart Coloring Pages

Angel Wings And Halo Drawing

Elijah Clipart

Spiderman Clipart For Kids

Fairy Coloring Pages

Ny City Silhouette

Free Ios App Icons

Crucifix Silhouette

Tell A Friend Icon

Free Cross Clipart