سیمولا

مقدمه

این زبان برای کاربردهای طراحی و شبیه‌سازی ایجاد شد. اهمیت زبان سیمولا به دلیل مطرح شدن ایده‌های شیء گرایی در این زبان بود. ایدهٔ کلاس مهم‌ترین ایدهٔ مطرح شده در این زبان است. در یک کلاس تعدادی داده به همراه توابع مورد نیاز تعریف می‌شوند. ایده مهم دیگری که در این زبان استفاده می‌شد توابع هم‌روند (به انگلیسی: Co-routine) بود. توابع هم‌روند برای انجام یک وظیفه توسط چند روال با هم دیگر هم کاری داشتند که باید حالت هر کدام حفظ شوند. این توابع در عمل باید برای اجرا به نوبت فراخوانی و اجرا شوند و حافظه باید ماندگار باشد و اجرا از محل قبلی ادامه یابد. سیمولا بر پایهٔ زبان الگول نوشته شده‌است.

برنامه حداقل

فایل کامپیوتر خالی یک برنامه حداقل در سیمولا است، که توسط حجم برنامه منبع اندازه‌گیری شده‌است. آن را از فقط یک چیز تشکیل شده‌است: بیان گنگ.
با این حال، برنامه حداقل به صورت مناسب تری به عنوان یک بلوک خالی جلوه داده می‌شود:
Begin

End;
آن اجرای برنامه را آغاز و بلافاصله خاتمه می‌دهد. زبان هیچ مقدار برگردانده شده از خود برنامه ندارد.

برنامه Hello World

توجه داشته باشید که در سیمولا بزرگی و کوچکی حروف مطرح نیست. نمونه‌ای از یک برنامه Hello World در سیمولا:
Begin
  OutText ("Hello World!");
  Outimage;
End;

کلاس ها، زیرکلاس‌ها و روش‌های مجازی

مثال واقعی تر با استفاده از کلاس‌ها، زیرکلاس‌ها و روش‌های مجازی:
Begin
  Class Glyph;
     Virtual: Procedure print Is Procedure print;;
  Begin
  End;
  Glyph Class Char (c);
     Character c;
  Begin
     Procedure print;
       OutChar(c);
  End;
  Glyph Class Line (elements);
     Ref (Glyph) Array elements;
  Begin
     Procedure print;
     Begin
        Integer i;
        For i:= 1 Step 1 Until UpperBound (elements, 1) Do
           elements (i).print;
        OutImage;
     End;
  End;
  Ref (Glyph) rg;
  Ref (Glyph) Array rgs (1 : 4);
  ! Main program;
  rgs (1):- New Char ('A');
  rgs (2):- New Char ('b');
  rgs (3):- New Char ('b');
  rgs (4):- New Char ('a');
  rg:- New Line (rgs);
  rg.print;
End;
مثال بالا یک کلاس بزرگ (گلیف) با دو زیرکلاس‌ها (کاراکتر و خط) دارد. یک روش مجازی با دو پیاده‌سازی وجود دارد. اجرای برنامه با اجرای برنامه اصلی شروع می‌شود. سیمولا نشانی از مفهوم کلاس‌های انتزاعی ندارد زیرا کلاس‌ها با روش‌های مجازی خالص می‌تواند مثالی شود. این به این معنی است که در مثال بالا همه کلاس‌ها می‌توانند مثالی شوند. فراخواندن یک روش مجازی خالص هرچند خطای زمان اجرا تولید می‌کند.

فراخوانی با نام

سیمولا از فراخوانی با نام پشتیبانی می‌کند، بنابراین ابزار جنسن به راحتی می‌تواند پیاده شود. با این حال، حالت انتقال پیش‌فرض برای پارامتر ساده با مقدار فراخوانده می‌شود، بر خلاف زبان الگول که فراخوانی با نام را استفاده می‌کند. برنامه منبع برای ابزار جنسن به همین خاطر باید فراخوانی با نام را برای پارامترها هنگامی که توسط یک گردآور سیمولا گردآوری شده را مشخص کند.
مثال بسیار ساده‌تر دیگر تابع جمع است (Σ) که می‌تواند به شرح زیر پیاده شود:
Real Procedure Sigma (k, m, n, u);
  Name k, u;
  Integer k, m, n; Real u;
Begin
  Real s;
  k:= m;
  While k <= n Do Begin s:= s + u; k:= k + 1; End;
  Sigma:= s;
End;
برنامه بالا فراخوانی با نام را برای کنترل متغیر (k) و بیان (u) استفاده می‌کند. این اجازه می‌دهد تا متغیر کنترل‌کننده در بیان استفاده شود.
توجه داشته باشید که استاندارد سیمولا محدودیت‌های خاصی بر متغیر کنترل‌کننده در حلقه for اجازه می‌دهد. بنابراین برنامه بالا از حلقه while برای حداکثر قابلیت حمل استفاده می‌کند.
به شرح زیر:
که پس از آن می‌تواند به شرح زیر پیاده شود:
Z:= Sigma (i, 1, 100, 1 / (i + a) ** 2);

شبیه‌سازی

سیمولا شامل یک بسته شبیه‌سازی برای انجام شبیه‌سازی رویداد گسسته است. این بسته شبیه‌سازی بر مبنای ویژگی‌های شی گرا سیمولا و مفهوم هم‌روال آن است.
سام، سالی و اندی در حال خرید لباس هستند. آن‌ها باید از یک اتاق پرو اشتراکی استفاده کنند. هر کدام از آن‌ها در حال گشتن در فروشگاه به مدت 12 دقیقه هستند و سپس از اتاق پرو به‌طور انحصاری به مدت سه دقیقه استفاده می‌کنند، هر یک از یک توزیع نرمال پیروی می‌کنند.یک شبیه‌سازی از تجربه اتاق پرو آن‌ها به شرح زیر است:
Simulation Begin
  Class FittingRoom; Begin
     Ref (Head) door;
     Boolean inUse;
     Procedure request; Begin
        If inUse Then Begin
            Wait (door);
            door.First.Out;
        End;
        inUse:= True;
     End;
     Procedure leave; Begin
        inUse:= False;
        Activate door.First;
     End;
     door:- New Head;
  End;
  Procedure report (message); Text message; Begin
     OutFix (Time, 2, 0); OutText (": " & message); OutImage;
  End;
  Process Class Person (pname); Text pname; Begin
     While True Do Begin
        Hold (Normal (12, 4, u));
        report  (pname & " is requesting the fitting room");
        fittingroom1.request;
        report (pname & " has entered the fitting room");
        Hold (Normal (3, 1, u));
        fittingroom1.leave;
        report (pname & " has left the fitting room");
     End;
  End;
  Integer u;
  Ref (FittingRoom) fittingRoom1;
  fittingRoom1:- New FittingRoom;
  Activate New Person ("Sam");
  Activate New Person ("Sally");
  Activate New Person ("Andy");
  Hold (100);
End;
بلوک اصلی با شبیه‌سازی برای قادر کردن شبیه‌سازی پیشوند دار شده‌است . بسته شبیه‌سازی می‌تواند در هر بلوک استفاده می‌شود و شبیه سازی‌ها حتی می‌توانند داخل هم جا داده شوند وقتی که کسی که شبیه‌سازی می‌کند را شبیه‌سازی می‌کند.
شی اتاق پرو یک صف (درب) را برای دسترسی به اتاق پرو استفاده می‌کند. هنگامی که کسی درخواست اتاق پرو می‌کند و آن اشغال است، آن‌ها را باید در این صف منتظر (صبر (درب)) بمانند. وقتی کسی اتاق پرو را ترک می‌کند اولین کس (در صورت وجود) از صف (درفعال. اولین) جدا می‌شود و بر این اساس از صف در (در. اولین. بیرون) برداشته می‌شود.
شخص زیر کلاسی از فرایند است و فعالیت او با استفاده از نگه داشتن (زمان برای دیدن فروشگاه و زمان حضور در اتاق پرو) و و روش‌های فراخوانی در شی اتاق پرو برای درخواست و ترک اتاق پرو شرح داده شده‌است.
برنامه اصلی همه اشیاء را ایجاد وهمه اشیاء فردی را فعال برای قرار دادن آن‌ها در صف رویداد می‌کند. برنامه اصلی برای 100 دقیقه از زمان شبیه‌سازی می‌ماند قبل ازاینکه برنامه پایان یابد.