الأحد، 25 ديسمبر، 2011

كلماتٌ ليست كالكلمات


    المطور: م. محمد سامي
    متأثرة بـ: python و lisp
    نظام التشغيل :WINDOWS و GNU/linux 
    موقع اللغة:
    http://www.kalimat-lang.com 
    بريد المبرمج:
    samy2004 @ gmail.com 
    مدونة المبرمج:
     http://iamsamy.blogspot.com/ 
    مواصفات أخرى:
    يقول م. محمد سامي عن اللغة:
كلمات لغةٌٌ برمجيةٌ عربيةٌ لتعليم الأطفال البرمجة وقد راعينا فيها سهولة التعلم وقابلية البرامج للقراءة.
اللغة تشمل امكانات جاهزة للرسم وتحريك الصور على الشاشة، وبها أيضا امكانية التعامل مع لوحة المفاتيح والماوس. كما تأتي في بيئة تطوير متكاملة (IDE) ليسهل بها كتابة وتنفيذ البرمجيات.
ربما تكون كلمات لغة للأطفال لكنها ليست لعبة، هذه لغة حقيقية باوصاف مألوفة للمبرمجين المحترفين:
    • Object-oriented programming
    • Dynamic typing
    • Garbage collection
    • عمل ملفات تنفيذية exe (انظر قائمة برنامج-> عمل ملف تنفيذي)
ولعلّها تكون بإذن الله جزءاً من نهضةٍ علميّةٍ في أمتنا.

ميزات لغة كلمات:
بدايةً: تعد لغة كلمات أرقي لغات البرمجة العربية الحالية علي الإطلاق، فهي بحقٍ تُعد لغة برمجةٍ بكل ما تحمل هذه الكلمة من معاني، و لكلمات الميزات التالية:
  1. كاملة الهيكل، يعني أنها لا ينقصها مكونٌ من المكونات الأساسية التي يجب توفرها في أي لغة برمجة تستخدم عملياً، مثل:
    • التعامل مع المتغيرات.
    • معاملات حسابية و منطقية logic and arithmetic operators
    • الجمل الشرطية.
    • الجمل التكرارية.
    • الدوال functions.
    • أوامر إدخال و إخراج للتعامل مع الشاشة console.
    • أوامر للتعامل مع الملفات.
    • المكونات المركبة:
      1. المصفوفات arrays
      2. القواميس dicts
  2. تحتوي علي مكتبةٍ تجريبيةٍ بسيطة، و لها الإمكانيات التالية:
    • التعامل مع الملفات.
    • الإدخال و الإخراج من/علي الشاشة.
    • أوامر رسومية:
      1. أمر ارسم.خط
      2. أمر ارسم.مستطيل
      3. أمر ارسم.دائرة
      4. أمر ارسم.نقطة
    • أوامر التعامل مع الصور (الأطياف حسب تعبير اللغة):
      1. حمل.طيف
      2. ارسم.طيف / في
      3. اخف.طيف
      4. اظهر.طيف
    • أوامر التعامل مع الحوادث المدعومة في اللغة، و هي:
      1. حوادث الماوس
      2. حوادث لوحة المفاتيح
      3. حوادث الأطياف
    • إمكانيات برمجة الواجهات الرسومية.
  3. لها ميزاتٌ متقدمةٌ للغاية عن لغات البرمجة البسيطة، مثل:
    • دعم البرمجة الكائنية oop بشكلٍ جيد، ففيها:
      1. تعريف الفصائل (تكافئ الـclasses).
      2. الوراثة inheritance
    • إمكانية تجميع الأكواد المرغوب في إعادة استعمالها في وحدات.
       
    • قويةٌ في جزئية الأحداث و معالجتها events and events handling
    • تدعم تنفيذ أكثر من عمليةٍ في نفس الوقت (شيئٌ يشبه في تأثيره تعدد خيوط التنفيذ multithreading).
و للمزيد من التفاصيل و الأمثلة يمكنكم زيارة موقع اللغة.


عيوب لغة كلمات:
و لكن علي الرغم من كل تلك الميزات التي لها، إلا أن كلمات لها عيوبٌ تجعلها لا ترضيني علي الإطلاق، و منها:
  1. اللغة من نوع اللغات ذات التنويع المتغير dynamically typed، و هذا النوع لايصلح لكتابة البرامج التي تحتاج إلي سرعاتٍ فائقةٍ في التنفيذ، و كذلك يساعد في الوقوع في أخطاء التكويد المنطقية لأن اللغة لا تقيد المتغير بنوع بياناتٍ معين (يرجي مراجعة هذه النقطة في نقد لغة السوبرنوفا).
  2. اللغة تحتوي علي مكونين في غاية التشابه هما:
    • الإجراء.
    • الدالة.
      و كان يجب ألا تضم اللغة مكونين متشابهين كهذين علي الإطلاق؛ حيث أن هذا لا داعي له منطقياً، بل و يسبب تشابهُّما الشديد إلي البلبلة عند المبتدئين و سنري مثالاً لهذا عند التحدث عن العيب رقم 5، و كان من الأفضل ضم هذين المكونين في مكونٍ واحدٍ أشمل و أقوي من كليهما (و كان يمكن لكلمات أن تحتوي علي الإجراءات فقط، و لكن مع الاهتمام بأن تأخذ الإجراءات كل جوانب القوة التي تُغْني عن كل مثيلاتها).
  3. اللغة تحتوي علي مكوني:
    • المصفوفات arrays
    • القواميس dicts
      و كان بالإمكان ضم هذين المكونين في مكونٍ واحد، و هذا سيسهل علي المبتدئين كثيراً لأنه يضم المكونات المتشابهة التكوين و الوظيفة في مكونٍ واحدٍ أشمل (هذه نقطة نقدٍ فرعية لكنها موجودةٌ بالفعل).
  4. الدوال و الإجراءات في كلمات ضعيفة البنية؛ فهي:
    • تعيد خرجاً واحداً فقط (في حالة الدالة، أما الإجراءات فلا يفترض أن تعيد مخرجاتٍ من الأصل).
    • لا يمكن إعطاء قيمٍٍ ابتدائيةٍ لمدخلات الدالة أو الإجراء، و هو الأمر الذي كان بإمكانه تيسير العمل بها بشدة و خاصةً في المشاريع الكبيرة.
  5. الفصائل في كلمات ثرثارة؛ فلكي تُعَّرِّف محتويات فصيلةٍ ما فيجب عليك كتابة كلامٍ كثير، و هو علي الرغم من كونه أقل مما هو عليه في حالة لغات مثل الـEiffel إلا أنه أكبر من المعتاد في اللغات الأخري (مثل لغة الـpython، و هي اللغة التي تأثرت بها كلمات بشدة).
    مثال1:
    مثال2:
  6. تحتوي كلمات علي أوامر "علامة" و "اذهب إلى"، و اللذين يكافئان "Goto" في اللغات الإنجليزية، و أنا أرفض هذين الأمرين لأنه من الممكن الاستغناء عنهما و استخدام مكوناتٍ أخري لتؤدي عملهما (الحلقات التكرارية و الجمل الشرطية)، و كذلك فهما يسببان الإرتباك في الكود عند استعمالهما بغزارة (يرجي مراجعة ترجمتي لخطاب Goto statement considered harmeful للبروفيسور ديجكسترا، و الذي أرسله للنشر فى مجلة (Communications of the ACM, Vol. 11, No. 3, March 1968, pp. 147-148).
  7. تعبير الحلقات التكرارية ضعيفٌ للغاية، حيث لا يتيح تغيير مقدار الخطوة في العملية إلا بقيمة زيادةٍ مقدارها 1 (و قد نبه م. محمد سامي إلي أنه ينوي تدارك هذه الجزئية في الإصدارات القادمة بإذن الله عز و جل).
  8. المكتبة حتي الآن مبنيةٌ داخل المفسر نفسه، و ليست قائمةً بذاتها و ليست مكتوبةً بلغة كلمات نفسها بل بلغة الـ++C مع مكتبة الـQT.
  9. لا يوجد مترجمٌ قويٌ للغة حتي الآن، و كل ما يوجد هو مفسرٌ يتيح لنا استخدام بعض مكونات مكتبة الـQT، و هذا أمرٌ مرفوضٌ لأننا نحتاج إلي كتابة المكتبة الخاصة باللغة كاملةً بها نفسها ليتسني لنا نقل هذا الجزء من العلم البرمجي إلي العربية. و لكن المشكلة أنه لا يمكن كتابة مكتبة كلمات بها نفسها كما سيلي في العيب العاشر.
  10. لا يمكن كتابة أوامرٍ بلغة التجميع assembly في برنامج كلمات، و هذا يجعلها غير قادرةٍ علي:
    • إنتاج مكتبتها باستخدامها هي نفسها.
    • إنتاج برامجٍ تعمل علي المتحكمات الميكروئية microcontrollers
    • كتابة البرمجيات الأخري التي نحتاج فيها إلي التعامل مع الذاكرة مباشرةً، مثل:
      1. أنظمة التشغيل.
      2. المترجمات compilers.
      3. المفسرات interpreters.
  11. الوحدات في كلمات تتيح لنا إنشاء إجراءاتٍ و دوالٍ حرة (أي لا يلزم أن تكون مكتوبةً في فصيلةٍ ما)، و هو ما يجعلنا نعاني من مساوئ نموذج البرمجة الإجرائية في المشاريع الكبيرة، و هذه الصفة تناقض مبدأ الأمن الذي نريده في لغة البرمجة القوية.
  12. اللغة لم تستقر في تصميمها بعد، و لم توضع لها خطةٌ توضح حجمها النهائي المتوقع حتي الآن، ونحن نري بالفعل أن اللغة يزيد حجمها يوماً بعد يوم.
  13. ليس فيها تعبيرٌ لمعالجة الاستثناءات exception handling.
  14. الوصول إلي مكونات الفصيلة غير مُوَحَّد الشكل، فنحن نصل إلي المتغير الداخلي للكائن عن طريق كتابة اسمه ثم كتابة اسم الكائن بعده، مثال:
    حيث م هو كائن object فيه ثلاث متغيراتٍ هي: اسم، سن، عنوان.
    أما الإجراءات و الدوال فيجب أن يكتب اسم الكائن أولاً، ثم نتبعه بعلامة : ثم اسم الإجراء أو الدالة. مثال:
    حيث ق هو الكائن، و اضف هو الإجراء أو الدالة.
  1. لا تحتوي علي مكونٍ هامٍ للغاية هو التعدادات enumerations 
  2. لا تحتوي علي فكرة الـتفويض delegating (الموجود في لغاتٍ مثل الـ#C).


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

هناك 4 تعليقات:

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

    ردحذف
  2. كالعادة تفرحني تعليقاتك جداً ^_^
    في الحقيقة هذه المقالات تُعد جزءاً من مرجعٍ شاملٍ قاربت علي الانتهاء من كتابته، و أسميته "رسالة البرمجة بإبداع".
    و لكن طرحه للتداول سيكون مع الإعلان عن مشروع البرمجة بإبداع نفسه بإذن الله عز و جل؛ فالكتاب بمثابة المرجعية العلمية و الفكرية للمشروع، لذلك أُطلق عليه "مانافيستو البرمجة بإبداع" أيضاً :)

    ردحذف
  3. قارن كود الـ IDE مع

    http://sourceforge.net/projects/kidbasic/?source=directory

    كذلك الهدف Target

    ردحذف
  4. اممممممم
    للأسف هذا أمرٌ يستغرق وقتاً في المفاضلة بين بيئتي البرمجة IDEs و أنا الآن غير قادرٍ علي اقتطاع مثل هذا الوقت من المشروع الذي أعمل عليه حالياً :'(
    بالنسبة للـtarget فإن كنت تقصد به الهدف من وراء بناء اللغة فأظن أنه متشابهٌ في الحالتين؛ لأن كلا اللغتين تعليميةٌ في المقام الأول (و الأوحد في حالة BASIC-256).
    أما إن كنت تقصد به الـtarget code فكلاهما أيضاً لغةٌ تفسيريةً ليس لها مترجمٌ compiler حقيقي كامل.
    من ناحية الإمكانيات أظن أن (كلمات) تتفوق علي (BASIC-256)؛ فهي تدعم البرمجة الكائنية oop و تعدد العمليات multiprocessing و غيرها من الميزات المتقدمة كما أسلفت الشرح بالأعلي، بينما سيكون اقتصار الـBASIC-256 علي مجال التعليم مانعاً لها من التمدد لتشمل هذه المكونات المتقدمة (بل و الضرورية للمحترفين).

    ردحذف