فــُـصّـِــلـــَــــت

سياسة الصّم: السّر وراء إتمام نظام نجم

إن إنجاز نظامٍ مثل نجم عمل لا يخلو من الصعوبة والتعقيد، لكن ما يزيده تعقيدًا وتَلويكًا، أمر مهم تمكنّا نحن بعون الله من التغلب عليه للوصول إلى مبتغانا، وقد فكرتُ في الكتابة عنه في مدوّنتي لعلّه يكون وسيلة تحفيز لكلّ ذي أمل بأن يواصل سعيه، وهو كما يلي:

كانت هناك مجموعة ضفادع تَنِقّ بسرور بين الأشجار، تسعى إلى بعضٍ من أعمالها الضفدعيّة، حتى سقط ضفدعان منها في بئر عميقة. تجمعت باقي الضفادع حول البئر ليروا ما يمكنهم فعله لمساعدة صَديقَيْهِم. لكن عندما رأوا مدى عمق البئر، اتفقوا على أنه لا جدوى من المحاولة وأخبروا الضفدعان في البئر بالاستعداد لمواجهة قدرهما، فالموت عاد أقرب ما يكون إليهما.

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

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

بقي الضفدع الآخر يحاول ويحاول، وقد ضعُف جسده ونال منه التعب، وواصل أصدقاؤه نُصحَه بأن يرحم نفسه ويتركها تموت، وقالوا له أنه يعذب نفسه وهي ميتة لا محالة، فلِمَا لا يترُكها تموت دون هذا العذاب! واصل الضفدع المسكين القفز أقوى فأقوى، ثم أقوى فأقوى، ثم بعجيبة من العجائب، نَطَّ صاحبنا نَطَّة عالية أوصلته إلى فَوهَة البئر فتمسك بها وخرج.

فرح الضفادع بنجاح صديقهم فتجمعوا حوله وسألوه: "لما واصلتَ المحاولة على الرغم من أننا أكَّدنا لك استحالة الأمر؟"

شرح لهم ضفدعنا المذهول بأنه يعاني من بعض النقص في السمع، فلا يكاد يفرّز الأصوات البعيدة والمختلطة، وحينما كان يبصر صياحهم وحركاتهم في الأعلى، ظنّ أنهم كانوا يشجعونه على المواصلة، وبأنه بفضل تشجيعاتهم تمكّن من التغلب على نَوازِعِ نفسه وعدم الاستسلام حتى نجح في القيام بالمستحيل والخروج من البئر.

إنّ للِّسان القدرة على الإماتة والإحياء، وإن الإصغاء لِمَا قد يقوله الآخرون من عدم جدوى إنجاز الأمور أو مواصلتها، أو من استحالة إتمامها وتنفيذها، قد يهدّم حياة شخص بأكملها، والقصّة أعلاه تعكس بوضوح خطورة الأمر.

لطالما سمعنا وقرأنا الكلمات المُحبِطة المُثبِطة، خصوصا فيما يتعلق باستعمالنا للغة العربية وإيماننا بها، وفيما يتعلق بإنشاء لغة برمجة ذات مفردات عربية تنافس هذا الكمّ العظيم من اللغات العالمية، لكننا لعبنا دور الأصم حيالها، ونهجنا سياسة الصمّ، وأكملنا طريقنا حتى رأينا نظام نجم يتململ أمامنا، ثم يحبو ثم يتمشى خطواته الأولى ثم ما يلبت أن يركد  أسرع فأسرع متجاوزا باقي المنافسين، وحائزا على اعتراف وإيمان الكافرين به، ومبدّلا لظنون الظانّين به ظنّ السَّوْء.
أكمل القراءة

تعريف لغة البرمجة نجم

ما نجم؟


نجم، لغة برمجة كائنية، عالية المستوى، متعددة الأغراض، مهنية، إحترافية ومفتوحة المصدر، وهي مثالية لإنجاز المشاريع البرمجيّة المعقّدة والكبيرة، وفعّالة للتعبير عن الخوارزمات الجبرية والدوال الرياضية. وإسم "نجم" هو اختصار لعبارة "نظام جبري معلوماتي"، وهي منظومة متكاملة لها مترجمُها الخاص ومكتبتها القيّاسية التي تدعم الخدمات الأساسية كالرّسوميات والشبكيّات والواجهات التفاعلية، إضافة إلى معالجة النصوص والمصفوفات والدّخل والخرْج.. كما أنه بفضل تركيبيتها المرنة، يمكنها التعامل مع المكتبات الخارجية المكتوبة بلغات غير نجم. وزيادة على هذا، تتمتع لغة نجم بنحوٍ واضح وبسيط يضمن مقروئية ومكتوبية عالِيتَيْن. ونجم هو لغة برمجة كائنية بكل ما تحمل الكلمة من معنى، إذ تجد فيها الفصائل والكائنات والوراثة والكبسلة وتحميل الدوال وغيرها من المفاهيم.. لكَ أن تزور صفحة البدء السريع لتُنشئ أول برامجك بنجم، وصفحة الحصول على نجم لتنزيل واكتشاف النسخة الأخيرة لمترجم نجم، ولا تنس التعقيب برأيك وتجربتك مع نظام نجم، فهذا أمر يهمنا.

ما ليس نجم؟


نجم ليس مشروعًا برمجيًا هاوٍ، وليس لعبة أطفال، وهو ليس واجهةً أو منصّةً للغة برمجة أخرى، بمعنى أنّ مصادر نجم لا تُحَوَّل إلى لغة أخرى وإنّما يتمّ تحليلها لغويًا ثم تحويلها إلى صيغة وسيطة (خاصة بنظام نجم، تُسمّى وسيط)، ثم ترجمتها إلى لغة الآلة القابلة للتنفيذ. ونجم ليس مشروعًا متخلى عنه، ولا مشروعًا بطيء التطوير، وهو ليس لغة برمجة ضعيفة محدودة الإمكانيات، كما أنّه ليس نظامًا مغلقا أمام المطوّرين، وهو ليس برمجيّةً عشوائية التصميم، فقد أوْفَيْنا النُّذُر في إتقان تصميمها وتهذيب أكوادها وتوثيقها، كما أنّه ليس مشروعا ربحيًا، وبرامج نجم ليست محدودة المحمولية، إذا أنه بفضل مترجمها متعدد المخارج، يمكن استهداف مِعماريات متعددة، ونظم تشغيل مختلفة، وبالتالي ضمان الحياة الطويلة للبرمجيات المكتوبة بنجم. ونحن لسنا أشخاصًا صعاب المنال، فنحن نرحّب بكلّ تفاعلاتكم ولَكُم أن تتواصلوا معنا عبر التعليقات.

لماذا نجم؟


لأن نجم لغة برمجة ناضجة، ومجرَّبة، وفي تطوّر مستمر، ولأن لها مترجِمًا ذاتيا متقن التصنيع، نعني بكلمة ذاتي أنّه قام بترجمة نفسه بنفسه، ذلك لأننا لم نعتمد في بنائه على أيّة تقنية موجودة، فهو نظام قام بخلق نفسه من عدم، وذلك باستخدام مهارات برمجية خاصّة. ولأنّه تمّ إقرار فعالية المترجم وخلُوّه من العِلل الحرِجة بعد أن تمّ اختباره بأن قام بترجمة نفسه كاملا، ولأنّنا ندعم نجم ونرحّب بتبليغاتكم عن العلل ونُنَقّحُها في مُدَدٍ وجيزة، ولأنّ نجم يمتلك مكتبةً أساسيةً سريعة التطوّر، ونحن نضيف إليها خدمات بشكل مستمر وكذلك تحت الطلب، إذ يمكنك طلب خدمات معيّنة لكي تتم إضافتها إلى المكتبة، وذلك دون مقابل، لأننا لسنا منظمة ربحية.
أكمل القراءة

نجم: البدء السريع

المستوى: مبتدئ

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

قبل البدء


قبل البدء، عليك أن تعلم أنّ البرامج تنقسم عموما إلى قسمين: برامج نصيّة وبرامج رسومية.

  • البرامج النصّية هي التي لا تتمتع بواجهة رسومية، وتتفاعل مع المستخدم بواسطة الأوامر النصّية عن طريق سطر الأوامر أو ما نسميه بالمُحِثْ، والمحث هو تلك النافذة السوداء المظلمة الموجودة في جميع نظم التشغيل، ومن لا يعرفها!
  • البرامج الرّسومية هي تلك المعهودة التي تتفاعل معنا عبر النوافذ والأزرار وغيرها من تلك المكوّنات المرئية التي نعرفها جميعا ونحبّها.

يدعم نجم كلا النوعين من البرامج، وفي هذه الورقة، سنقوم بإنشاء برنامج نصّي يعرض رسالة "سلام يا عالم" على المحث.

 مُحِث الويندوز


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

  • خ1 (موصى به): تنزيل المحث العربي والذي هو بديل ممتاز لمحث الويندوز، وهو يدعم الحروف العربيّة والأعجمية بكفاءة عالية. إلا أنّه لا يزال في إصداراته الأولى.
  • خ2: استخدام محث الويندوز الافتراضي، لكن في هذه الحالة لا تنس تغيير الترميز الافتراضي (الذي يدعم الانجليزية فقط) إلى الترميز العالمي الموحد نُترم8 أو نترم16.

برنامجك الأوّل


قد أثقلنا عليك بهذه المقدّمات، نعلم أنك تريد وضع يدك على نجم في أسرع وقت، هلُمّ بنا إذا نكتب أول برنامج بنجم، وهو برنامج يعرض رسالة "سلام يا عالم" على المحث.

لا يملك نجم حاليا بيئة تطوير خاصة به، بمعنى أنه من مسؤوليتك أنت إنشاء ملفات المشروع وإدارتها. قم باتباع الخطوات البسيطة التالية:

  • أنشئ مجلّدا للمشروع وسمّه "برنامجي".
  • افتح المجلد مكتبة_نجم_أساسية_ن.. الذي قمتَ بتنزيله، وانسخ محتواه داخل المجلد "برنامجي" الذي أنشأته.
  • أنشئ ملفّا نصّيًا جديدا داخل "برنامجي" وسمّه "برنامجي.نجم". افتحه عن طريق النوتباد أو غيرها.
  • إحرص على تبديل ترميز الملف إلى "نترم16 صغير"، وذلك لكي يدعم العربية ويستطيع نجم ترجمته، إذا كنت تستخدم النوتباد، فهو يسمى "UCS-2 Little Endian" أو "UTF-16 Little endian".

انتهينا الآن من إعداد الملفات، قم بإدخال الأكواد التالية في برنامجي.نجم.

ضم "مكتبات.نجم"
محث.أكتب("سلام يا عالم")
من أجل الترجمة، افتح نافذة المحث، وانتقل إلى المجلد حيث وضعتَ مترجم نجم، واكتب أمر الترجمة التالي:

محث> نجم.exe <مسار_برنامجي>\برنامجي.نجم

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

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

محث> <مسار_برنامجي>\خام\برنامجي.exe

ماذا بعد؟


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

دليل سريع إلى البرمجة بنجم

المستوى: مبتدئ

هذا الموضوع هو مدخل إلى عالم نجم، ومن خلاله سيكتسب القارئ المبتدئ أساسيات البرمجة بلغة نجم، كما قد يعتبره القارئ المتقدم دليلا سريعا يعود إليه لينعش ذاكرته من حين لآخر.

لغة البرمجة نجم


نجم لغة برمجة كائنية، عالية المستوى ومتعددة الأغراض، تستعمل خصوصا للبرمجة الكائنية وتدعم كذلك نمط البرمجة التسلسلية القديم، كما إنها تُستَخدم كلغة عالية المستوى وتدعم كذلك التعليمات والأوامر المنخفضة المستوى.. تمتلك نجم مترجما متعدد المخارج، ويقبل إضافة مخارج جديدة إليه، مما يجعل نجم تستهدف آلات وأنظمة مختلفة، ويمكن تسخيرها للبرمجة المكتبية (برامج الحاسوب)، أو البرمجة الشبكية (مواقع الويب).

البدء مع نجم


إذا لم تكن قد استعملت نجم من قبل، فعليك بالتدوينة التالية: نجم، البدء السريع

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

بعض مصطلحات نجم


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

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


دليل نجم


في ما يلي دليل سريع إلى مختلف تراكيب نجم:

1. التعليقات


التعليقات في نجم هي نصوص وأوصاف تعريفية يكتبها المبرمج دون أن يكون لها تأثير على عمل البرنامج، وهي توضع لشرح مقتطفات وسطور من الأكواد حتى يسهل فهم ما تقوم به، يتجاهل المترجم هذه التعليقات عند الترجمة. وتتم كتابة التعليق بين فاصلتان عليتان.

'أنا تعليق'

2. الفصائل


الفصيلة هي -كما أسلفنا- قالب يحدد هيكل مجموعة كائنات تتشارك نفس الخصائص والوظائف ويتم تعريفها كما يلي:

فصيلة عربة   'تعريف فصيلة جديدة اسمها عربة'
    'هنا محتوى الفصيلة...' 
تم   'يعني نهاية الفصيلة'

3. الإضمام


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

ضم "محرك.نجم"

فصيلة عربة
تم

4. المؤثرات


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

فصيلة عربة
    ظاهر:
        'هنا العناصر الظاهرة'
    خفي:
        'هنا العناصر الخفية'
     ظاهر مشترك:
        'هنا العناصر المشتركة الظاهرة'
    خفي مشترك:
        'هنا العناصر الخفية المشتركة'
تم 'نهاية الفصيلة'

5. الخصائص


الخصائص هي متغيرات تحمل معلومات تخصّ كائنًا من فصيلة معينة، تمتلك العربة في الواقع خصائص متعددة منها الرقم والحجم والسرعة.. ويمكن تحديدها برمجيا عبر متغيرات كما يلي:

فصيلة عربة
    ظاهر:
        عدد رقم   'الخاصية رقم وهي عدد'
        عدد حجم    'الخاصية حجم وهي عدد'
        عدد سرعة     'الخاصية سرعة وهي عدد'
تم
يكون لكل متغير نوع معين، والنوع هو الفصيلة التي يقبلها هذا المتغير، بمعنى أن هذا المتغير لن يقبل كائنات من فصيلة غير التي تمّ تعريفه بها.

لاحظ أنه من الضروري أن تنتمي كل خاصية إلى مؤثر ما، فالخصائص أعلاه ظاهرة، ذلك لأنها كتبت تحت مؤثر الإظهار. لا يمكن كتابة خاصية مباشرة تحت سطر تعريف الفصيلة دون تحديد مؤثر، فهذا يرفضه مترجم نجم ويبلّغ عنه كخطأ.

6. الوظائف


الوظائف هي دوال تقوم بوظيفة معينة، ويمكنها أن ترد قيمة (أو نتيجة) عند الانتهاء كما يمكنها أن لا تفعل، فإذا كانت ترد قيمة وجب تحديد نوع هذه القيمة (فصيلتها) وإن لم تكن ترد فإن مترجم نجم يعتبرها ترد عدَمًا. يمكن للعربة أن تنطلق، إذًا فالإنطلاق وظيفة تقوم بها العربة ويتم تحديدها برمجيا عبر دالة لا ترد شيئا كالتالي:

فصيلة عربة
    ظاهر:
        عدد رقم
        عدد حجم
        عدد سرعة

    انطلق()
        'هنا تعليمات الإنطلاق'
    تم 'نهاية الدالة'

تم 'نهاية الفصيلة'
تخضع الدالة "انطلق" إلى مؤثر الإظهار الذي يوجد قبلها، يمكن للمبرمج أن يعيد كتابة مؤثر الإظهار فوق الدالة إذا أراد ذلك. أما إذا كنا نريد إخفاء الدالة فنحن ندرج المؤثر "خفي" فوقها مباشرة.

7. المعطيات


قد تتطلب بعض الدوال (الوظائف) معطيات معينة تعتمد عليها كمعلومات لإتمام وظيفتها، ففي مثالنا السابق، يمكن للدالة انطلق() أن تتطلب سرعة الانطلاق المرجوة، ويتم تحديد هذا الطلب عند تعريف الدالة:

فصيلة عربة
    ظاهر:
        عدد رقم
        عدد حجم
        عدد سرعة

    ظاهر:   'لا بأس في إعادة كتابة المؤثر ظاهر'
        انطلق(عدد سرعة_انطلاق)   'المعطى سرعة_انطلاق وهو عدد'
            'هنا تعليمات الإنطلاق'
        تم
تم

8. المتغيرات المحلية (أو المَحلّيات)


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

فصيلة عربة
    ظاهر:
        عدد رقم
        عدد حجم
        عدد سرعة

    ظاهر:  'لا بأس في إعادة كتابة المؤثر ظاهر'
        انطلق(عدد سرعة_انطلاق)   'المعطى سرعة_انطلاق وهو عدد'
            عدد سرعة_قصوى = هذا.سرعة
        تم
تم
قمنا بتعريف كائن من نوع عدد سمّيناه سرعة_قصوى، وقد أعطيناه قيمة الخاصية "سرعة" التي تم تحديدها في الفصيلة عربة، لاحظ استخدام المفرد 'هذا'، وهو مفرد يعني الكائن الحالي، أي الوصول إلى المتغير "سرعة" والذي هو خاصية للكائن الحالي، ويمكن أيضا عدم استعمال المفرد 'هذا' وكتابة "سرعة_قصوى = سرعة"، إلا أنه يضمن مقروئية أكبر للأكواد.

9. دوال التكوين


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

فصيلة عربة
    ظاهر:
        عدد خ_رقم    'إعتدتُ إسباق أسماء الخصائص الخفية بالحرف "خ_"، وهي تعني خاصية خفية'
        عدد خ_حجم
        عدد خ_سرعة

    ظاهر:
        'دالة تكوين تنشئ عربة جديدة'
        جديد()
        تم

        'دالة تكوين تنشئ عربة جديدة وتُمهّد رقمها وحجمها'
        جديد(عدد رقم، عدد حجم)
            هذا.خ_رقم = رقم
            خ_حجم = حجم    'يمكن عدم استعمال المفرد هذا'
        تم
تم

10. دوال الأخذ والرد


عند إخفاء خاصية ما، يجب توفير طريقة للوصول إليها من الخارج، يتم هذا عبر دالَّتين الأولى تأخذ قيمتها والثانية ترُدّها، وتسمى دوال الأخذ والرد:

فصيلة عربة
    خفي:
        عدد خ_رقم
  
    ظاهر:
        خذ_رقم(عدد رقم)
            خ_رقم = رقم
        تم


        رد_رقم() يرد عدد
            رد خ_رقم
        تم
تم

10. شرطية لو


شرطية لو هي تركيب في نجم يقوم بتنفيذ تعليمة أو مجموعة تعليمات حسب شرط معين، إذا أن المبرمج يعطي شرطا برمجيا، فإذا تحقق هذا الشرط يتم تنفيذ ما يليه من الأكواد، وإن لم يتحقق فإن التنفيذ يتجاوز هذه التعليمات. يمكن أيضا إضافة شروط متعددة في نفس التركيب كان تقول: لو تحقق الشرط كذا فافعل كذا أما لو تحقق الشرط كذا فافعل كذا أما إذا لم يتحقق اي شرط مما سبق فافعل كذا. ويتم كتابة هذا في لغة نجم كالتالي:

'هذه شرطية لو بسيطة'
لو ب=4
    ع = ع + 1
تم

'هذه شرطية لو تدعم عدم تحقق الشرط'
لو ب=4
    ع = ع + 1
وإلا
    ع = ع - 1
تم

'هذه شرطية لو متعددة'
لو ب = 4
    ع = ع + 1
أما لو ب = 5
    ع = ع + 2
أما لو ب = 6
    ع = ع + 3
وإلا
    ع = ع - 1
تم

11. تكرارية طالما


تكرارية طالما هي تكرارية شرطية تستمر في الدوران طالما يتحقق شرط معين، وتنتهي بعدم تحققه، وهي تنفع في إنجاز عمليات بشكل متكرر طالما بقي الشرط إيجابا.

'تنتهي هذه التكرارية عندما يصير ع=10 أو أكبر'
طالما ع < 10
    ع = ع + 1
تم

12. تكرارية لأجل


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

'تدور هذه التكرارية عشر دورات، في كل دورة يحمل عين عددا من 0 إلى 9'
لأجل عدد ع=0، ع<10، ع++
    ب = ب + 1
تم

13. صيغ التزييد والتنقيص


هناك بعض الاختصارات الكتابية في نجم كالتالي:

ع = ع + 1    'كتابة غير مختصرة'
ع++    'كتابة مختصرة وتسمى صيغة التزييد'

ع = ع - 1    'كتابة غير مختصرة'
ع--    'كتابة مختصرة وتسمى صيغة التنقيص'

14. العمليات المنطقية


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

منطق م1 = صحيح
منطق م2 = خطأ
إضافة إلى القيمتين صحيح وخطأ، يعتبر نجم كل عدد يخالف الصفر على أنه صحيح، وكل عدد يساوي الصفر على أنه خطأ.

ويمكن إجراء عمليات منطقية على العبارات كما يلي:

لو م1 = صحيح و م2 = خطأ
    ب++
تم

لو م1 = صحيح أو م2 = صحيح
    ب++
تم

15. رموز العمليات


هناك أنواع مختلفة من العمليات التي يدعمها نجم، منها العمليات الحسابية والرياضية والمنطقية، نعطي هنا الرموز المستخدمة في نجم:

عمليات منطقية : و، أو
عمليات مقارنة: =، لا=، >، <، >=، <=
عمليات حسابية: +، -، ×، ÷

16. مجموعة الأعداد


يدعم نجم مجموعة الأعداد الصحيحة الموجبة والسالبة.

عدد ع = 5
عدد ع = -5
لاحظ أنه يتم قراءة الأعداد في نجم من اليمين إلى اليسار كما في اللغة العربية، فالعدد 154 يُقرأ أربعة وخمسون ومائة. كما أن العدد -2154 يُقرأ ناقص أربعة وخمسون ومائة وألفان.

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

17. التحويل بين الفصائل


يمكن التحويل بين الفصائل المتوافقة، لنفترض أننا نريد إسناد حرف إلى عدد:

حرف ح = "ن"
عدد ع = {عدد}ح
تم تحويل الحرف إلى عدد حتى نستطيع إسناده إلى المتغير ع الذي لا يقبل غير الأعداد، فلو قمنا بالإسناد دون تحويل فإن مترجم نجم يرفض التعليمة ويبلغ عن خطأ "لا يمكن إسناد حرف إلى عدد"، ينطبق هذا على كل الفصائل في نجم، وعلى المبرمج تحمل مسؤولية التحويلات التي يقوم بها، فإذا قام بتحويل بين فصيلتين غير متوافقتين فقد لا يعمل برنامجه كما يتوقع.

18. الجداول


المصفوفات هي فصائل تحمل سلسلة من المتغيرات، وهي أنواع متعددة منها الجداول، والجداول في نجم -بخلاف باقي لغات البرمجة- ليست جزءا من اللغة وإنما هي فصيلة كباقي الفصائل، وهي جاهزة في مكتبة نجم الأساسية، ويتم استخدامها كما يلي:

جدول<نص> ج = جدول جديد()    'جدول نصوص جديد فارغ'
ج.زد("سلام عليكم")     'إضافة نص إلى الجدول'
ج.زد(ن)    'إضافة المتغير ن الذي يحمل نصًا إلى الجدول'

جدول<نص> ج = ["سلام عليكم"، ن]    'إختصار الكتابة أعلاه'

نص نص1 = ج.صف(1)    'رد النص الموجود في الصف 1 من الجدول'
يتم تحديد الفصيلة التي يدعمها الجدول عند تعريفه، ففي المثال أعلاه، لا يمكن إضافة سوى النصوص (الكائنات من الفصيلة نص) إلى الجدول، أما إذا احتاج المبرمج جدولا يحمل أنواع مختلطة من الكائنات فهو يقوم بتعريف جدول من الكائنات:

جدول<كائن> ج = [{كائن}"سلام عليكم"، {كائن}45، {كائن}ن]

16. الوراثة


يمكن لأي فصيلة أن ترث خصائص ووظائف فصيلة أخرى، فإذا فعلت فإن الفصيلة الوراثة تستطيع الوصول إلى كل خصائص ووظائف الفصيلة الموروثة وحتى المخفية منها، كما يمكنها إضافة حجب بعض هذه الخصائص أو الوظائف بإعادة تعريف أخرى تحمل نفس إسمها.

فصيلة سيارة يرث عربة    'السيارة ترث خصائص العربة'
    ظاهر:
        'هذه الدالة تضبط خاصية سرعة السيارة وتسمى دالة الأخذ'
        خذ_سرعة(عدد سرعة)
            خ_سرعة = سرعة   'لاحظ الوصول إلى خاصية خفية في عربة'
        تم

        'هذه الدالة ترد سرعة السيارة وتسمى دالة الرد'
        رد_سرعة() يرد عدد
            رد خ_سرعة
        تم
تم

ختام


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

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

نجم، الحاجة إلى لغة برمجة

قد يقول قائل ما الحاجة إلى لغة برمجة جديدة؟ وقد يظنّ ظانّ أنّنا ضيّعنا وقتنا وأعدنا اختراع ما سُبِقنا إليه، وقد يُمطرنا بعضهم وابلًا من السِّباب لأننا اخترنا المفردات العربية في تراكيب نجم، وقد يتعجّب آخرون ويرفضون فكرة تصميم برامج يكتبونها من اليمين إلى اليسار، وقد تذهب طائفة إلى القول بأننا لن نقدر أبدا على مجاراة اللغات العالمية الأخرى، هذا إضافة إلى أنواع أخرى من الانتقادات التي، على عكس المتوقع، تستَنهِض هِمَمَنا للعمل أكثر والسير نحو الأمام دون أن يبلُغ منا الكلام أي مَبلغ.

المعلوماتية العربية


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

يجعل هذا الخليط اللغوي والمفرداتي القارئ يتعب دون أن يستوعب شيئا، كما أنّ العربية تلعب فقط دور الرابط أو الوسيط الذي يربط بين الكلمات الأعجمية المستعملة، إذ أن العجمة هي الأساس والجوهر، أما العربية فالحَشْو فقط.

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

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

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

لغة برمجة عربية


عند تفكّري في كل هذه الأمور، أدركت أنّه لا سبيل لتحقيق تقدّم عربي معلوماتي دون لغة برمجة عربية، لأنه بها سيتم وضع أساس مفرداتي عام، وسيتم ضبط توجّهٍ معلوماتي موحد للغة العربية، وسيعتاد الناس على رؤية العربية في البرمجة والحوسبة، وسيعتاد المبرمجون على اشتقاق ألفاظ وأسماء برمجية دون عناء.

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

هل العربية قادرة؟


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

وإجابة على ما يقال، فإنشاء لغة برمجة جديدة هو ليس إعادة اختراعٍ للعجلة، ذلك لأننا لم نخترعها أصلا، كما أنّه من الجيّد إعادة صناعة بعض الأمور حتى نفهم تقنياتها ونكشف عن أسرارها وتكون لنا بذلك انطلاقة جيدة نحو تطويرها واختراع ما لم يسبقنا إليه أحد. ولتمثيل الأمور دعنا نقول أنّ شركة عربية قررت صناعة سيارات عربية من الصفر، هل ستشجعهم على ذلك أم أنك ستعارض بدعوى وجود سيارات عالمية؟ نحن نريد بجد التقدم والتخلص من كلّ المعوقات التي تحول دون ذلك، وعلى كلّ منّا أن يرفع سلاح العلم لمواجهة هذا العدو القبيح الذي سيطر علينا لعقود، ألا وهو أنفسنا.
أكمل القراءة

الفصائل "الفاسقة"

كثيرا ما يتساءل البعض حول الجدوى من تطبيق الكَبْسَلة في نمط البرمجة الكائنية، فيقول لماذا عليَّ أن أنشئ دوالَ أخذٍ وردٍ لكل خاصية عوض أن أجعل الخاصية ظاهرةً بحيث يمكن الوصول إليها مباشرة؟ وجوابا على هذا التساؤل البريء أقدّم هذه التدوينة المجرمة.

مصطلحات التدوينة


  • الكبسلة: هي عملية إخفاء الخصائص لمنع الوصول المباشر إليها.
  • دوال الأخذ والرد: هي الدوال التي يمكن عبرها الوصول إلى الخصائص المخفية.
  • فصيلة: وحدة تحوي خصائص ودوال، يمكن إنشاء كائنات متعددة من نفس الفصيلة.

الفصائل الفاسقة


الفصائل الفاسقة هي التي لا تستخدم الكبسلة، وهي فاسقة لأنها:

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

وعليه فاحرص أيها المبرمج على ستر عورة الفصائل التي تصنع لكي لا نقول عنها "فاسقة".

توضيح


لمن لا يعرف كيف يُطَبِّق الكبسلة في نجم، فإنها كما يلي:

فصيلة إنسان

    ظاهر:
        نص اسم   'هذه خاصية غير مكبسلة'

    خفي:
        نص نسب   'هذه خاصية مكبسلة، ويمكن الوصول إليها من خلال دوال الأخذ والرد أدناه'

    ظاهر:
        خذ_نسب(نص ن)
            نسب = ن
        تم

        رد_نسب() يرد نص
            رد نسب
        تم
تم
أكمل القراءة

إستدعاء مكتبات خارجية من داخل نجم

المستوى: مبتدئ

يصعب على أية لغة برمجةٍ أن تعيش إذا لم تدعم النداءات الخارجية، وإمكانية استعمالها لأكواد مكتوبة بغيرها، ذلك لأنه إن لم تفعل، يجب حينها أن تعاد كتابة كلّ الخدمات والإمكانيات المتاحة حتّى الآن، وتوفير مكتبات لكلّ شيء بهذه اللغة، والأكثر من هذا، وجب الحرص على إعادة كتابة أية تقنية جديدة فور ظهورها، ذلك حتى تدعمها هذه اللغة، وإلا فإنّها تعجز وتشيخ وتصير مُتجاوَزة. وعليه فقد تمّ دعم النداءات الخارجية في لغة نجم وذلك حتى تحافظ لنا على شبابها وحيويتها ومواكبتها للتطورات، فنستمتع بها لوقت أطول.

المكتبات الخارجية


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

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

المكتبات الساكنة ضد المكتبات الحركية


المكتبة الساكنة هي ملفات يتمّ دمجها وقت الترجمة مع البرنامج الذي يستدعيها لتكوّن بذلك ملفا تنفيذيا واحدًا يضم كلّ شيء، فتصير بذلك كما لو أنّه تمّت كتابتها مع البرنامج، أما المكتبات الحركية فهي ملفات يتم تحميلها وقت التنفيذ إلى حيّز مشترك من الذاكرة، فيمكن بذلك الوصول إليها من خلال أيّ برنامج يحتاجها. تُعرَف المكتبات الساكنة في نظام الويندوز بالامتداد (.lib)، وتُعرَف في نظام اللينكس بالامتداد (.a)، فيما تُعرف المكتبات الحركية في نظام الويندوز بالامتداد (.dll)، وتُعرف في نظام اللينكس بالامتداد (.so).

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

فيما يخصّ نجم


يدعم نجم الآن المكتبات الخارجية الساكنة، والمكتوبة بأية لغة برمجة مُترجَمة، مثل سي وسي++ وغيرها، ذلك بخلاف لغات البرمجة المُفسّرة التي تستهدف آلات وهمية، مثل الجافا، لأنها تُنتِج مكتبات تتطلب توفّر آلتها الوهمية لتنفيذها، مما يُصعّب عملية دعمها.

إذا كانت في حوزتك مكتبة ساكنة (ملفات ".a" أو ملفات ".lib") تريد استخدامها من داخل نجم، فعليك بما يلي:
  1. نسخ الملفات داخل مشروعك.
  2. إضمام هذه الملفات داخل ملفك المصدر.
  3. استدعاء الدوال وكأنها جزء من مصدرك.

مثال حي


ولتوضيح الأمور، لنفترض أنّه لديك مكتبة بلغة سي والتي هي مجموعة من الملفات ".a"، وأنت تريد استخدام الملفّين "libio.a" و "libc.a". فإنّك تقوم أوّلا بنسخهما داخل مشروعك مثلا في "مشروعي\مكتبة\سي\"، ثم تقوم بإضمامهما كما يلي:

ربط "مشروعي\مكتبة\سي\libio.a"
ربط "مشروعي\مكتبة\سي\libc.a"
'... أكواد نجم'
لاحظ أنّه لإضمام مصادر مكتوبة بنجم فنحن نستخدم المفرد ضم، لكن لإضمام مكتبات خارجية فنحن نستخدم المفرد ربط.

إذا أردت مثلا إستدعاء الدالة "sum(int x, int y)" فإنّك تكتب ما يلي:

عدد ع1 = 4
عدد ع2 = 5
استدع "sum"، ع1، ع2   'استدعاء الدالة الخارجية: جمع العددين ع1 و ع2'
عدد ناتج = {عدد}.       'يُمثل المفرد . قيمة آخر عملية تمّت في نجم، وفي هذا السياق هي ردّ الدالة الخارجية'
هذا بشرط أن تكون الدالة sum موجودة فعلا في أحد الملفّين اللذين ثم ربطهما. وفي حال أعطيتَ الدالة الخارجية معطيات أقل مما تتطلّب، فإنّ نجم يعطيها قيمة إفتراضية 0، أما إذا أعطيتها أكثر مما تتطلب، فإن نجم يتجاهل المعطيات الزائدة ببساطة.

تَسهُل ملاحظة الفرق بين دوال نجم، والدوال الخارجية، حيث أنّه لمناداة دالة نجم فنحن نستخدم الصيغة الإعتيادية: اسم_دالة(معطى1، معطى2)، أما لاستدعاء دالة خارجية فنحن نستخدم المفرد استدع.

يمكن إذاً للمبرمج كتابة برنامجه باستخدام مكتباته المفضّلة، ومع ذلك تجب الإشارة إلى أنّ نجم يمتلك مكتبة أساسية في تطوّر جد سريع، ونحن نحاول من خلالها توفير قدر الإمكان من الخدمات التي قد يحتاجها المبرمج، ولذلك فإنّ استخدام المكتبات الخارجية هو فقط خيار وليس اضطرار.
أكمل القراءة