سيمولا (لغة برمجة)

**سيمولا**  هو اسم للغتين برمجيتين (سيمولا 1 وسيمولا 67)، تم تطويرهم في عام 1960 م في المركز النرويجي للحوسبة في اوسلو بواسطة أولي يوهان دال وكريستين نيغارد. تركيب نحوي (Syntactically) إنها مجموعة معترف بها بشكل منصف من ALGOL 60.

قدم سيمولا 67 كائنات(objects) ,فئات(3classes) , فئات فرعية(2subclasses) , طرق ظاهرية(virtual methods) , الروتين الثانوي(coroutines) ,محاكاة منفصلة الحدث(discrete event simulation) , جامع القمامة (garbage collection).
يعتبر السيمولا أول لغة برمجة كائنية التوجه. كما يوحي به اسمة. صمم سيمولا لإداء المحاكاة ولتلبية احتياجات الإطارات المقدمة لبيئة العمل لكثير من لغات البرمجة كائنية التوجهالمستخدمة اليوم.
أستخدم سيمولا في مجموعة واسعة من البرامج مثل محاكاة تصميم دارات التكامل الفائقVLSI ,عمليات النمذجة (process modeling) , ميثاق اتصالات (protocols) , خوارزمية (algorithms) , وفي غسرها من البرامج مثل التنضيد (typesetting) , رسومات الحاسب(computer graphics) وفي التعليم (education).
منذ ان اعيد تنفيذ كائتنات سمولا في C++ ,الجافا(Java) , C#. غالباً ماتم الاستهانة بتأثير السيمولا.
اعترف مخترع لغة ++C بينجامين ستروتروب (Bjarne Stroustrup) بأن السيمولا 67 كان له التأثير العظيم لجعلة يخترع C++, لتحقيق نوع من التحسينات في الإنتاجية التي تقدمها سيمولا لتسريع الحاسوبية الخام التي تقدمها لغات المستوى الأدنى مثل لغة البرمجة الأساسية المختلط (BCPL).
لا يزال يستخدم سيمولالأنواع مختلفة من الدورات الدراسية الجامعية،
على سبيل المثال قام جيريك سكلنار(Jarek Sklenar [3])بتعليم السيمولا للطلاب في جامعة مالطا.

## التاريخ
ملحوظة المعلومات القادمة مبنية على المقالات التأريخية لجان رون.

ابتدء كرستن نيقارد بكتابة برامج المحاكاة للحاسب في عام 1957 م. ورأى نيقارد احتياج لطريقة أفضل لوصف
عدم التجانس ومجموعة التعليمات (operation) للنظام (system).
لإكمال فكرتة على لغة برمجة رسمية لوصف النظام، استنتج نيقارد بأنة يحتاج إلى شخص ما يملك مهارات أكثر منه في كتابة البرامج.انضم اولي جوهان دال لعمل نيقارد في كانون الثاني يناير عام 1962 م. واتخذ قرار ربط اللغة لـALGOL 60 بعد فترة وجيزة من انضمام أولى.
وضعت المفاهيم الأساسية للغة المحاكاة في شهر مايو 1962 م. ولدت سيمولا I كلغة برمجة لأغراض خاصة لمحاكات منفصلة لأحداث الأنظمة.
تمت دعوة كرستن نيقار في لقاء لكي ينظم إلى UNIVAC في اخر شهر مايو 1962 م من اجل التسويق للحاسب الجديد UNIVAC 1107.
في ذلك اللقاء استعرض نيقارد فكرتة سيمولا لمدير نظم البرمجة في Univac ريبورت بيمر.
كان بيمر هاوً ومحلفاً عند ALGOLووجد ان مشروع سيمولا قاهر. وكان بيمر أيضاً يترئس موسم في المؤتمر الدولي الثاني حول معالجة المعلومات المستضاف من IFIP. وقد قام بدعوة نيقارد الذي قام بدورة باستعراض فكرتة سيمولا كامتداد لـ ALGOL لوصف فصل الحدث للشبكات.
حصل المركز النرويجي للحوسبة على UNIVAC 1107 لانة على خصم كبير علية في أغسطس 1963 م.
حيثنفذداهلسيمولا IبموجبالعقدمعUNIVAC. واستند التنفيذ على مترجم UNIVAC ALGOL 60
وشغل سيمولا I بكامل طاقته على حاسب UNIVAC 1107 في كانون الثاني يناير 1965. وخلال السنتين التالية قام داهل ونيقارد بصرف الكثير من الوقت لتعليم السيمولا I. وانتشر السيمولا I في دولتين حول العالم وشغل سيمولا I في وقت لاحق على حاسب Burroughs B5500 computers والروسي URAL-16 computer.
في عام 1966 م قدم C. A. R. Hoareالمبدء في مفهوم سجل بناء الفئة والذي أمد دال ونيجاردلفهم مفهوم التقديم وغيرها من الميزات لتلبية احتياجاتهم لمفهوم عملية معممة.
استعرضدالونيجاردفي شهر مايو 1967 م ورقتهم البحثية في مقرعمل مؤتمراتIFIPعنالفئة والفئة الفرعية الاعلانية على لغات المحاكاة في أوسلو.وكانت هذه الورقة أول ورقة تعريفية رسمية للسيمولا 67.
وفي شهر يونيو 1967 م عقد مؤتمر لتوحيد اللغة والشروع في عدد من التطبيقات. واقترح دال توحيد نوع ومفهوم الطبقة، وأدى ذلك إلى الكثير من النقاشات الجادة. ورفض الاقتراح من قبل المجلس.
وفي شهر فبراير 1968 م أصبح سيمولا 67 موحد المعاييررسميافي الاجتماع الأول لمجموعة سيمولا.
أصبح سيمولا مؤثراً لدى مطورين Smalltalk ولاحقاً object-oriented programming languages.
وأيضاً ساعد في الهام Actor model لتزامن الحسابات، وأيضاً سيمولا كان الوحيد الذي يدعم co-routines وأيضاً التزامن الغير صحيح concurrency , في اواخر الستينيات وبداية السبعينيات كان هنالك اربع تطبيقات لدى سيمولا وهي :
* UNIVAC 1100 by NCC
* System/360 and System/370 by Swedish Research Institute for National Defence (FOA)
* CDC 3000 by University of Oslo's Joint Computer Installation at Kjeller
* TOPS-10 by ENEA AB
هذه التطبيقات نفذت لممجموعة واسعة من المنصات. الـ TOPS-10 لتنفيذ مفهوم العامة، المحمية، الطرق ومتغيرات العضو الخاص. وفي وقت لاحق تم دمجها لسيمولا 87.
سيمولا 87 هو اخر المعايير وتم تنفيذة لمجموعة واسعة من المنصات، وبشكل أساسي هنالك ثلاث تطبيقات له وهي :
* Simula AS
* Lund Simula
* GNU Cim - Download from the University of Oslo ftp site

في نوفمبر 2001 استلمداهلونيقارد جائزة لـ IEEE John von Neumann Medal لتقديمهم مفهومInstitute of Electrical and Electronic Engineers للمفاهيم الأساسية الكامنة لـobject-oriented programming من خلال تصميم وتطبيقات سيمولا 67.
وفي شهر فبراير 2002 تسلموا جائزة 2001 وهي جائزة تورينغ Turing Award عن طريق جمعية الحاسبات والمكنات Association for Computing Machinery مع التنوية. للأفكار الأساسية في ظهور البرمجة الموجهة من خلال تصميمهم للغة البرمجة سيمولاوسيمولا 67. وللأسف كلاً من داهلونيقارد لم يتمكنوا من الوصول لمحاضرة جائزة تورينغ ACM Turing Award Lecture. ولقد تم الجدولة لتسليمهم الجائزة عن طريق مؤتمر OOPSLA في سياتل عام 2002 لأنهم توفوا بفارق شهرين عن بعضهم البعض في يونيو وأغسطس على التوالي.
مركز ابحاث سيمولا Simula Research Laboratory هو معهد ابحاث سمي بعد لغة سيمولا. وقد قام نيقارد بعقد دوام جزئي هناك منذ افتتاحة عام 2001.

## نموذج التعليمات البرمجية
### برنامج الحد الأدنى

أن ملف الحاسب الفارغ computer file يكون برنامج الحد الأدنى في سيمولا. مقاس عن طريق الحجم للكود مصدريsource code انه يتألف من شيء واحد فقط وهو بيان (statement) الدمية.
وعلى كل حال برنامج الحد الأدنى بشكل مريح يمثل بكتلة فارغة:

 **Begin**
 **End**;

يبدأ تنفيذ وينهي فورا، اللغة لايكون لها أي عائد (return value) من البرنامج نفسة.

### كلمة مرحباً الكلاسيكية
ملحوظة ان سيمولا حساس لحالة الأحرفcase-insensitive. مثال لبرنامج مرحباً
ياعالم (Hello world program) في سيمولا:

 **Begin**
 **OutText** ("Hello World!");
 **Outimage**;
 **End**;

### الطبقات، والفئات الفرعية وطرق الظاهرية
مثال أكثر واقعية للفئات[1]:1.3.3, 2, والفئات الفرعية [1]:2.2.1 والطرق الظاهرية [1]:2.2.3:

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

المثال أعلاه يملك واحداً من الفئة العظمىsuper class (الشكل المنقوش) مع اثنين من الفئات الفرعية (subclasses) (شار والخط). وهناك طريق ظاهرية واحدة مع اثنين من التطبيقات implementations. التنفيذ يبدأ تنفيذ البرنامج الرئيسي. سيمولا ليس لديه مفهوم فئات مجردة الطبقات abstract classesمع أساليب الظاهرية البحتة pure virtual methodsيمكن تمثيلة instantiated. وهذا يعني أنه في المثال أعلاه جميع الطبقات يمكن تمثيلها. وسوف يدعو الطريقة الظاهري الصرفة (pure virtual method) ولكن على اية حال سوف ينتج خطأrun-time error.

### نداء بالاسم
يدعم سيمولاالنداء بالاسم call by name[1]:8.2.3 ولذلك يمكن بسهولة لجهاز جينسن Jensen's Device ان ينفذ.على اية حال، طور الانتقال الافتراضي لأجل المحيط البسيط يكون هو النداء بالقيمة call by value ,وهو عكس ALGOL الذي يستخدم النداء بالاسم (call by name). الكود المصدري لجهاز جينسنز Jensen's Device يوجب نداء بالاسم دعوة المحيط عندما يطلبها مترجم سيمولا.
مثال اخر ابسط بكثير وهو للوظيفة الحسابية(summation function∑) الذي يمكن تطبيقه كما يلي :

 **Real** **Procedure** Sigma (k, m, n, u);
 **Name** k, u;
 **Integer** k, m, n; **Real** u;
 **Begin**
 **Real** s;
 k = m;
 **While** k  Z = \sum_{i=1}^{100}{1 \over (i + a)^2}

يمكن تنفيذه كالتالي :
 Z = Sigma (i, 1, 100, 1 / (i + a) ** 2);

### المحاكاة
يتضمن سيمولا مجموعة من المحاكات لفعل محاكاة منفصلة الحدث (discrete event simulations). هذه المجموعة مبنية على مفهوم ميزات والروتين البرمجة كائنية التوجه (object oriented) التابع لسيمولا.
سام، سالي، واندي يتسوقون لشراء الملابس. يجب عليهم التشارك في غرفة واحدة لقياس الملابس. كل واحد منهم يستعرض المتجر لمدة 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**;

وتعد الكتلة الرئيسية الغير مسبوقة للمحاكاة هي تمكين المحاكاة. ويمكن استخدام.وحزمة المحاكاة يمكن استخدامها في الكتلة والمحاكاة ويمكن أن تتداخل حتى عندما نحاكي شخص يعمل المحاكاة.

العقبة الرئيسية للمحاكاة هي تمكين المحاكاة.وحزمة المحاكاة يمكن استخدامها في الكتلة والمحاكاة ويمكن أن تتداخل حتى عندما نحاكي شخص يعمل المحاكاة.
الكائن هو غرفة قياس يستخدم قائمة الأنتظار(door) للسماح له بالدخول إلى غرفة القياس. عندما يطلب شخص ما غرفة القياس وتكون مشغولة يجب أن ينتظر في قائمة الانتظار هذه (Wait (door)). وعندما يقوم شخص ما بالخروج من غرفة القياس الأول (إذا وجد) يتم تحريرها من قائمة الانتظار (Activate door.first) وإزالتها من قائمة الانتظار وفقا لذلك الباب (door.First.Out).

الشخص هو فئة فرعية من عملية ونشاطها يوصف بهانتظر(الوقت المتسغرق في استعراض المتجر والقت الذي قضي في غرفة قياس الملابس) ويستعد يأساليب الكائن المستخدم لغرفة القياس لطلب وترك غرفة القياس.
البرنامج الرئيسي يخلق كل الكائنات وينشط جميع كائنات الشخص لوضعها في قائمة الانتظارالحدث. البرنامج الرئيسي ينتظر100 دقيقة من الوقت قبل أنهاء برنامج المحاكاة.

## انظر أيضا
* برمجة كائنية التوجه
## المراجع

## المصدر
* IBM System 360/370 Compiler and Historical Documentation The Simula Standard and other historical documentation by Peter Sylvester

## وصلات خارجية
* 
*  - based on the 1997 seminar "30 Years of Object Oriented Programming (OOP)"
*  - includes tutorials, documentation, and links in English and in French
* 
*  - Demos was originally a SIMULA package for discrete event simulation, written by Graham Birtwistle
*  - with some notes on Demos by Graham Birtwistle

تصنيف:اختراعات نرويجية
تصنيف:العلوم والتقانة في النرويج
تصنيف:برمجيات 1962
تصنيف:لغات برمجة
تصنيف:لغات برمجة أنشئت في 1962