سیمولا

**سیمولا** یک نام برای دو زبان برنامه‌نویسی سیمولا ۱ و سیمولا ۶۷ است. این زبان ها در ۱۹۶۰ در مرکز محاسبات نروژی در اسلو، توسط اوله-یوهان دال و کریستین نیگارد توسعه یافتند. نحو آن نسبتاً به الگول ۶۰ وفادار است و همان‌طور که از نام آن پیداست، برای انجام شبیه‌سازی طراحی شده‌است.

سیمولا ۶۷ اشیاء، کلاس‌ها، زیر کلاس‌ها، متدهای مجازی، هم‌روال، شبیه‌سازی رویداد گسسته و ویژگی‌های جمع‌آوری زباله را معرفی کرد. سیمولا اولین زبان برنامه‌نویسی شی گرا در نظر گرفته شده‌است و چارچوبی برای بسیاری از ویژگی‌های زبان‌های شی گرای امروزی تهیه کرده‌است. یکی دیگر از دلایل اهمیت آن این است که سیمولا هنوز هم برای انواع مختلف از درس‌های دانشگاه استفاده می‌شود.

این زبان در طیف وسیعی از کاربردها مانند شبیه‌سازی طرح‌های VLSI، مدل‌سازی فرایند، پروتکل‌ها، الگوریتم‌ها و برنامه‌های کاربردی دیگر مانند حروفچینی، گرافیک کامپیوتری، و آموزش و پرورش استفاده شده‌است. از آنجا که منظق شئ گرایی و برخی ویژگی های دیگر در ++C، جاوا و #C بر اساس این زبان اما به طور بازسازی شده طراحی شده اند، نفوذ سیمولا اغلب کم بیان می‌شود. خالق ++C، بی‌یارنه استراس‌تروپ، اذعان کرده‌است که سیمولا ۶۷ بیشترین اثر را برای توسعه ++C داشت و یکی از دلایل آن را نوع بهبودهای بهره‌وری در سرعت خام محاسبات ارائه شده توسط زبان های سطح پایین مثل BCPL در سیمولا بیان کرده است.

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

## تاریخچه
در سال 1957 کریستین نیگارد شروع به نوشتن برنامه‌های شبیه‌سازی کامپیوتر کرد. نیگارد نیاز به یک راه بهتر برای توصیف عدم تجانس و عملکرد یک سیستم را احساس کرد و متوجه شد برای عملی کردن ایده‌های خود بر روی یک زبان رسمی کامپیوتر برای توصیف سیستم، کسی را با مهارت بیشتر در برنامه‌نویسی نیاز دارد. اوله - یوهان دال در ژانویه 1962 به او پیوست. این تصمیم برای ارتباط زبان الگول ۶۰ در مدت کوتاهی پس ازآن گرفته شد. تا قبل از مه ۱۹۶۲ مفاهیم اصلی زبان شبیه‌سازی تعیین شد. "سیمولا ۱" متولد شد، یک زبان برنامه‌نویسی با هدف ویژه برای شبیه‌سازی سیستم‌های رویداد گسسته. کریستن نیگارد برای بازاریابی کامپیوتر جدید یونی‌وک ۱۱۰۷ در اولاخر مه 1962 به یونی‌وک  دعوت شد. در آن دیدار نیگارد ایده‌های سیمولا به رابرت بمر، مدیر برنامه‌نویسی سیستم در یونی‌وک ارائه داد. بمر یک هواخواه سوگند یاد کرده الگول بود و متوجه شد پروژه سیمولا الزام‌آور است. او همچنین رئیس یک جلسه در دومین همایش بین‌المللی پردازش اطلاعات میزبانی شده توسط IFIP بود. او نیگارد را که مقاله "سیمولا: فرمتی از الگول به شرح شبکه‌های رویداد گسسته" را ارائه کرده بود، به این همایش دعوت کرد. مرکز محاسبات نروژی یونی‌وک ۱۱۰۷ را دراوت ۱۹۶۳ با تخفیف قابل توجهی گرفت، که در آن دال سیمولا۱ را تحت قرارداد با یونی‌وک پیاده سازی می‌کرد. پیاده‌سازی بر مبنای یونی‌وک و کامپایلر الگول ۶۰ استوار بود. سیمولا ۱ در یونی‌وک ۱۱۰۷ از ژانویه ۱۹۶۵ به‌طور کامل عملیاتی شد. در سال های بعدی دال و نیگارد زمان زیادی را صرف آموزش سیمولا کردند. سیمولا به چندین کشور در سراسر جهان گسترش یافت و سیمولا ۱ بعداً در کامپیوترهای بوروقس B5500 و کامپیوتر اورال - ۱۶ روسی پیاده شد.

در سال 1966، C.A.R.Hoare مفهوم ساخت کلاس رکورد را معرفی کرد، که دال و نیگارد آن را با مفهوم پیشوندی و ویژگی‌های دیگری برای برآورده کردن نیازهای خود برای مفهوم فرایند تعمیم داده شده گسترش دادند. دال و نیگارد مقاله خود در اعلان‌های کلاس‌ها و زیر کلاس‌ها در کنفرانس کاری IFIP روی زبان‌های شبیه‌سازی در اسلو، در مه ۱۹۶۷ ارائه دادند. این مقاله اولین تعریف رسمی از سیمولا ۶۷ شد. در ژوئن ۱۹۶۷ کنفرانسی برای استاندارد کردن زبان و آغاز تعدادی از پیاده‌سازی‌ها برگزار شد. دال پیشنهادی برای متحد کردن نوع و مفهوم کلاس داد. این به بحثهای جدی منجر شد، و پیشنهاد توسط هیئت مدیره رد شد. سیمولا ۶۷ بود به‌طور رسمی در اولین جلسه از گروه استانداردهای سیمولا (SSG) در ماه فوریه ۱۹۶۸ استاندارد شد.

سیمولا تأثیرگذار در توسعه صحبت کوتاه و بعد زبان‌های برنامه‌نویسی شی گرا بود. آن همچنین کمک به الهام بخشی مدل عملگر از محاسبات هم‌زمان کرد، هر چند سیمولا تنها از همکاری و روال (و نه همزمانی) پشتیبانی می‌کند.

در اواخر دهه شصت و اوایل دهه هفتاد چهار پیاده‌سازی اصلی از سیمولا وجود داشت:
* یونی‌وک ۱۱۰۰ توسط NCC،
* سیستم ۳۶۰ و سیستم ۳۷۰ توسط پژوهشکده سوئدی برای دفاع ملی (FOA)،
* سی دی سی ۳۰۰۰ توسط دانشگاه اسلو در نصب و راه اندازی کامپیوتر مشترک در جلر
* تاپس - ۱۰ توسط ENEA AB

این پیاده‌سازی به طیف گسترده‌ای از زبان‌های برنامه‌نویسی منتقل شدند. تاپس - ۱۰ مفهوم متغیرها و روش‌های عضو عمومی، محافظت شده و خصوصی، که بعداً با سیمولا ۸۷ یکپارچه شد را پیاده کرد. سیمولا ۸۷ آخرین استاندارد است و به طیف گسترده‌ای از زبان‌های برنامه‌نویسی منتقل شده‌است. عمدتاً سه پیاده‌سازی شده وجود دارد:
* سیمولا AS،
* لوند سیمولا،
* GNU Cim - سایت اف تی پی از دانشگاه اسلو

در نوامبر ۲۰۰۱ دال و نیگارد مدال IEEE جان فون نویمان توسط مؤسسه مهندسان برق و الکترونیک را برای "معرفی مفاهیم برنامه‌نویسی شی گرا از طریق طراحی و پیاده‌سازی سیمولا ۶۷" دریافت کردند. آن‌ها در ماه فوریه ۲۰۰۲، جایزه A.M.2001 تورینگ توسط انجمن ماشین‌ها محاسبهٔ (ACM) را برای "ایده‌های اساسی برای ظهور برنامه‌نویسی شیء گرا، از طریق طراحی شان با زبان‌های برنامه‌نویسی سیمولا ۱ و سیمولا ۶۷" دریافت کردند. متأسفانه نه دال و نه نیگارد نتوانستند خود را به سخنرانی جایزه ACM تورینگ که برنامه‌ریزی شده برای ارائه در کنفرانس OOPSLA 2002 در شهر سیاتل شده بود، برسانند، چرا که دال در ژوئن و نیگارد در اوت از دنیا رفتند.

آزمایشگاه تحقیقات سیمولا یک مؤسسه تحقیقاتی است که بخاطر زبان سیمولا نامگذاری شده‌است، و نیگارد یک موقعیت کاری پاره وقت از سال بازگشایی در۲۰۰۱ آنجا داشت.

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

با این حال، برنامه حداقل به صورت مناسب تری به عنوان یک بلوک خالی جلوه داده می‌شود:

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 برای حداکثر قابلیت حمل استفاده می‌کند.

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

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;

بلوک اصلی با شبیه‌سازی برای قادر کردن شبیه‌سازی پیشوند دار شده‌است. بسته شبیه‌سازی می‌تواند در هر بلوک استفاده می‌شود و شبیه‌سازی‌ها حتی می‌توانند داخل هم جا داده شوند وقتی که کسی که شبیه‌سازی می‌کند را شبیه‌سازی می‌کند.
شی اتاق پرو یک صف (درب) را برای دسترسی به اتاق پرو استفاده می‌کند. هنگامی که کسی درخواست اتاق پرو می‌کند و آن اشغال است، آن‌ها را باید در این صف منتظر (صبر (درب)) بمانند. وقتی کسی اتاق پرو را ترک می‌کند اولین کس (در صورت وجود) از صف (درفعال. اولین) جدا می‌شود و بر این اساس از صف در (در. اولین. بیرون) برداشته می‌شود.
شخص زیر کلاسی از فرایند است و فعالیت او با استفاده از نگه داشتن (زمان برای دیدن فروشگاه و زمان حضور در اتاق پرو) و و روش‌های فراخوانی در شی اتاق پرو برای درخواست و ترک اتاق پرو شرح داده شده‌است.
برنامه اصلی همه اشیاء را ایجاد وهمه اشیاء فردی را فعال برای قرار دادن آن‌ها در صف رویداد می‌کند. برنامه اصلی برای ۱۰۰ دقیقه از زمان شبیه‌سازی می‌ماند قبل ازاینکه برنامه پایان یابد.

## همچنین مشاهده کنید
* زبان الگول ۶۰،
* بتا، جانشین مدرن برای سیمولا،
* برنامه‌نویسی شی گرا،
* زبان شبیه‌سازی
* Subtyping، مفهوم نظری مدرن از subtyping که سرچشمه در سیمولا دارد.

## منابع

۱. ^ a b c d e f g h i j k l m n Ole-Johan Dahl, Bjørm Myhrhaug, and Kristen Nygaard (1970),:[1], Common Base Language, Norwegian Computing Center
۲. ^ http://staff.um.edu.mt/jskl1/
۳. ^ Holmevik, Jan Rune (1994). "Compiling Simula: A historical study of technological genesis". IEEE Annals in the History of Computing 16 (4): 25–37. http://www.idi.ntnu.no/grupper/su/publ/simula/holmevik-simula-ieeeannals94.pdf . Retrieved 12 May 2010.
۴. ^ Jan Rune [2], Compiling Simula, Institute for Studies in Research and Higher Education, Oslo, Norway
مآخذ
* IBM System 360/370 Compiler and Historical Documentation The Simula Standard and other historical documentation by Peter Sylvester
* Introduction to OOP in Simula – By J.Sklenar, based on the 1997 seminar "30 Years of Object Oriented Programming (OOP)" at the University of Malta
* How Object-Oriented Programming Started – By Dahl and Nygaard, abbrev. version of an encyclopedia article; on Nygaards home page
* Simula at the Université de Montréal Includes tutorials, documentation, and links in English and in French
* An Introduction to Programming in Simula A textbook by Rob Pooley now available as HTML
* DEMOS: a system for Discrete Event Modelling on SIMULA Demos Reference Manual, Demos was originally written as a package within SIMULA by Professor of Computer Science Graham M. Birtwistle at the University of Calgary, Canada
* [//en.wikipedia.org/w/index.php?title=Simula&oldid=588161416 ویکی‌پدیای انگلیسی]

رده:اختراع‌های نروژی
رده:اشکال‌های برنامه‌نویسی
رده:برنامه‌نویسی
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۶۲ (میلادی)
رده:زبان‌های برنامه‌نویسی ساخته‌شده در دهه ۱۹۶۰ (میلادی)
رده:زبان‌های برنامه‌نویسی شبیه‌سازی
رده:زبان‌های برنامه‌نویسی کلاس محور
رده:زبان‌های برنامه‌نویسی
رده:علم و فناوری در نروژ
رده:موضوعات مربوط به زبان‌های برنامه‌نویسی