دليل استخدام كلمات

من كلِمَات

اذهب إلى: تصفح, البحث

محتويات

[أخف]

الثوابت والمتغيرات والعمليات

القيم في كلمات عددية أو نصيًّة أو قيم أعقد (مثل التواريخ والصور وغيرها). التعبيرات هي جزء من البرنامج يمكن حساب قيمة منه. أشهر أنواع التعبيرات ثلاثة: الثوابت والمتغيرات والعمليات.

الثوابت هي تعبيرات تُفهم كما هي مثل الثابت العددي 16 أو الثابت النصيّ "مرحبا بكم". الثوابت النصيّة تكون دائما بين علامتي تنصيص.

المتغيرات هي اسم يدل على قيمة قد خُزّنت فيه من قبل. لابد ان يبدأ اسم المتغير بحرف يليه اختياريا أي عدد من الحروف والأرقام والنقاط، مثل س أو ص أو السن أو عدد.الطلبة كما هو واضح لا يمكن وجود مسافة في اسم المتغير لكن عادة ما تستخدم النقط للفصل بين الكلمات عند الضرورة.

العمليات هي تعبيرات مكونة من أجزاء أصغر يربط بينها مُعامِل مثل المُعامل + أو ×. أمثلة على العمليات العملية الحسابية 5+6×8 أو العملية المنطقية (أ>5) وأيضا (ب<10). كما ترون يمكن تجميع العمليات بين اقواس لتحديد ترتيب الحسابات.

ملاحظات:

  1. العلامة × هي shift+خ في لوحة المفاتيح العربية
  2. العلامة ÷ هي shift+هـ

أمر الطباعة

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

أمثلة:

اطبع "مرحبا يا فتى"
اطبع 1+2×3
اطبع "الإجابة هي "، ...
اطبع 5

أمر القراءة

يقرأ قيمة أو أكثر من المستخدم ويضعها في متغيرات. يقبل اختياريا رسالة نصية ليعرضها قبل قراءة القيم. تُقرأ القيم بصورة نصية إلا في حالة وضع علامة# قبل اسم المتغير، ففي هذه الحالة يقرأ قيمة عددية. يمكن المزج بين قراءة قيم عددية ونصية في نفس الأمر. يجب على المستخدم ضغط مفتاح <enter> بعد ادخال كل قيمة حين يُنفّذ هذا الأمر.

امثلة:

اقرأ م، ن
اقرأ "ادخل اسمك:”، م
اقرأ "ادخل رقما:"، #س
اقرأ "ادخل اسمك وسنك وسن ابيك"، م، #ن، #ب

التخصيص

العبارة التخصيصّية تكون في صورة متغير = قيمة. يمكن أيضا تخصيص قيم لعناصر غير المتغيرات مثل عناصر المصفوفات وغيرها (ستناقش لاحقا). امر التخصيص يحسب أولا القيمة على يسار علامة = ثم يضع نتيجة الحساب في المتغير.

امثلة:

س = 4

يضع القيمة 4 في المتغير س

س = ص+6

يحسب قيمة ص+6 ويضع النتيجة في س

س = س + 1

يحسب قيمة س الحالية، يجمع عليها 1، ثم يجعل حاصل الجمع هو قيمة س الجديدة

أمر "إذا"

هذا الأمر مكون من ثلاثة اجزاء: الشرط، ومجموعة أوامر تُنفَّذ في حالة تحقق الشرط، واختياريا مجموعة أوامر اخرى تنفَذ في حالة عدم تحقق الشرط.

أمثلة:

إذا أ>5:
    اطبع "الرقم كبير"
وإلا:
    اطبع "الرقم صغير"
تم
إذا م = ن:
    اطبع "الرقمان متساويان"
    اطبع "اليس كذلك؟"
وإلا:
    اطبع "الرقمان غير متساويان"
    اطبع "هه"
تم

في حالة أن يكون هناك امر واحد فقط في حالتي التحقق وعدم التحقق، يمكن حذف كلمة تم وجعل أمر إذا كله على سطر واحد:

إذا أ=ب: اطبع "القيمتان متساويتان"
إذا أ>ب: اطبع "أ هو الأكبر" وإلا: اطبع "ليس أ الأكبر"

صيغة الشرط

الشرط يكون تعبيرا منطقيا، أي قيمته "صحيح" أو "خطأ".

العمليات المنطقية في كلمات كالآتي:

العملية المعنى
أ = ب القيمتان متساويتان
أ<>ب القيمتان غير متساويتان
أ>ب
أ>=ب
أ<ب
أ<=ب
عمليات المقارنة المعروفة
أ وأيضا ب تعتبر أن أ و ب هما قيم منطقية. تكون النتيجة "صحيح" إذا كانت قيمة كل من أ و ب هي “صحيح"، وإلا تكون النتيجة "خطأ" إذا كان احدهما أو كلاهما "خطأ".
أ أو ب تعتبر أن أ و ب هما قيم منطقية. تكون نتيجة العملية "صحيح" إذا كان أي من أ أو ب صحيحين، وإلا تكون النتيجة "خطأ" إذا كان كلاهما خطأ.
ليس أ تعتبر أن أ قيمة منطقية. تكون نتيجة العملية "صحيح" إذا كان أ خطأ، والعكس بالعكس.
ليس أ ولا ب تعتبر أن أ و ب هما قيم منطقية. تكون نتيجة العملية "صحيح" بشرط أن يكون كل من أ و ب قيمتهما خطأ. يمكن تنفيذ العملية على اكثر من قيمتين مثل "ليس أ ولا ب ولا ج"، وفي هذه الحالة يجب ان تكون قيمة كل المعطيات "خطأ" لتكون نتيجة العملية "صحيح".
الدمج يمكن دمج هذه العمليات بداخل بعضها (مثلما يحدث في العمليات الحسابية). مثلا: ليس أ>5 ولا أ<1
في هذه الحالية تكون الأولوية للعمليات بهذه الصورة: TBD

أمرا "علامة" و"اذهب إلى"

الأمر علامة يضع علامة مسماة في البرنامج يمكن نقل التنفيذ إليها. الأمر اذهب إلى يجعل تنفيذ البرنامج "يقفز" إلى علامة معينة وينفذ الأوامر التي تلي تلك العلامة. مثلا:

علامة أ
اطبع "مرحبا"
اذهب إلى أ

هذا البرنامج يستمر في طباعة كلمة "مرحبا" بلا توقف حتى إغلاق البرنامج.

اطبع "هشام"
اذهب إلى س
اطبع "مدحت"
علامة س
اطبع "رامي"

هذا البرنامج يطبع "هشام" ثم "رامي" متجاوزا طباعة "مدحت".

أمر لكل / تابع

يأخذ امر لكل ثلاثة أشياء:

  1. متغير يقوم بدور العداد
  2. نطاق للعد (من كذا إلى كذا)
  3. مجموعة من الأوامر لتنفيذها

ويمكن شرح طريقة عمل هذا الأمر بمثال:

لكل أ من 3 إلى 10:
    اطبع أ+5
تابع

العداد هنا هو المتغير أ، و ما سيفعله أمر لكل هو انه سينفذ سطر اطبع أ+5 مرة باعتبار ان قيمة أ تساوي 3، ثم مرة أخرى باعتبار ان قيمة أ تساوي 4، ثم باعتبار انها 5...وهكذا إلى ان ينفذه و “أ” تساوي 10، ثم ينتهي تنفيذ صيغة لكل.

يمكن في أمر لكل أن يكون العد بخطوات أكبر من الواحد، أو أن يكون تنازلياً:

لكل أ من 1 إلى 100 بخطوة 5 :...
لكل أ من 100 نزولا إلى 1: ...
لكل أ من 100 نزولا إلى 1 بخطوة -5 : ...

أمر كرر / تابع

أمر كرر يقوم بتنفيذ الأوامر مادامت الجملة الشرطية متحققة:

أ=1
كرر مادام أ<= 12:
    اطبع أ
    أ = أ + 1
تابع

يقوم البرنامج بطباعه الأرقام من 1 إلي 12.

كرر :
    اطبع "هذا البرنامج مستمر في التنفيذ"
تابع

أمر كرر بدون شرط يؤدي لتكرار لانهائي.

الإجراءات والدوال

يمكن تقسيم البرامج الكبيرة إلى مكونات ليسهل التفكير في البرنامج. من هذه المكونات الإجراءات والدوال. الإجراء برنامج صغير يستدعى ليقوم بمهمة فرعية ثم يعود التنفيذ إلى البرنامج الرئيسي. الدالة مثل الإجراء مع الفرق انها حين انتهاء تنفيذها تعيد قيمة لجزء البرنامج الذي استدعاها، وعلى ذلك تكون الدالة برنامج صغير يحسب قيمة ويعيدها كالدوال الرياضية.

إجراء

صيغة تعريف الإجراء كالآتي:

إجراء <اسم الإجراء> (<العوامل>):
    <اوامر>
نهاية

مثال:

إجراء عرض.المجموع(س,ص):
    اطبع ص+س
نهاية

عرض.المجموع (10، 30)

أول جزء من البرنامج هو تعريف إجراء اسمه عرض.المجموع يأخذ متغيرين س،ص هما عوامله. الجزء الثاني هو استدعاء الإجراء وتقديم قيم للعوامل المطلوبة (قدمت القيمة 10 لـ س و 30 لـ ص). حينها يبدأ تنفيذ الأوامر داخل الإجراء بطباعة مجموع س وص. عند انتهاء جميع الأوامر يعود الإجراء إلى موقع استدعاءه ويتابَع تنفيذ اي أوامر متبقية.

ملاحظات:

  • المتغيرات داخل كل إجراء محلية؛ بمعنى انها لا علاقة لها بأي متغيرات أخرى بنفس الإسم خارج الإجراء. لو كان البرنامج به متغير س وهناك اجراء به متغير بنفس الاسم فإن تخصيص قيمة لأحدهما لا يؤثر في قيمة الآخر. هذه القاعدة تنطبق أيضا على المتغيرات التي تقوم بدور عوامل الإجراء.
  • عند الاحتياج لعمل متغير غير محلي (أي يتعامل معه الإجراءات والبرنامج الرئيسي على أنه نفس المتغير) لابد من الإعلان أن هذا المتغير مشترك بين جميع مكونات البرنامج. هذا الإعلان هو أمر بصيغة اسم متغير يليه كلمة “مشترك”، ويكون هذا الإعلان على سطر خاص به. مثلا:
س مشترك
  • لابد من تعريف قائمة عوامل لكل إجراء. لو لم يحتج الإجراء إلى عوامل فتقدم له قائمة عوامل فارغة في صورة قوسين. عند استدعاء الإجراء لابد من تقديم قائمة بقيم العوامل، أيضا ولو كانت فارغة.
  • هناك مشكلة فنية في محرر كلمات تؤدي إلى تبديل الأرقام حين تفصل بينها علامة الفاصلة بدون مسافات. بمعنى انه لو كتبت الرقم 10 ثم فاصلة ثم 30 فستجد المكتوب هكذا: 10،30. إلى أن تُحلّ هذه المشكلة ننصح بوضع مسافة بعد كل فاصلة عند سرد مجموعة من الأرقام. لتسهيل الأمر فإن محرر كلمات يقوم حاليا بإضافة هذه المسافة آليا.

دالة

يتميز أمر دالة عن أمر إجراء بأنه يجب إعادة قيمة من الدالة للجزء الذي استدعاها. الإعادة تكون باستخدام الأمر ارجع ب: <قيمة>

دالة مجموع(س,ص):
    ارجع ب: س+ص
نهاية

اطبع مجموع(10,5)

يقوم البرنامج بتعريف الدالة مجموع المسئولة عن إرجاع مجموع المتغيرين في الدالة ثم يقوم بطباعتها.

المصفوفات والقواميس

المصفوفات

المصفوفات arrays هي مجموعة من القيم مرصوصة بعضها بجوار بعض، ويمكن الوصول لعنصر منها بمعلومية المصفوفة ورقم العنصر المطلوب (الذي يسمى فهرس/index في تلك الحالة).

يتم إنشاء المصفوفات بواسطة الدالة مصفوفة (التي تأخذ عدداً يدل على هدد العناصر المطلوبة). أو بكتابة مجموعة من العناصر بين علامتي [، ]

م1 = مصفوفة(10)
م2 = [12، 13، 14]
م3 = ["مرحباً"، 100، 200]

أرقام المصفوفات تبدأ دائماً من الواحد، فمثلاً إن كان لدينا مصفوفة من عشر عناصر فإن أول عنصر يأخذ الفهرس 1 وآخرهم يأخذ الفهرس 10.

يمكن الوصول لعناصر المصفوفة (بهدف قراءتهم أو تغييرهم) بالمعامل [].

م[5] = 100
م[6] = 200
اطبع م[12]
م[6] = م[6] + 1

يمكن استخدام المعامل + مع المصفوفات؛ التعبير مصفوفة1 + مصفوفة2 يعود بمصفوفة جديدة تحتوي كل عناصر مصفوفة1 تليها كل عناصر مصفوفة2.

ملاحظة: علامة [ على لوحة المفاتيح العربية تكتب بزرshift + ب، وعلامة ] تكتب بزر shift + ي

للمزيد من المعلومات يمكن الرجوع إلى قسم دوال المصفوفات في مرجع الدوال الجاهزة.

القواميس

القاموس يشبه المصفوفة في أنه يخزن عناصراً، لكن هناك اختلافات بينهما:

  • الفهرس في المصفوفة يكون دائماً قيمة عددية، لكن في المصفوفة هناك أنواع أخرى (وما يكافيء الفهرس في القاموس يسمى "مفتاحاً")
  • فهارس المصفوفات تأخذ دائماً قيمة بين الواحد وعدد عناصر المصفوفة، بينما مفاتيح القواميس يكمن أن تكون أي عدد (حين تكون أعداداً)
  • المصفوفة حجمها ثابت والقاموس حجمه يتغير مع تخزين المزيد من العناصر فيه
  • الوصول للعناصر في المصفوفات بشكل عام أسرع من القواميس.

إنشاء القواميس يشبه إنشاء المصفوفات، يمكن استخدام الدالة قاموس أو وضع المفاتيح والقيم بين علامتي { ، }

ق1 = قاموس()
العواصم = { "اليابان" => "طوكيو"، "سوريا" => "حلب"، "أمريكا" => "نيو يورك" }

ومثل المصفوفات يتم تخزين وقراءة البيانات باستخدام [ ]

اطبع العواصم["الهند"]
اطبع الدرجات[1000]
العواصم["أمريكا"] = "نيو نيو يورك"

ما هي نوعية القيم التي يمكن استخدامها كمفاتيح للقواميس؟

  • القيم العددية التي تمثل أعداداً صحيحة
  • القيم النصية
  • المصفوفات من قيم يمكن استخدامها كمفاتيح للقواميس.

مثلاً كل هذه القيم مسموح بها: 12، "ابتث"، [12، "أ"]، [[1، 2]، "أ"]. نخطط للسماح بعد ذلك بإضافة المزيد من الأنواع كأنواع مسموح بها، ولإضافة إمكانية السماح للمستخدم بتعريف طرق للتعامل مع الأنواع التي يعرفها بنفسه كأنواع للمفاتيح

ملاحظة: علامة { على لوحة المفاتيح العربية تكتب بزرshift + ر، وعلامة } تكتب بزر shift + ؤ

للمزيد من المعلومات يمكن الرجوع إلى قسم دوال القواميس في مرجع الدوال الجاهزة.

أوامر الرسوم

أمر ارسم.خط

يأخذ أمر ارسم.خط نقطه البداية و النهاية ولون الخط

س1 = 10
ص1 = 50
س2 = 60
ص2 = 100
اللون = 5

ارسم.خط (س1,ص1) - (س2,ص2), اللون

يقوم البرنامج بتحديد قيمه نقطه البداية في المتغير س1، ص1 ونقطه النهاية للخط في المتغير س2، ص2 وتحديد لون الخط برقم من صفر إلي 15.

يمكن حذف اللون في الأمر ووقتها سيُرسم الخط باللون الأسود.

أمر ارسم.مستطيل

يقوم برسم مستطيل عن طريق تحديد أعلي نقطه في المستطيل بأقصى اليمين و النقطة السفلى بأقصى اليسار وتحديد اللون وحالة الحشو (أي القيمة المنطقية خطأ لعدم الحشو أو صحيح لحشو المستطيل).

س1 = 10
ص1 = 100
س2 = 100
ص2 = 10
اللون = 5

ارسم.مستطيل (س1,ص1) - (س2,ص2), اللون,1

يقوم البرنامج برسم مستطيل باللون الأزرق محشو.

أمر ارسم.دائرة

يقوم برسم دائرة عن طريق تحديد نقطه مركزها و نصف القطر ثم تحديد قيمه للون و الحشو.

ارسم.دائرة(10، 10)، 100, 5، 1

يقوم البرنامج برسم دائره باللون الأزرق محشوة.

أمر ارسم.نقطة

يقوم برسم نقطه و تحديد لون لها عند الإحداثيات المحددة.

ارسم.نقطة (10، 10)، 5

يقوم البرنامج برسم نقطه عند الإحداثيات 10،10 باللون الازرق.

الأطياف

الأطياف هي صور تتحرك على الشاشة تستخدم عادة في الألعاب وما شابه (تعريب لمصطلح sprite). تتميز الأطياف بثلاث خصائص:

  1. عند رسم طيف في مكان ثم رسمه في مكان آخر فإنه يختفي تلقائيا من المكان الأول، وهذا يسهّل تحريك الأشكال على الشاشة.
  2. الطيف لا يمسح المرسوم وراءه، بل يخفيه مؤقتا ويعود الرسم الأصلي للظهور بعد تحريك الطيف لمكان آخر.
  3. خلفية الطيف تكون شفافة.

توجد في كلمات أربع عناصر تتعامل مع الأطياف:

  1. دالة حمل.طيف
  2. الأمر ارسم.طيف / في
  3. إجراء اخف.طيف
  4. إجراء اظهر.طيف

حمل.طيف

تأخذ هذه الدالة اسم ملف رسمي (مثل .bmp أو .png) وتعود بقيمة تعبّر عن طيف يمثل الرسمة المعطاة.

ط = حمل.طيف(“قطة.png”)

ارسم.طيف / في

يرسم هذا الأمر طيفاً (الذي عادةً ما يكون نتيجة دالة حمل.طيف) على الشاشة في مكان محدد:

ط = حمل.طيف(“قطة.png”)
ارسم.طيف ط في (20، 38)

اخف.طيف

يأخذ هذا الإجراء طيفا ويخفيه من على الشاشة لكن لا يلغيه من الذاكرة. ( طالما أن هذا إجراء وليس امراً فلابد أن يكون الطيف مقدم له بين قوسين).

اظهر.طيف

يأخذ هذا الإجراء طيفا يفترض أنه قد أخفي من قبل ويظهره من جديد.

الحوادث

يمكن ضبط البرنامج بحيث ينفّذ أوامر معينة عند حصول حوادث خاصة مثل ضغط زر في لوحة المفاتيح أو تحريك الماوس. يكون هذا عن طريقة الأمر عند حادثة/ نفذ، وصيغته كالآتي:

عند حادثة <اسم الحادثة> نفذ <اسم إجراء>

بعد تنفيذ هذا الأمر في أية جزء من البرنامج يتم ربط اسم الإجراء بالحادثة؛ وإذا حصلت الحادثة بالفعل (مثلاً ضغط المستخدم زر الماوس) يتوقف تنفيذ الجزء الحالي من البرنامج ويستدعى الإجراء المرتبط بالحادثة ثم يعود التنفيذ الطبيعي للبرنامج.

الإجراءات المرتبطة بالحوادث عادة ما يكون لها معطيات. مثلاً لو سجلت إجراءً معينا للتعامل مع ضغط زر الماوس يجب أن يكون هذا الإجراء جاهزا لتلقى معطيين هما قيم (س، ص) التي تحدد مكان الماوس عند حصول الحادثة.

يُلاحظ أن كاتب البرنامج ليس عليه استدعاء ذلك الإجراء بنفسه بل سيستدعيه نظام كلمات ويقدم له المعطيات تلقائيا عند حصول الحادثة.

هذه اسماء الحوادث المتعامل معها حالياً:

  • حوادث الماوس:
    • ضغط.زر.ماوس
    • رفع.زر.ماوس
    • تحريك.ماوس
  • حوادث لوحة المفاتيح:
    • ضغط.مفتاح
    • رفع.مفتاح
    • ادخال.حرف
  • حوادث الأطياف:
    • تصادم

حوادث الماوس

الإجراء الذي يرتبط بتلك الحوادث يأخذ دائما قيمتي (س، ص)

عند حادثة ضغط.زر.ماوس نفذ ج1

إجراء ج1(س، ص):
    ارسم.نقطة (س، ص)، عشوائي(16)
نهاية

حوادث لوحة المفاتيح

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

يلاحظ أن الحادثتين ضغط.مفتاح ورفع.مفتاح تحصلان مرة واحدة مع كل ضغطة زر، بينما ادخال.حرف يمكن أن تحدث أكثر من مرة لو استمر المستخدم مدة في الضغط قبل أن يرفع يده على الحرف. هذا هو تسلسل حوادث لغة المفاتيح عند ضغط المستخدم مفتاحاً:

  1. حادثة ضغط.مفتاح
  2. حادثة ادخال.حرف
  3. المزيد من حوادث ادخال.حرف لو استمر المستخدم في الضغط
  4. حادثة رفع.مفتاح

حوادث الأطياف

للأطياف حاليا حادثة واحدة هي تصادم، وتحصل لو تلامس طيفين على الشاشة (يكفي للتلامس حاليا أن يتداخل المستطيلات المحيطان بكل طيف، لكننا ننوي تطوير الإمكانية للتعامل مع شروط أدق للتلامس).

يأخذ الإجراء معطيين يعبران عن الطيفين الذين تلامسا، بدون ترتيب معين.

الوحدات

يمكن تقسيم البرنامج إلى وحدات كل وحدة في ملف منفصل.

من أجل تعريف الوحدات لابد أن يبدأ الكود بكلمة وحدة يليها اسم، ويجب ألّا تحتوي الوحدة سوى تعريفات (مثل تعريف إجراء، دالة، فصيلة، متغير مشترك...) ولا يوجد بها أوامر.

يمكن لبرنامج أن يستخدم وحدة بأن يكون في أوله أمر باستخدام <اسم ملف الوحدة>. لاحظ أن الأمر يأخذ اسم الملف وليس اسم الوحدة!

يمكن أيضاً لبرنامج أن يستخدم أكثر من وحدة، ويمكن للوحدات أن تستخدم وحدات، ويمكن لوحدتين أن تستخدم كل منهما الأخرى بلا مشاكل.

مثال: ضع هذا الجزء في ملف اسمه 'جمع':

وحدة جمع.أرقام
دالة مجموع(أ، ب):
    ارجع ب: أ+ب
نهاية

وهذا الجزء في ملف اسمه 'البرنامج الرئيسي':

باستخدام "جمع"

اطبع مجموع(10، 20)

الأشياء

يمكن في كلمات تعريف فصائل، ثم من هذه الفصائل يمكن إنشاء أشياء تأخذ خصائصها وسلوكها من الفصيلة التي قد عُرّفَت منها. الفصائل والأشياء تفيد في تنظيم البرامج الكبيرة وفي صنع نموذج برمجي للأشياء الحقيقية التي يتعامل معها البرنامج (مثلاُ عملاء، معدات hardware، رسائل بريد الكتروني...)

كل فصيلة تصف للأشياء المنبثقة منها الخصائص والسلوك. الخصائص هي بيانات مخزنة في الشيء والسلوك عبارة عن مجموعة من الرسائل يمكن إرسالها للشيء، ويستجيب هو لتلك الرسائل بتنفيذ إجراء أو دالة.

الخصائص

ننظر أولاً للخصائص:

فصيلة شخص:
    له اسم، سن
نهاية

هنا قد عرّفنا فصيلة اسمها شخص، صيغة له كذا، كذا تعرف اسماء الخصائص المتوفرة للأشياء المنبثقة من تلك الفصيلة.

ن = شخص جديد
اسم ن = “سمير"
سن ن = 13

هكذا نكون قد صنعنا كائناً من الفصيلة شخص عن طريق المعامل جديد، وقمنا بتخزين إشارة إلى هذا الكائن في المتغير ن. ثم بعد ذلك قمنا بتخزين قيماً في الخصائص الخاصة بـن مثل خاصية اسم أو سن.

هناك أيضاً طريقة مختصرة لصنع كائن جديد وتجهيزه:

ن = شخص جديد له اسم="سمير"، سن=13 

بعد ذلك يمكننا التعامل مع القيم المخزنة في الكائن:

اطبع اسم $ ن
اطبع سن $ ن
  • العبارة ن = شخص جديد تنشيء شيئا منبثقا من الفصيلة شخص. بشكل عام الصيغة <اسم فصيلة> جديد هي تعبير قيمته شيء منبثق من الفصيلة المسماة.
  • العبارة اسم ن = "سمير" تؤدي لكتابة القيمة "سمير" في الخاصية اسم الخاصة بالكائن الذي يشير إليه المتغير ن. بشكل عام صيغة <اسم خاصية> <كائن> معناها الوصول للخاصية المذكور اسمها الخاصة بذلك الكائن.
  • التعبير اسم $ ن له نفس نتيجة التعبير اسم ن .يمكن اختياريا الفصل بين اسم الخاصية والكائن بعلامة $، لكن يفضّل استخدام الصيغة السابقة لقربها من اللغة العربية الطبيعية. صيغة <خاصية> $ <شيء> موجودة لحالات خاصة لا يمكن فيها استخدام الطريقة الأولى.

الرسائل

يمكن في البرنامج ارسال رسائل معينة للشيء مثل أن نأمره أن يطبع نفسه على الشاشة أو أن يحسب قيمة معينة ويعطيها لنا.

حين يتعامل الشيء مع الرسالة باستدعاء إجراء تكون هذه استجابة للرسالة. بينما حين يتعامل مع الرسالة باستدعاء دالة ترجع قيمة للمرسل الرسالة يكون هذا رد على الرسالة.

ارسال الرسائل

تخيل أن لدينا متغيرا يدل بالفعل على شيء قد جهزناه، كيف نرسل له رسالة؟ نفعل ذلك بالصيغة التالية:

<الشيء> : <اسم الرسالة> (<المعطيات>)

هنا الشيء الذي نرسل له يسمى متلقي الرسالة.

مثلاً لو كانت الرسالة ذات استجابة:

-- نعتبر أن هذه السطر القادم سيأتي لنا بكائن من فصيلة 'شكل'
ش = اصنع.شكلاً()
الشكل : ارسم.في(12، 14)

ولو كانت الرسالة ذات رد:

ش = اصنع.دائرة.بقطر(100)
اطبع ش : مساحته()

تعريف الاستجابات والردود

لكي تعرف استجابة أو رد لابد من خطوتين:

  • الإعلان عن الاستجابة أو الرد في الفصيلة الخاصة بالشيء
  • تعريف وسيلة الاستجابة أو الرد.

وفيما يلي مثال لتعريف استجابة لرسالة:

فصيلة طالب:
    له اسم، سنة
    يستجيب ل: اطبع.بياناتك()
نهاية

استجابة طالب ط ل: اطبع.بياناتك():
    اطبع "الاسم="، اسم ط
    اطبع "السنة الدراسية="، سنة ط
نهاية

نلاحظ هنا أننا في تعريف الاستجابة استخدمنا اسما مصطنعا ط يدل على المتلقي وله صفتان:

  • يمكن أن يأخذ أي اسم ولا يشترط تسميته ط مثلاً.
  • عند ارسال الرسالة سيحمل ذلك المتغير قيمة تشير إلى الشيء الذي أرسلنا له الرسالة.

الإجراءات المتوازية

تنفيذ الإجراءات على التوازي

يمكن استخدام الأمر شغل لتشغيل إجراء أو أكثر على التوازي مع البرنامج الرئيسي، ويأخذ الأمر الصورة التالية:

شغل <استدعاء إجراء>

مثلاً:

شغل حرك.السيارة()
شغل اطبع.السجلات(س)

في تلك الحالة فإن تنفيذ البرنامج يستمر فوراً للأمر الذي يلي شغل ولكن تقوم كلمات بتنفيذ البرنامج الأصلي والإجراء الجديد جنباً إلى جنب.

الإجراءات المتوازية تفيذ في أشياء كثيرة:

  • برنامج رسوم متحركة يحتوي إجراءات متوازية؛ كل إجراء يحرك شخصية على الشاشة
  • تنظيم واجهة الاستخدام الرسومية بحيث يقوم كل إجراء بحمل مسؤولية جزء من التفاعل من المستخدم
  • (لاحقاً) تسريع البرنامج بتقسيمه إلى مكونات تعمل على أكثر من processor أو أكثر من processor core. سوف يمكن الاستفادة من هذه الإمكانية عند تغيير الآلة الافتراضية الخاصة بكلمات لتكون multithreaded.

القنوات ونموذج CSP

كيف يمكن التنسيق بين الإجراءت المتوازية؟ في الطريقة التقليدية يتم استخدام عمليات التزامن المعروفة مثل mutex, semaphore...الخ؛ لكن هناك طرق أعلى مستوىً يتم البحث فيها مثل نموذج المؤدي (Actor model) المستخدم في لغة Erlang أو نموذج Communicating Sequential Processes المستخدم في لغة Google Go.

مثل لغة Go، كلمات تستخدم نموذج CSP. وهو يعتمد في أساسه على كيانٍ يسمى القنوات

  • القناة هي قيمة في البرنامج يتم إنشاؤها باستخدام الدالة قناة()
  • توجد عمليتان أساسيتان للقناة: الإرسال والاستقبال. يمكن لكل إجراء متواز أن يرسل قيمة إلى قناة أو يتسلم منها قيمة.
  • الإرسال والاستقبال دائماً متزامن، بمعنى أن الإجراء المرسل لقناة يظل منتظراً حتى يأتي إجراء آخر ويتسلم القيمة من تلك القناة، ولا تتم عملية الإرسال إلا بهذا (القناة لا "تدخر" القيمة نيابةً عن الإجراء المرسل)، ونفس الشيء في الاستقبال: الإجراء الذي يتلقى من قناة معينة يظل منتظراً حتى يأتي إجراء آخر ويرسل قيمة لتلك القناة.

...وبذلك تكون القنوات قد جمعت بين تزامن العمليات synchronization وبين تبادل القيم بين الإجراءات المتوازية. مثال:

ق مشترك
ق = قناة()
شغل احسب.القيم()
لكل أ من 1 إلى 3:
    تسلم النتيجة من ق
    اطبع النتيجة
تابع

إجراء احسب.القيم():
    أ = احسب.قيمة1()
    ارسل أ إلى ق
    أ = احسب.قيمة2()
    ارسل أ إلى ق
    أ = احسب.قيمة3()
    ارسل أ إلى ق
نهاية

في هذا المثال هناك إجراءان يعملان على التوازي: البرنامج الرئيسي، والإجراء احسب.القيم().

  • في البداية يقوم البرنامج الرئيسي بتجهيز القناة ق وتشغيل الإجراء احسب.القيم
  • بعد ذلك سوف يظل البرنامج الرئيسي منتظراً حتى تأتيه قيمة من القناة، تلك القيمة سوف يحسبها الإجراء احسب.القيم ويرسلها. (لو أردنا الدقة فإن البرنامج الرئيسي قد ينتظر حتى تأتي قيمة للقناة ثم يقرأها؛ أو ربما بدلاً من ذلك الإجراء احسب.القيم قد يحسب القيمة بسرعة، ويحاول إرسالها للقناة، ويكون هو الذي ينتظر حتى يكون الإجراء الرئيسي جاهزاً لاستلام القيمة. يعتمد ذلك على عواملِ كثيرة.
  • يتكرر هذا النمط ثلاث مرات: الإجراء احسب.القيم يحسب قيمة ويحاول إرسالها، والبرنامج الرئيسي يتلقى القيمة ويعرضها، وفي كل مرة أحدهم ينتظر الآخر حتى يجهز.

أوامر الاتصال بالقنوات

قد رأينا الأمران ارسل وتسلم

ارسل <قيمة> إلى <قناة>
تسلم <متغير> من <قناة>

ملاحظات:

حين نقول أن أمر تسلم بأخذ متغيراً فإننا نقصد أي قيمة يمكن أن تأتي قبل علامة = في أمر التخصيص. مثلاً نستطيع أن نقول تسلم س أو نقول تسلم م[أ] أو نقول تسلم اسم ش

أحياناً لا نريد إرسال بيانات إلى إجراء موازٍ لكننا فقط نريد إخطاره بشيء (أي أن نجعل الإجراء ينتظر حتى تأتيه قيمة من قناة، ثم نرسل أي شيء لتلك القناة لينتهي انتظار الإجراء). في تلك الحالة يمكننا في الإجراء المرسل أن نقول:

ارسل إشارة إلى ق

وفي الإجراء المتسلم يمكن أن نقول

تسلم إشارة من ق

الأمر تخير

دعنا نرى المثال الآتي:

ق1 = قناة()
ق2 = قناة()
شغل اقرأ.من.الملفات(ق1)
شغل اقرأ.من.الشبكة(ق2)

هذا المثال يفترض وجود إجراء اسمه اقرأ.من.الملفات يقرأ بياناتٍ بانتظام ويرسلها إلى القناة ق1، ومثله الإجراء اقرأ.من.الشبكة. الأن نحن نريد، في البرنامج الرئيسي، أن نتعامل مع البيانات المقروءة. هل تنفع الكود الآتية؟

كرر:
   تسلم أ من ق1
   اطبع أ
   تسلم ب من ق2
   اطبع ب
تابع

المثال لا ينفع، لأنه يفترض أن البيانات ستأتي دائماً بالترتيب، ق1 ثم ق2 ثم ق1 وهكذا. نحن لا نريد ذلك؛ إنما نريد أن نقول للبرنامج "انظر أي قناة هي الجاهزة الآن، وتسلم منها". يمكن صنع هذا بالأمر تخير:

كرر:
    تخير:
    تسلم أ من ق1:
        اطبع أ
    أو تسلم ب من ق2:
        اطبع ب
    تم
تابع

أمر تخير يشبه نوعاً ما الأمر إذا/وإلا لأنه يحتوي مجموعة من البدائل، ومجموعات من الأوامر المرتبطة بكل بديل. سوف ينتظر الأمر تخير حتى تكون إحدى القنوات جاهزة، ثم يختار تلك القناة ليستقبل منها (أو يرسل إليها)، ثم ينفذ الأوامر المرتبطة بتلك القناة. ملاحظات على أمر تخير

  • يمكن أن يحتوي الأمر على مزيج من عمليات الإرسال والاستقبال
  • يمكن أن يحتوي على نفس القناة أكثر من مرة، بشرط أن تكون إحدى المرات إرسال والأخرى استقبال
  • في حالة كون أكثر من قناة جاهزة في نفس الوقت، فإن الأمر يختار واحدة من بينها عشوائياً.