الأحد، 17 فبراير 2013

بروتوكولات التكرار في لغة البرمجة كلمات

مصطلح بروتوكولات التكرار هو محاولة مني لتعريب iteration protocols، وهي إمكانية موجودة في لغات برمجة كثيرة مثل Java, #C، بايثون، وغيرها. (كلمة iteration معناها حرفياً تكرار، لكني لست متأكداً من هذا التعريب وأريد أن أراجعه).

هذه الإمكانية هي التي تسمح لك أن تقول مثلاً في سي شارب:
foreach(int x in p) {
  // code  
}

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

وقد أضفت iteration protocol في كلمات (في نسخة قيد التطوير ولم تصدر بعد، لكن أتمنى طرحها قبل نهاية فبراير)، وهنا أتكلم عن هذه الإضافة. أولاً، صار في كلمات حلقة لكل/في:
 م = [1، 2، 3، 4]
لكل أ في م :
    اطبع أ 
تابع

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

ق = {"حار" => "بارد"، "كثير" => "قليل"، "قوي" => "ضعيف"}
لكل أ في ق :
    اطبع "عكس "، مفتاح أ، " هو "، قيمة أ 
تابع 

بالنسبة للبروتوكول نفسه: لو أردت أن تصمم فصيلة بحيث يمكن المرور على عناصر كائناتها بأمر لكل/في، فستحتاج فصيلتك أن يكون فيها رد (أي method تعود بقيمة) اسمه المعدد ، يعود بكائن خاص تستخدمه حلقة لكل. كيف تستخدمه بالضبط؟ لو قلت مثلاً:

لكل أ في ب: 
    -- أوامر
تابع 

فإن الأمر يتم تحويله داخلياً إلى ما يشبه الآتي:
م = ب : المعدد()
كرر مادام م : تقدم()
    أ = م : القيمة.الحالية()
    -- أوامر
 تابع 

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

لكن هناك شيء خاص بكلمات هنا: القنوات تدعم بروتوكولات التكرار.

هذا شيء مهم جداً، لذلك سأكرره: القنوات تدعم بروتوكولات التكرار!

(إن كنت لا تعرف بعد ما هي القنوات، يمكنك أن تطلع على هذا الجزء من توثيق كلمات الخاص بالبرمجة المتوازية)

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

مثال بسيط على هذا، المرور على عناصر شجرة: تخيل أن لدينا فصيلة اسمها شجرة لها ثلاث خصائص: بيان، يمين، يسار. هذه هي الشجرة الثنائية العادية التي يأخذها طلبة علوم الحاسب. الآن نريد أن نفعل هذا:

لكل أ في تعديد.شجرة(ش):
    ....
تابع
سوف نكتب الآن الدالة تعديد.شجرة (كلمة تعديد هي تعريبي لكلمة enumeration):
دالة تعديد.شجرة(ش):
    ق = قناة()
    شغل تعديد(ش، ق)
    ارجع ب: ق 
نهاية

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

إجراء تعديد(ش، ق):
    إذا ش <> لاشيء : 
        تعديد(يسار ش، ق)  
        ارسل بيان ش إلى ق 
        تعديد(يمين ش، ق)
    تم 
نهاية

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

ماذا لو أردت المرور بطريقة مختلفة مثل breadth-first أو ربما postorder؟ غيّر الإجراء الثاني بدون أن تهتم بالبروتوكلات وما إلى ذلك. ماذا لو أردت المرور على عناصر شيء آخر؟ ربما graph؟ استخدم الخوارزميات التي تعرفها، لكن لا تنس إرسال كل عنصر  للقناة :)

توجد إمكانيات مشابهة في لغة سي شارب (أمر yield) وفي لغة بايثون (إمكانية generators) لكني أعتقد أن طريقة كلمات أقوى (المرور على الشجرة مثلاً أعقد في سي شارب/بايثون لأن أمر yield لا يعمل بنفس الطريقة في وجود recursion).

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

الثلاثاء، 29 يناير 2013

ما يمكن أن يكون

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

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

ويبدأ المبرمجون في السخرية من لغة Lisp. لديهم حجتان دائماً: انها مليئة بالأقواس، وأنها ليست ناجحة تجارياً. كذلك لغة Prolog لم أر أحداً يتحدث أبداً عن شيء فيها إلا وتساءل: هل تستخدم تجارياً في أي شيء؟

أما أنا حين رأيت تلك اللغة تغير الكثير من تفكيري عن البرمجة: لقد رأيت طريقة قوية جداً للتفكير في البرنامج. ما الذي يهم إن كانت ناجحة تجارياً أم لا؟ أنا أريد مستقبلاً تكون فيه البرمجة كلها بهذا الشكل!
____________

 ورأيت ذات مرة على أحد المنتديات من يقول أن العرب متأخرون في إنتاج علومهم الخاصة، وقدم مثالاً على ذلك هو أن لغة البرمجة العربية كلمات أضعف حتى من الـVisual Basic. الكلام صحيح: كلمات أضعف من الـVB (التي هي أصلاً لغة قوية جداً، قبل أو بعد الـnet.)، لكنها في نفس الوقت مشروع لم يكتمل. لن أطلب من الناس أن يقيّموا كلمات باعتبار ما يمكن أن يكون؛ بل قيموها كما ترونها، لكن في نفس الوقت سأقول أن كلمات في صورتها الحالية هي [على ما أرجو] فصل في قصة أطول.
____________

ويبدأ بعض من المصريين في مهاجمة كل طموح في بلد أفضل لهم، ويظنون أن هذه هي الواقعية. وما تزال ترى العبارات المتكررة: "انت في مصر! احنا بلد .........! مش شايف الزبالة في الشوارع؟ مش شايف البلطجية؟".
____________

هل رأيت أبداً مبنى قد قارب أن يكتمل بناؤه الأساسي، لكن لم يبدأ "تشطيبه"؟ ستجد المبنى عبارة عن صورة من الرمال والطوب الأحمر والتراب والأسمنت؛ لكن هناك من يستطيع أن ينظر لنفس المبنى ويراه جميلاً رحباً.

أو بشيء أقرب لفكر المبرمج: تخيل فريقاً موهوباً قد كتب engine خاص بلعبة مليء بالإمكانيات المتقدمة، لكنه لم يكمل بعد صناعة الـmodels الخاصة بالشخصيات والمستويات. ستبدو اللعبة رديئة لمن  لا يعرف التفاصيل.

بدلاً من السخرية من هذا البناء نصف المكتمل فكر: كيف نكمله؟ كيف نريده أن يبدو في صورته النهائية؟

الثلاثاء، 22 يناير 2013

طيب هو يعني لازم سبب؟

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

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

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

استمر هذا البحث أيام الدولة الإسلامية، وفي عصر النهضة الأوروبية، حتى أدى إلى ظهور ما يسمى الهندسة غير الإقليديسية (non-euclidean geometry) واكتشاف أنه هناك "هندسات" كثيرة لا هندسة واحدة، كل هندسة منها بمجموعة مختلفة من المسلّمات. هذا الأمر قد أفاد في تكنولوجيات كثيرة، وفي نظرية النسبية، وفي أجهزة الـGPS.

لكن الذين بحثوا في موضوع المسلّمات الهندسية لم يكونوا يعرفون ذلك! لم يكن في حسبانهم النسبية والـGPS، كانوا فقط يبحثون. يشبعون حبهم للمعرفة وفهم الكون.

ولهذا تجدني كثيراً ما أتحدث عن الأطفال وتعليم الأطفال. لو تحدثت مع طفل عن موضوع ما فسيسأل: هل هذا الموضوع شيق أم لا. أما لو تحدثت مع شخص كبير فقد يسأل: ما الفائدة منه؟

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

وحين بدأت في العمل في لغة كلمات لم أصنع "market research" أو دراسة جدوى أو ما شابه. فتحت محرر الكود وبدأت في الكتابة. ماذا كان ليحدث لو كانت اللغة تحتاج لتمويل مثلاً، وكان عليّ أن أقنع طرفاً ما بها أولاً؟ كنت سأدخل في مناقشات لا تنتهي عن فكرة لغة البرمجة العربية، وعن فكرة عدم جدوى إنشاء لغة برمجة جديدة أصلاً بحجة عدم اختراع العجلة، ثم كنت سأجد من يقول أنه ينبغي أن أبني اللغة على منصة JVM أو CLR بدلاً من بناء آلة افتراضية خاصة للغة. لكني ببساطة أغلقت باب الغرفة، وكتبت اللغة. الآن صارت دراسة الجدوى هي "فلندع الأطفال يستخدمون اللغة ونرى النتائج"، هكذا ببساطة.

<موضوع جانبي>
وهذا الأمر يدفعنا بدوره للتفكير في موضوع التمكين والحرية: لو أعطيت كل شخص الفرصة لكي يستقر مادياً، ويجد تمويلاً لمشاريعه بدون مشقة كبيرة، فوقتها قد تعطي الفرصة لكل شخص ليفعل "ما يريد" وليس "ما يستطيع أن يقنع به بعض الأطراف ذات المال أو السلطة"، وذلك قد يعطي تنوعاً في مجالات العمل والبحث المختلفة.
</موضوع جانبي>


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

الاثنين، 21 يناير 2013

عن اللغة اليابانية (1)

موضوعنا هو أسماء الإشارة في اللغة اليابانية، وهو في رأيي موضوع شيق جداً. لماذا هو شيق؟ استمر في القراءة لتعرف...

أول ثلاث أسماء سنعرفها هي كوريه kore، وسوريه sore، وآريه are.
  • أولهم kore هو إسم إشارة للقريب من المتكلم
  • وثانيهم sore للبعيد عن المتكلم لكن قريب من المستمع
  • وثالثهم are للبعيد عن الإثنين
لكن الأسماء الثلاثة التي عرفناها لا تنفع للإشارة لشيء محدد مثل "هذا البيت" بل فقط تنفع لتقول مثلاً "هذا" بدون تحديد شيء معين. هناك أسماء أخرى معناها "هذا الـ...".
  • أولهم kono، يمكنك أن تقول مثلاً kono neko حين تقصد "هذا القط"
  • وثانيهم sono، قد تقول sono hito وأنت تشير إلى شخص (hito) بعيد عنك وقريب من المستمع
  • وثالثهم ano، للبعيد عن الطرفين
ماذا عن إسم الإشارة للمكان؟
  • نقول koko للمكان القريب من المتكلم. مثل "هنا" في اللغة العربية
  • ونقول soko للمكان البعيد عن المتكلم، القريب من المستمع
  • ونقول للبعيد عن الإثنين معاً....المفروض أن تكون ako أليس كذلك؟ لكنها للأسف ليست كذلك بل هي asoko.
(تبدو كأنها خليط من soko+ako. وعموماً في بعض اللهجات اليابانية يقولون بالفعل "ako".)

الآن تعال نتحدث عن ثلاثة أدوات استفهام يابانية:
dore معناها "أيهم"، مثل which باللغة الانجليزية، كأن تسأل "أيهم تريد؟"
dono معناها "أي من ...."، كأن  تسأل "أي طبق تريد؟"
doko معناها "أين"، للسؤال عن المكان

وهكذا نجد شيئاً طريفاً:
الإشارة للمكان الإشارة مع تحديد الإشارة فقط

-ko -no -re

koko kono kore ko- القريب من المتكلم
soko sono sore so- القريب من المستمع
asoko ano are a- البعيد عن الإثنين
doko dono dore do- الاستفهام


توجد أدوات أخرى لم أتحدث عنها مثل kochira، و sochira...الخ، تسير على نفس القاعدة؛ وهي كما ترى قاعدة منتظمة جداً: مكونات أساسية للمعاني يتم تركيبها لتكوّن معانٍ أكبر، ويشبه الأمر البرمجة. ألم أقل لك أن المقال شيق؟

[هذا المقال يعتبر تلخيصاً لصفحات من كتاب "Realms of meaning: an introduction to semantics" من تأليف Thomas Hofmann]

الأحد، 20 يناير 2013

ما الجديد في كلمات، إصدارة يناير 2013؟

أسرع وأسرع

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

 إمكانية تلوين الحروف عند طباعتها


الآن يمكن استخدام الدالة حدد.لون.النص لتغيير لون
 أي نص يطبع بعد استدعاء الدالة.










نوافذ منفصلة


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





عودة الملفات التنفيذية

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



يمكن تحميل أحدث إصدارة من كلمات من موقعها على جوجل كود، أو من موقعها الرسمي.

الأحد، 23 ديسمبر 2012

حين تتحقق خطط المدى البعيد

حين كنت أعمل في صنع لغة كلمات سنة 2010 كانت هناك بعض القرارات التي اتخذتها في تصميم وتنفيذ اللغة. بعض هذه القرارات قد بدأت تظهر آثاره الآن!