‏إظهار الرسائل ذات التسميات arabic-posts. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات arabic-posts. إظهار كافة الرسائل

الثلاثاء، 3 مارس 2026

يا ترى حيحصل ايه لجوجل وقتها؟

 صارت الإعلانات تضايقني.

 لا أقصد محتوى الإعلانات لكن الإعلانات نفسها. رأيت مؤخراً إعلاناً لشاي ليبتون وفكرت: لماذا جاءت شركة بريطانية لحدّ هنا لتبيع الشاي؟ لماذا لا يشتري الناس من أي مصنع قريب؟ ولماذا brand name اصلا؟ لماذا لا يشترون "فقط شاي" كما كان يحدث في معظم تاريخ الإنسانية؟

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

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

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

 والموبايلات نفسها؛ أريد أن أقدر أن أشتري الmotherboard والCPU والكاميرا والشاشة كما أريد واقوم بتجميعهم (أو يجمّعهم المحل لمن لا يعرف الطريقة) وأقوم بإبدال بعض هذه المكونات في وقت لاحق حين يظهر ما هو أفضل.

 إذا كنت ترى هذه الأفكار غريبة وغير مريحة لك فأدعوك أن تفكر بالعكس: تخيل لو اختفت عربات الخضر والفاكهة في مصر ولم يعد متاحا سوى الbrand names، برتقال ماركة "بحراوي" وتفاح ماركة "The Orchard" ولم يعد هناك شيء اسمه "فاكهة فقط"؟

 ماذا لو اختفت فكرة الكمبيوتر الشخصي من المكوّنات وصار الاجهزة المكتبية مثل اللابتوب والموبايل؛ لا يوجد شيء اسمه "كمبيوتر" وإنما فقط Dell أو HP أو Lenovo؟ ماذا لو اختفى "اللحم" من السوق ولم يعد الجزارون يبيعون إلا نفس اللحوم المجمدة في السوبر ماركت بماركاتها المعروفة؟

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

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

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

الثلاثاء، 21 أكتوبر 2025

السنن الكونية (2): كل شيء حسابات

( هذا المقال يعتبر "الرأي المقابل" أو "الوجه الآخر للعملة" لمقال سابق هو "النهضة بين التصوير والمنطق".)

 يسير الكون بعمليات حسابية.

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

 ونحن حين نفكّر نحاول أن نسبق الكون في حساباته على أمل أن نتحكم أو نؤثر في النتيجة النهائية. لو حاولت ان ترمي الكرة نحو السلّة، فإنك تحاول ان تحسب "ماذا ستفعل قوانين الطبيعة بالكرة؟" قبل ان يحدث هذا فعلا.. وآلة الحساب هي تدريب الرمي الذي تدربته قبل ذلك -- هذا التدريب قد ترك ارقاما في جهازك العصبي وهذه الارقام تقوم بعمل simulation للرمية قبل ان تحدث، 

وبهذا الsimulation يقوم جهازك العصبي بعمل حسابات عكسية ايضاً: تبدأ بالنتيجة المطلوبة ،وهي أن تسقط الكرة في السلة، وتنتهي بالرمية الصحيحة التي تؤدي لهذه النتيجة، أي أنك تستطيع تفعيل قوانين الطبيعة بالعكس في حساباتك!

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

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

 وكل شيء يمكن تسميته تفكيراً يمكن في رأيي تسميته حسابات. وسوف أظهر لك هذا بأمثلة كثيرة:

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

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

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

 لكن كيف يمكن لأنسان أن يتوقع كيف سيرد شخص آخر؟ نحن نتوقع هذا لأن الطرف الآخر هو الآخر يحسب حسابات بناءً على كلامنا، فلو عرفنا كيف يحسب هذا لأمكننا أن نسبقه في حساباته.

وبشكل عام فإن أي مجال يشتمل تخاطباً مع البشر، مثل التسويق، التأليف، الصحافة، الخ، يشتمل حسابات في صورة "كيف سيشعر الشخص لو قرأ أو سمع أو عرف كذا" 

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

  - ماذا عن الحسابات غير التنبؤية؟ ماذا عن شركة تحسب مرتبات موظفيها مثلا؟ هي في رأيي حسابات تنبؤية لكنها اكثر تجريدا من حساب شيء ظاهر كحركة الكرة. حين احسب لكل موظف مرتبه فأنا احسب المقدار الذي سيشعره انه أخذ مقابلا عادلا لعمله، أو يشعرني انني لم ابخسه حقه، وكل واحد فينا يشعر بهذه الاشياء عن طريق حسابات يقوم هو نفسه بها، وحين احسب المرتبات فأنا احاول ان اسبق 'حسابات المشاعر' أو 'حسابات العدل' هذه لكي تكون نتيجتها كما أتمنى.

وكثير من التفكير لا يبدو كحسابات لأننا نقوم به تلقائيا أو فطرياً، فأنت حين تتحدث مع خالك فإنك لا تمسك بورقة وقلم وتحسب بل أنك..تتحدث! هنا يأتي دور علم الـcomputer science، وهو في رأيي علم كل خطوة له يحول التفكير الفطري إلى حسابات رياضية.
 
  حساب مرتبات الموظفين » لعب الشطرنج »» الرسم »» التعرف على الوجوه »» حركات الروبوت »» التخاطب البشري
 
في كل خطوة من هؤلاء تحول شيء كنا نظنه "تفكيراً" فإذا هو..حسابات رياضية
 
أما البرمجة فجزء كبير منها هو فكرة "الحسابات العكسية" أو "التفكير بالعكس"، تبدأ بتخيل البرنامج النهائي كيف تريده أن يعمل، وتنتهي بالكود التي تجعله يعمل كما تخيلت، وقوانين الطبيعة هنا هي قواعد لغة البرمجة التي تستخدمها...لكن تنبٌه! الكمبيوتر ساينس يحول كل أنواع التفكير إلى حسابات، وبالتالي قواعد لغة البرمجة هذه تصلح لأن تحاكي 'قوانين الطبيعة' أو 'المعادلات' في أي مجال آخر
 
وأي مجال لم تصل له الكمبيوتر ساينس (أي أنه مازال "حسابات تلقائية أو فطرية") أرى أنه يمكن ان يتحول إلى حسابات حقيقية في وقت ما، وأن الإنسانية ستستفيد حين يحدث هذا، ويتحول العلم من شيء غامض نفعله تلقائيا بدون أن نفهمه تماماً إلى معادلات يمكن ان نطبق عليها كل ما نعرفه عن الحوسبة، وتصير الكمبيوتر ساينس هي "علم التفكير" او "علم التفكير كحسابات" الذي يربط بين كل العلوم الأخرى 
 
أو بمعنىً آخر..علّموا الأطفال البرمجة 

الاثنين، 15 سبتمبر 2025

السنن الكونية (1): عن التحدي الإنساني الصعب والهروب للحل السهل

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

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

 1- الإنسان أو المجموعة لديهم هدف كبير، أو هم في خطر ما لابد أن يتصدوا له

2- لكن الأمر صعب جداً، سوف تحتاج أن تبذل مجهودا كبيرا، مع احتمالات نجاح ضعيفة جدا

3- في هذه اللحظة يأتي شيطان (حقيقي أو مجازي) ويعرض عليك حلا سهلاً ومضموناً. هذا الحل ليس بحقيقيّ، إنه انهزام مزيّن بمكياج وليس انتصاراً، لكنه سهل ومضمون

4- ماذا يفعل الإنسان هنا؟ يمكنه أن يقول "سوف استمر في الحل الصعب، حتى لو كان احتمال نجاحه ضئيلا"، لكن تبدو له هذه الفكرة، نفسياً، غبية. هذا هو دور الحل السهل: ان ينفّرك من الحل الحقيقي

5- الكفاح البشري الفردي، وكفاح الأمم، ملخصه هو "ماذا سيفعل الإنسان إزاء هذا الاختيار؟"

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

- هناك دول تعيش على الديون والمنح والمعونات لأن قادتها ليسوا مؤمنين بقدرتهم على بناء اقتصاد حقيقي ويسمونه أمراً مستحيلاً. (احيانا ينفون اللوم عن أنفسهم ويقولون أن الشعب هو الذي يفتقد هذه القدرة، لكننا جميعاً نعرف الحقيقة)

 - للذين دخلوا كليات صعبة: كم من اقربائك قالوا لك ان تبتعد عن هذه البهدلة التي لن تحتملها، وأنه ينبغي أن تدخل كلية سهلة تتفوق فيها مرتاحاً؟

- حين يخطيء الإنسان في حق شخص، هل سيعتذر ويتحمل الغصّة التي تأتي مع الاعتراف بالخطأ، أم سيتظاهر للأبد أنه لم يخطيء؟

 - هناك جماعة من الناس مُنعوا أن يعيشوا في دولة أو حتى دُويلة، بل مجبرون أن يعيشوا في شظية من دولة، لكنهم يخوضون حرباً عسكرية ضد عدو يخيف كل الدول التي تحيط به، التي هي اختارت الحل السهل

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

- حين يتصل بك صديقك ويسألك لماذا تأخرت، هل ستقول "أنا في السيارة عند ناصية الشارع الذي سنتقابل فيه" أم ستقول "أنا أمام باب المنزل وسأركب السيارة الآن"؟

- اقرأ قصة حياة أي عالم أو مصلح اجتماعي، هل ستتفاجأ لو وجدت جملة على غرار "وتجاهله المجتمع، وسخر منه الناس، وحاربه الكثير"؟

- هل نصنّع سيارة/الكترونيات/ai محلياً، أم نأتي بمنتج أجنبي، نقوم بتجميعه ووضعه في كرتونة محلية، ونقدمه على أنه من إنتاجنا؟

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

 - ماذا افعل اللحظة القادمة؟ هل اقوم بذلك العمل المقرف المتأخر عليّ، أم أفتح السوشال ميديا؟

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

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

الأحد، 24 أغسطس 2025

نتفلسف عشان احنا فاضيين وكدة

توجد فزورة شهيرة كالتالي:

What happens when the unstoppable force meets the immovable object?

ماذا يحدث حين تتقابل القوة التي لا توقَف مع الجسم الذي لا يُحرَّك؟

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

فلنطرح إجابات اخرى ممكنة (بعض هذه الإجابات حصلت عليها من الحوار مع الAI)

1- سوف يمرّ احدهما خلال الآخر، وبالتالي يمرّ الأمر بسلام بدون أن تتوقف القوة او يتحرك الجسم

2- من المستحيل أن يوجد عالم يجمع بين هذين الشيئين لأن وجودهما في نفس العالم يؤدي لتناقض منطقي

3- من الممكن ان يجتمعا في نفس العالم، لكن من المستحيل ان يلتقيا لأن لقائهما سيؤدي لتناقض

 

الإجابتان 2 و 3 تطرحان تساؤلاً شيقاً جدا: هل مجرد وجود هذين الشيئين تناقض؟ يمكن ان نقول انه نعم، لأن وجودهما يطرح إمكانية أن يلتقيا في أي وقت، والتقاؤهما تناقض. بمعنى آخر: (أ) لو وجد هذان الشيئان في نفس العالم فيمكن لشخص شقي أن يوجه القوة التي لا توقف ناحية الجسم الذي لا يُحرّك (ب) لا شيء في قواعد الكون المعروفة يمنع هذا التوجيه (ج) لكن هذا التصرف سيؤدي لتناقض منطقي (د) إذاً الحل الوحيد هو استحالة اجتماعهما في عالم واحد. 

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

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

 

s = initialState()
while(true) {
    s = nextState(s)
}

لكن من قال ان الكون لديه حالة تالية واحدة ينتقل إليها؟ ألا تقول نظرية الكوانتم انه هناك حالات عديدة ممكنة؟ في تلك الحالة (؟!) تكون الكود كالآتي

s = initialState()
while(true) {
    ss = possibleNextStates(s)
    s = selectOneFrom(ss)
}

  كيف يتصرف هذا البرنامج مع الفزورة التي نناقشها؟ فلنفترض أن أحد الاشقياء قام بتوجيه القوة التي لا توقف تجاه الجسم الذي لا يُحرَك..واخذا يتقاربان حتى أوشكا أن يتدافعا..المشكلة ان تدافعهما سيؤدي لحالة مستحيلة منطقيا، وبالتالي لن يمكن للكون ان يدخل في هذه الحالة. أي ان المتغير ss سيكون عبارة عن مصفوفة فارغة! لقد وصل الكون إلى وضع لا يمكن الانتقال منه إلى حالة (state) تالية! ماذا سيحدث بعدها؟ يتوقف هذا على طبيعة الerror handling في البرنامج

- ربما يظل الكون في نفس الحالة للأبد: الـشيئان أوشكا أن يتصادما، لكن الزمن توقف وكل شيء توقف فلن يتصادما أبداً، لقد هربنا من التناقض المنطقي لكن انتهى مرور الزمن.

- او ربما هناك شيء مثل transaction unroll، بمعنى أن البرنامج/الكون لديه سجل من الحالات السابقة (مثلا آخر ن من الحالات السابقة)، ويمكنه أن يتراجع إلى آخر state سليمة لا تؤدي بالضرورة إلى مسار التناقض، ثم يختار مساراً مختلفا عما حدث المرة السابقة.

- او ربما يحدث شيء مثل unhandled exception leading to process restart، أن يصل الكون إلى وضع يؤدي لاستحالة منطقية، فينتهي كل شيء ويبدأ الكون منذ البداية. ستكون خسارة اننا سنفقد كل ما حدث من قبل لكن على الأقل لن يتوقف الزمن مطلقا (هذا هو الفرق بين hanging و crashing في الحوسبة)

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

 الم أقل لكم أننا سنتفلسف؟ 

 إعلان: لغة كلمات لديها الآن قناة على يوتيوب تجدوها هنا: https://youtube.com/@KalimatLang 

الثلاثاء، 25 مارس 2025

ما الجديد في كلمات، إصدارة فبراير 2025؟

 رسومات بطريقة Double buffering

 كانت الاطياف sprites هي الوسيلة الوحيدة للحركة والالعاب في كلمات، لكن الآن اضفنا وسيلة اخرى شبيهة بمكتبات الالعاب المعروفة عن طريق روتينات جهز.الرسم،() ابدأ.الرسم()،  انه.الرسم() ، ويستخدمون كالآتي:

جهز.الرسم()
كرر :
    ت = ابدأ.الرسم()
    -- ارسم ما تريد هنا على شاشة خاوية
    -- ت هو الوقت من الكادر السابق (time since past frame/ delta_t)

    انه.الرسم()
تابع 

هناك مثال لهذا الاسلوب مرفق مع كلمات هو cat chasing mouse


 

ألطف على الCPU

  جاءني قديما شكاوى من المستخدمين ان تنفيذ برامج كلمات يرفع جدا من صوت مروحة الCPU في اجهزتهم، وقد احتجت لتفتيش الكود الخاصة بالvirtual machine سطرا سطرا حتى عرفت سبب المشكلة (وقمت بحله).

 أمر ارسم.نص

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

ارسم.نص النص في (س، ص)، اللون، الحجم، الخط

مثلاً

ارسم.نص "مرحبا" في (100، 100)، 7، 12،  "Tahoma"

 

كالعادة اللون والحجم والخط اختياريون 

 


(غالبا) اخطاء جديدة
 
لم انشر اصدارات لهذا المشروع منذ 2013 (عشر سنوات متوقفة عن النشر ولاتزال لا مثيل لها!)، لذلك اتوقع bugs يمينا ويساراً. سوف يسعدني قراءة تقارير بالأخطاء من المستخدمين لو كان هناك من لا يزال يقرأ هذه المدونة.
 
هل هذا كل شيء؟ أليس هذا بقليل؟

انا فقط انفض التراب عن هذا المشروع، لم أبدأ التطوير الحقيقي بعد. 
 
ولكي أكون صريحا معكم، المشاكل التي جعلتني اوقف مشاريعي لم تحل بعد، وقد تجدوني بعد اسبوع مثلا عدت للانغلاق من جديد.
 
لو فعلت هذا سيكون بالرغم مني. انا احب النهضة :(
 
هذا هو موقع اللغة: https://kalimat-lang.com

السبت، 1 يونيو 2013

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

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

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

قصص ومشاهد

 رموز الكانجي بالآلاف، معظمها رموز مركّبة من رموز أصغر. كيف نتذكر تركيب الرموز على بعضها؟ حين بدأت تعلم الكانجي وجدت نفسي أخترع جملاً تذكرني لماذا - مثلاً - رمز "أذن" + رمز "بوابة" = رمز "يسمع". إنه أمر جميل ويجعلني أشعر أنني أقرأ بيتَ شعرٍ صغيراً مع كل حرف أتعلمه.

هناك من نقّح هذا الأسلوب ولم يكتف بجعلها جملاً تذكيرية بل جعلها قصصاً (أو مشاهداً من قصص) مثيرة للخيال، بحيث تصبح الرموز المختلفة هي الشخصيات والكواليس في المشهد، فإن وصفت المشهد رسمت الحرف. هذه الطريقة معروفة بإسم طريقة هِيْسج Heisig method وهناك الكثير ممن يتعلمون اليابانية بها.

سوف نتعلم الآن سوياً بعض رموز الكانجي لأن أفضل طريقة لشرح الأسلوب الجديد هي استخدامه! بعد أن ننتهي من جولتنا عبر الرموز سوف نناقش "الفلسفة التعليمية" من وراء الأسلوب الجديد، ثم نقدم خاتمة.

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

جولة عبر الكانجي

هذا الرمز يعني "فم"، وقد يعني أحيانا "فتحة"، مثلما يقول العرب على الفم "ثغر" أحياناً.
هذا الرمز معناه "شمس" أو "يوم". تذكر أنه في الكانجي تصير الدوائر مستطيلات. ألا يرسم الاطفال الشمس بابتسامة؟ هنا نجد دائرة فيها خط مثل الشمس المبتسمة.
هذا الرمز معناه "عين". لو ظلّلت المستطيل الأوسط باللون الأسود لرأيت عيناً مرسومة بطريقة الأنمي اليابانية.
هذا الرمز يعني "أذن". يشبه العين قليلاً لكن حافته السفلى مائلة للأعلى (مثل حافة الأذن) والخطوط المتقاطعة في الركن تشبه شحمة الأذن.
هذا الرمز يعني "حقل الأرز"، مستطيل من الأرض تقسّمه قنوات الريّ. هل تعلم أن كلمة "جدول" (مثل جدول الضرب أو جدول الحصص) مصدرها جدول الماء الذي يروي الأرض؟ كأن الصفحة قد صارت هي أرض تقسمها جداول الماء جيئة وذهاباً.
هذا الرمز معناه "شجرة". واضح طبعاً.
هذا الرمز معناه "طفل"، مثل الطفل الرضيع في عربة الأطفال، وهناك بطانية صغيرة فوقة هي هنا الخط الأفقي في منتصف الرمز؛ رأسه تظهر من خارجها والشكل العام لجسمه واضح من تحتها.
هذا الرمز معناه "امرأة"، تبدو لي كأنها امرأة ارستقراطية ترتدي قبعة كما في الأفلام القديمة.
هذا الرمز معناه "شخص"، وهو واضح على ما أعتقد. حين يأتي هذا الرمز كمكوّن في رموز أعقد يمكن أن يبدو مثل النصف الأيسر من الرموز التالية: 化 休 保
هذا الرمز يمثل الرقم عشرة، مثل الأرقام الرومانية التي ترمز للعشرة بالحرف X. يبدو أن الشعوب القديمة تحب التعبير عن العشرة بالخطوط المتقاطعة.
هذا الرمز يعني "قوة".
هذا الرمز يعني "بوابة"، وهو واضح: البوابة الحديدية التي تفتح وتغلق بالمحاور على اليمين وعلى اليسار.
هذا الرمز يعني "تاج"، لكنه (على ما أعتقد) في أصله الصيني يعني "سقف"، تذكر هذا حين نقوم بتركيبه مع رموز أخرى!
هذا ليس رمزاً مستقلاً لكنه قطعة من رموز أعقد؛ سوف نعتبره يمثل أرجلاً.
هذا أول رمز مركّب نراه، ومعناه "يرى". الأرجل تدل هنا على النشاط، والعين النشطة ترى.
هذا الرمز معناه "قديم". أعلاه رمز الرقم عشرة وأسفله رمز الفم. ألم نقل أن الفم قد يكون أيضاً فتحة؟ الشيء القديم به عشرة ثقوب.
أما هنا فالرمز يعني "مبكر" أو "سريع". شمس وتحتها عشرة، ولو كان موعدنا من شروق الشمس إلى الساعة العاشرة فهو موعد مبكر.
هذا الرمز يعني "أبيض". ألا يقولون أن ضوء الشمس أبيض ومركب من ألوان الطيف السبعة؟ هنا نرى خطاً يخرج من الشمس، شعاع من الضوء الأبيض.
هذا الرمز يعني "مائة". الخط الأفقي في أعلاه هو الرقم واحد بالكانجي، وتحته رمز كلمة "أبيض"، لأنه حينما يبلغ الرجل مائة عام لا يتبقى له سوى شعر قليل (يمثله هنا شعرة واحدة) لونه أبيض.
هذا الرمز معناه "أخ أكبر". كيف يرى الطفل أخاه الأكبر؟ إنه الأخ الذي كثيراً ما ينصحه و ويأخذه في نزهات، لذلك فإن الأخ الأكبر بالنسبة للطفل هو نصائح وتمشية، أي فم وأرجل.
هذا الرمز معناه "أصل"، أو "أساسي"، أو "كتاب". شجرة وهناك علامة على جذرها الذي هو الأصل الذي قد نبتت منه الفروع. قصة أخرى: الكتاب أساسه الورق الذي يصنع من الشجر، والعلامة في الأسفل سببها أننا بدأنا في قطع الشجرة لكي نصنع منها كتاباً.
هذا الرمز معناه "بضاعة"، تخيل سفينة بضائع محملة بالقمح والأرز والسكر، وكل هذه الأفواه هي "المستهلكون" الذين ينتظروت البضاعة بنفاذ صبر.
وهذا الرمز معناه "يهمس"، فم هامس التفّت حوله كل آذان المستمعين وإلا لن يُسمَع ما يقول.
هذا الرمز يعني "رجل"، لأنه يعمل في الحقل بقوة.
هذا الرمز معناه "يعين"، لأنك حين تعينني تضيف عينك إلى عيني وتضيف قوّتك إلى قوّتي.
هذا الرمز معناه "يضيف" أو "يجمع"، والآن تخيل سياسي يقف على المنصة ويلقي خطبة بصوته الجهوري ليكتسب مؤيدين ويضيف قوّتهم إلى قوّتة.
هذا المشهد معناه "يبحث في الأمر" investigate، والمشهد هنا عبارة عن عين فاحصة فوقها شجرة وتحتها الرقم واحد، هذه هي عين المحقق وهو يفحص البصمات تحت شجرة، لأن هذا هو الدليل الوحيد في القضية.
هذا الرمز معناه "يسمع"، الأذن هنا هي حارس يقف عند بوابة السمع؛ فإن أراد الصوت أن يمر من البوابة ليصل للمخ فسوف يمر أولاً على الأذن.
أما هذا الرمز فمعناه "فترة"، والمشهد هنا هو الشمس وهي تشرق وتغرب في تتابع سريع مثل ضيف يمر دخولاً وخروجاً عبر البوابة.
هذا الرمز معناه "وقت الفراغ"، والأن تخيل تلميذاً يذاكر ويرى الشجرة من بعيد من خلال البوابة، وكل حين يقول لنفسه: حين يصير لدي وقت فراغ ساجري عبر هذه البوابة وألعب تحت الشجرة.
هذا الرمز معناه "مازال" أو "ليس بعد"، (مثل كلمة "لسّة" في العامية المصرية التي تتضمن المعنيين). المشهد هنا هو شجرة يوجد غصن صغير في أعلاها، يدل على استمرارية نموها.
هذا الرمز معناه "رخيص" أو "أمان"، والمشهد هو شخص يتخيل عودته إلى بيته، حيث السقف الذي يأويه وزوجته التي تنتظره، والشعور بالأمان.
وهذا الرمز يعني "أخت صغرى". هل صارت امرأة بعد؟ لا ليس بعد.
هذا الرمز يعني "حرف"، لأنه حين يبدأ الطفل في تعلم الكتابة تكون الحروف هي سقف معرفته.
وهذا الرمز معناه مخاطرة، مثل عين تنظر للشمس بدون خوف من النتيجة.
وهذا الرمز معناه "ينجز"، حقل الأرز هنا يمثل نتيجة العمل والجهد، والحقل نفسه فوق الشجرة في مشهد خيالي كأننا نقول "هيا نقطف ثمار جهدنا!".
الرمز هنا يعني "يستريح"، رجل يستريح عند شجرة.
هذا الرمز يعني "برقوق"، وهو يمثل طفلاً يقف أسفل الشجرة منتظراً حتى يسقط البرقوق ليأكله. الا يستحق البرقوق أن يكون هو الثمر الذي نخصص له رمز الطفل تحت رمز الشجرة؟
أما هذا الرمز فيعني "مشمش"، والمشهد هنا هو شخص كسول ينتظر تحت الشجرة فاتحاً فاه، فالمشمش صغير وقد يسقط فيدخل فمه مباشرةً، هكذا يظن.
وهذا الرمز معناه "يُذهَل"، وهناك رجل قد ذُهِل مما رأى فتسلق أقرب شجرة وأخذ يصيح بملء فمه ليخبر الناس بما رآه.
وهذا معناه "ينتصر" أو "يتغلّب على": الرقم عشرة تحته "أخ أكبر"..لو كان معك عشرة من إخوتك الكبار فإنك بالتأكيد ستتغلب على خصمك!

تهانينا! لقد تعلمنا سوياً أربعين من رموز الكانجي في فترة قصيرة جداً، منها ثلاثة عشر رمزاً هم رموز أساسية تُعرف كما هي وسبعة وعشرون ركّبناها عن طريق المشاهد، طريقة سهلة في التذكر وصعبة في النسيان.

أربعون، هل تتخيل؟ لقد قمنا بإنجاز (果) كبير اليوم.

المهم هو التركيب
قد يبدو لأول وهلة أن هذا المقال ما هو إلا تكرار لفكرة "رموز الكانجي هي رسومات"، لكنّ الأمر ليس كذلك:

أولاً: فكرة "رموز الكانجي رسومات" لا تقدّم لنا أسلوباً عملياً يمكن تطبيقه لدراسة الكانجي، وإلا لكان الجميع يتعلمونه بسهولة.

ثانياً: الفكرة نفسها ليست صحيحة. مثلاً تعلّمنا أن مائة هي 百. قل لي: هل نحن هكذا رسمنا المائة؟

ثالثاً: الكانجي بها آلاف الرموز، منها حوالي مائتي رمز أساسيين والباقي تراكيب أعقد تستخدم الرموز السابقة. معنى هذا أن المشكلة ليست في رسم الرمز بل في "التكوين" أو "التركيب". ليست المشكلة في أن شجرة هي 木 بل المشكلة هي كيف نجمع بين رمز "شجرة" ورمز "خروف" ورمز"شمس"...الخ لنكوّن رموزاً أعقد، لهذا قلنا كل هذا الكلام عن القصص والمشاهد.

نقطة جانبية
أليس العلم كله كذلك؟ إن العلوم تركز جداً على علاقات الأشياء ببعضها البعض: البرمجة هي تراكيب من البيانات والإجراءات، والرياضيات تجد فكرة "relation"، وفكرة "function" التي هي حالة خاصة من relation، في أساسها. كل علم ترى فيه مكونات أساسية وتراكيب.

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

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

الثلاثاء، 26 فبراير 2013

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

بروتوكول للتكرار

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


أسرع :)

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

نسخة انجليزية

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

النسخة الإنجليزية تستخدم نفس الكود الخاصة بالنسخة العربية، ويتم بناؤها بفتح ملف kalimat.pro وإزالة علامة # في السطر الذي نصه:
#DEFINES += ENGLISH_PL

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

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

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

نتمنى لكم برمجة ممتعة مع كلمات!

الأحد، 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 كانت هناك بعض القرارات التي اتخذتها في تصميم وتنفيذ اللغة. بعض هذه القرارات قد بدأت تظهر آثاره الآن!

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

رسم الصيغ الرياضية بلغة كلمات (الجزء الثاني)

الهدف من المشروع هو برنامج يرسم الصيغ الرياضية، مثلاً يقول له المستخدمم س^2 + 5 فيرسم البرنامج شكل الـparabola المعروف.
  • في الجزء الأول تحدثنا عن الإعراب، الدالة التي تأخذ نصاً مثل 12+13 وتعود بالمصفوفة ["+"، 12، 13] التي تمثل ما يسمى بشجرة الإعراب parse tree.
لو كنت قد قرأت الجزء الأول فأنت إذاً جاهز الآن لنختتم هذه السلسلة.

حساب قيمة التعبير

حسناً. لدينا الآن شجرة إعراب مثل 100 أو ["+"، س، 12]، ماذا نفعل بها؟ نريد دالة اسمها تقييم تأخذ الشجرة وتعود بالقيمة التي تعبر عنها.
  • لو كانت "الشجرة" في صورة قيمة عددية، نعود بتلك القيمة.
  • لو كانت الشجرة هي المتغير س (كقيمة نصية)، فإننا لا نستطيع أن نفعل شيئاً بأنفسنا، لذلك سوف نقدم عاملاً إضافياً parameter للدالة تقييم به قيمة س المطلوبة.
  • لو كانت الشجرة في صورة مصفوفة مثل ["+"، أ، ب] سوف نقوم بالآتي:
    • ناد الدالة تقييم مع الفرع الأيمن أ لحساب قيمته
    • ناد الدالة أيضاً مع الفرع الأيسر ب
    • نفذ العملية الحسابية وارجع بالنتيجة.
كل هذا يعطينا الكود التالية، الدالة تأخذ الشجرة "ت" وقيمة "س" المحددة من البرنامج، وتحسب قيمة الصيغة الرياضية:
دالة تقييم (ت، س):
    إذا ت ~ ["+"، ؟أ، ؟ب]:
        ارجع ب: تقييم (أ، س)+ تقييم (ب، س)
    وإلا إذا ت ~ ["-"، ؟أ، ؟ب]:
        ارجع ب: تقييم (أ، س)- تقييم (ب، س)
    وإلا إذا ت ~ ["×"، ؟أ، ؟ب]:
        ارجع ب: تقييم (أ، س)× تقييم (ب، س)
    وإلا إذا ت ~ ["÷"، ؟أ، ؟ب]:
        مقام = تقييم (ب، س)
        إذا مقام <> 0 :
            ارجع ب: تقييم (أ، س)÷ مقام 
        وإلا :
            اطبع "خطأ: قسمة على صفر" 
            ارجع ب: 0 
        تم 
    وإلا إذا ت ~ ["^"، ؟أ، ؟ب]:
        ارجع ب: أس (تقييم (أ، س)، تقييم (ب، س))
    وإلا إذا ت ~ "س" :
        ارجع ب: س 
    وإلا :
          -- لو وصلنا إلى هنا فقيمة ت هي اصلا عدد
         ارجع ب: ت 
    تم 
نهاية

لاحظ كيف استخدمنا مرة أخرى عملية المطابقة ~ لتسهيل الموضوع. الآن نحن جاهزون للرسم. أولاً نكتب إجراءاً مساعداً يرسم المحاور س، ص
إجراء ارسم.المحاور ():
    ارسم.خط (400، 0)- (400، 599)
    ارسم.خط (0، 300)- (799، 300)
نهاية

الآن سوف نكتب الدالة التي ترسم فعلاً. خطتنا كالآتي:
الدالة سوف تأخذ عاملين: من.س و إلى.س،  لكي نستطيع أن نقول مثلاً ارسم س^2 من س=-4 إلى س=4
سوف تقوم الدالة بالآتي:
  • كرر بحيث يبدأ المتغير أ بالقيمة من.س وينتهي بالقيمة إلى.س، وكل مرة نضيف قيمة صغيرة إلى أ:
    • احسب ص عن طريق استدعاء تقييم لحساب قيمة الصيغة الرياضية، واعطها قيمة المتغير س تساوي العداد أ
    • سوف نرسم خطاً صغيراً بين كل نقطتين:
      • لو كان هذا أول تكرار، فلا يوجد لدينا سوى نقطة واحدة. خزن قيمة أ في المتغير أ.قديم وقيمة ص في المتغير ص.قديم
      • لو لم يكن أول تكرار، فنحن لدينا النقطة (أ، ص) والنقطة (أ.قديم، ص.قديم). سنرسم خطاً بينهما
هذا يعطينا الكود :
إجراء ارسم.الدالة (التعبير، من.س، إلى.س):
    أ = من.س 
    أ.قديم = لاشيء 
    ص.قديم = لاشيء 
    مقياس.س = 20 
    مقياس.ص = 15 
    
    كرر مادام أ <= إلى.س :
        ص = تقييم (التعبير، أ)
        إذا ليس أ.قديم = لاشيء :
            س1 = - أ × مقياس.س + 400 
            ص1 = - ص × مقياس.ص + 300 
            س2 = - أ.قديم × مقياس.س + 400 
            ص2 = - ص.قديم × مقياس.ص + 300 
            ارسم.خط (س1، ص1)- (س2، ص2)، 4 
        تم 
        أ.قديم = أ 
        ص.قديم = ص 
        أ = أ + 0.1 
        انتظر (30)
    تابع 
نهاية

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

لا يبقى إلا ان نربط كل المكونات ببعضها!

اقرأ "الصيغة؟"، الصيغة 
اقرأ "من؟"، # أ 
اقرأ "إلى؟"، # ب 

الصيغة = تبديل (الصيغة، " "، "")
الشجرة = تعبير (الصيغة)
ارسم.المحاور ()
ارسم.الدالة (الشجرة، أ، ب)

ماذا فعلنا؟
  • قرأنا الصيغة من المستخدم (وقيم س التي سنبدأ وننتهي بها)
  • حذفنا المسافات من الصيغة
  • أعربناها لنحصل على شجرة الإعراب بواسطة الدالة تعبير
  • رسمنا المحاور
  • نادينا ارسم.الدالة وأعطيناها الشجرة وقيم من.س وإلى.س
  • ارسم.الدالة سوف تنادي تقييم باستمرار لكي تحسب قيمة الصيغة عند كل قيمة لـ س
  • ....وترسم الخطوط المطلوبة!

كم سطراً كتبنا؟ للأسف تجاوزنا حاجز المائة قليلاً: 109. لكن لو حذفنا السطور الفارغة بين تعريفات الدوال...الخ سيكون العدد أقل من المائة.

أقل من مائة سطر، تقوم بما قد يحتاج مئات الأسطر في لغات أخرى...

يمكنك عزيزي القاريء أن تجرب عمل نسخة متقدمة من البرنامج تضيف إمكانية استخدام الدوال مثل جتا، جا، أو تضيف الثابتين ط (π) و هـ (e) أوتقدم بعض المساعدة للمستخدم. لمَ لا تجرب؟ :)

رسم الصيغ الرياضية بلغة كلمات

نريد برنامجاً يأخذ صيغة رياضية ويرسمها!


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

الجزء الأول: كيف نفهم الصيغة الرياضية؟

يوجد في علوم الحاسب ما يسمى parsing (الإعراب). لو أعربنا التعبير الحسابي س^2+5 فسيكون لنا النتيجة التالية:

هذه الرسمة اسمها "شجرة الإعراب" أو parse tree، وهي تشبه الشجرة لأن لها جذراً وفروعاً. كيف نعبر عن هذه الشجرة بقيمة في لغة كلمات؟ هناك طرق كثيرة: يمكن أن نستخدم الفصائل والكائنات، أو المصفوفات، أو القواميس...فلنستخدم طريقة بسيطة: سوف تكون كل شجرة عبارة من مصفوفة من ثلاثة عناصر: العملية الحسابية نفسها، والقيمتان التي تجري عليهما العملية. مثلاً إن قمنا بإعراب التعبير "4+5" سوف نحصل على المصفوفة ["+"، 4، 5]. لو أعربنا القيمة النصية "(4+5)×2" سوف نحصل على ["×"، ["+"، 4، 5]، 2]. أي أن الشجرة هي عملية ضرب بين ["+"، 4، 5] وبين 2.

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

لاحظ أن الإعراب لا يعود دائماً بمصفوفات..لو أعربنا مثلاً التعبير 12 فإن "الشجرة" ما هي إلا العدد 12 نفسه.

رائع. الآن علينا أن نفكر: مم تتكون الصيغ الرياضية؟ سوف نسمي الصيغة في صورتها النهائية "تعبير حسابي"، وهذا التعبير مكون من حد واحد أو أكثر. ما الذي يفصل بين الحدود في التعبير الواحد؟ علامات الجمع والطرح. أي أن التعبير يكون في صيغة حد1 + حد2 - حد3....الخ، أو مكون من حد واحد.


كيف نعبر عن هذا رياضياً؟ هناك طريقة اسمها Parse Expression Grammar أو PEG تسمح لنا أن نكتب القاعدة بهذه الطريقة:

تعبير = حد "+" تعبير       (هذه قاعدة 1#)
أو       حد "-" تعبير       (قاعدة 2#)
أو       حد                  (قاعدة 3#)

ما معنى هذا الوصف؟ معناه أن التعبير يمكن أن يكون حداً واحداً أو مجموعة من الحدود يفصل بينها + و -. مثلاً يمكن أن نبدأ بالحد "2×3". نحن نعرف أن هذا تعبير من قاعدة #3 من التعريف. ماذا عن 1 + 2×3؟ نعرف أن هذا أيضاً تعبير (من قاعدة #1 التي تقول أن حد + تعبير = تعبير، وبالتالي سمحت لنا بإضافة حد في المقدمة). ماذا عن 5 - 1 + 2×3؟ هذا أيضاً تعبير من جزء 2# من التعريف


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

ماذا عن الحدود نفسها؟ الحد هو "أس" واحد أو أكثر تفصل بينها علامات  ×، ÷

هذه كلها حدود:

5^2 × 6
6 ÷ 3
18
6^س

كيف نكتبها بطريقة PEG؟ هكذا:

حد = أس "×" حد
أو     أس "÷" حد
أو أس

وهي كما ترى نفس طريقة التعبيرات. لاحظ أن قيمة عادية مثل "18" نعتبرها أس رغم غياب علامة ^، مثلما اعتبرنا أن 12 هو تعبير رغم غياب علامة + أو -

ماذا عن الأسس؟ هي ببساطة مجموعة من واحد أو أكثر من التعبيرات الأولية يفصل بينها علامة ^. كل هذه أسس:

س^2
2^س
س^2^3
س
12

والقاعدة (كما خمنت) هي:

أس = أولي "^" أس
أو     أولي

ولكن ما هو التعبير الأولي؟؟؟ إنه رقم، أو المتغير س، أو تعبير بين أقواس:

أولي = "س"
أو     رقم
أو  "(" تعبير ")"

لم يبق ما نعرّفه سوى الأرقام نفسها. الرقم هو خانة واحدة أو أكثر (الخانة هي الرمز 0، أو 1، أو 2...إلى 9).

رقم = خانة رقم
أو خانة
خانة = من "0" إلى "9"

الرقم هو خانات لا يفصل بينها شيء. لهذا لم نقل مثلاً رقم = خانة + رقم بل قلنا مباشرةً رقم = خانة رقم....

ولكن ما فائدة كل هذا؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

فائدة كل هذا أن لغة كلمات بها محرك إعراب جاهز. لو قدمت له قواعد في صورة PEG سوف يقدم لك إمكانية إعراب أي نص يتماشى مع هذه القواعد. مثلما نعرّف في كلمات دالة أو إجراء أو فصيلة، يمكننا أيضاً أن نعرّف قواعداً. انظر للكود الآتية:
قواعد تعبير :
    تعبير = حد "+" تعبير 
    أو حد "-" تعبير 
    أو حد 

    حد = أس "×" حد 
    أو أس "÷" حد 
    أو أس 

    أس = أولي "^" أس 
    أو أولي 


    أولي = رقم 
    أو "س" 
    أو "(" تعبير ")" 

    رقم = خانة رقم
    أو خانة 

    خانة = من "0" إلى "9" 
نهاية 
 

اطبع تعبير ("1+2+3")

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

لماذا؟ في الواقع سوف تقوم كلمات بإعراب التعبير، لكننا لم نطلب منها أن تعطينا شجرة إعراب، لذلك سوف تعود لنا بالقيمة لاشيء. هيا نغير ذلك الموقف! فلنبدأ بشيء بسيط كالأرقام:
رقم = خانة:أ رقم:ب => أ + ب 
أو خانة 

خانة = من "0" إلى "9"

لاحظ شيئين:
في السطر الأول قلنا خانة:أ رقم:ب ، هذه طريقتنا في إعطاء أسماء للمكونات التي نعربها.
أننا قلنا في أخر السطر => أ + ب ، وهذه طريقتنا في أن نعود بقيم أثناء الإعراب

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

لاحظ أن أ و ب هما نصان، فلو أعربنا الرقم "123" فسيكون أ = "1" و ب يساوي "23" (الأرقام تقرأ من اليسار) وبهذا يكون الرقم كله هو أ + ب = "123"

ماذا عن السطر الثاني الذي يقول أو خانة؟ نحن لم نخبره بأي قيمة يعود، لكن لو رأى مفسر كلمات قاعدة ما هي الا استدعاء قاعدة أخرى (نحن لم نفعل سوى استدعاء "خانة") فسيعود بنفس القيمة الآتية من القاعدة المستدعاه. كأني بالضبط قلت أو خانة:أ => أ

ماذا عن السطر خانة = من "0" إلى "9"؟ حين تكون القاعدة ما هي إلا قيمة نصية فالقيمة العائدة منها هي نفس القيمة النصية.

إذاً قد عرفنا ماذا يرجع من رقم. ماذا عن شيء مثل تعبير؟

تعبير = حد:أ "+" تعبير:ب => ["+"، أ، ب]
أو حد:أ "-" تعبير:ب => ["-"، أ، ب]
أو حد:أ => أ

باللغة البشرية:
التعبير هو حد اسمه أ، ثم علامة "+"، ثم تعبير أصغر اسمه ب ، وفي تلك الحالة ارجع بالمصفوفة ["+"، أ، ب]
أو هو حد اسمه أ، ثم علامة "-"، ثم تعبير أصغر اسمه ب، وهنا ارجع بالمصفوفة ["-"، أ، ب]
أو هو مجرد حد اسمه أ، وفي تلك الحالة ارجع بذلك الحد.

سهل، أليس كذلك؟ بنفس الطريقة نعدل "حد" و "أس" و"أولي" ليكون لدينا القواعد كلها:

قواعد تعبير :
    تعبير = حد : أ "+" تعبير : ب => ["+"، أ، ب]
    أو حد : أ "-" تعبير : ب => ["-"، أ، ب]
    أو حد : أ => أ 

    حد = أس:أ "×" حد:ب => ["×"، أ، ب]
    أو أس:أ "÷" حد:ب => ["÷"، أ، ب]
    أو أس:أ => أ 

    أس = عامل:أ "^" أس:ب => ["^"، أ، ب]
    أو عامل 

    عامل = رقم:أ => كعدد (أ)
    أو "س" 
    أو "(" تعبير : أ ")" => أ 

    رقم = خانة : أ رقم : ب => أ + ب 
    أو خانة 

    خانة = من "0" إلى "9" 
نهاية 

لاحظ أننا في هذا الجزء التالي قد حولنا الرقم من قيمة نصية إلى قيمة عددية:

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

سوف تصنع لنا كلمات دالة اسمها "تعبير" (لأننا قد سمينا القواعد "تعبير")، وهذه الدالة إن أعطيناها نصاً فستعطينا شجرة إعراب. جرب أن تضيف هذا السطر في آخر البرنامج:
اطبع تعبير("12+13×14")

سوف يظهر المخرج التالي:

["+"، 12، ["×"، 13، 14]]


في الواقع الكود السابقة ليست دقيقة لأن العمليات الرياضية + - ÷ × بها خاصية left associativity. أي أن تعبير مثل 1-2-5 المفروض أن يكون (1-2)-5، لكن برنامجنا يعتبره 1-(2-5)، أي أنه يعود بالشجرة ["-"، 1، ["-"، 2، 5] بدلاً من الشجرة الصحيحة وهي ["-"، ["-"، 1، 2]، 5]

سبب المشكلة هو أنه كان المفروض في القواعد أن نقول:
تعبير = تعبير + حد
ولكننا قلنا
تعبير = حد + تعبير

للأسف لا يمكن استخدام الطريقة الصحيحة في هذا الإصدار من كلمات بسبب مشكلة اسمها left recursion (هناك طرق لحل تلك المشكلة لكنها لم تطبق في كلمات بعد). لذلك علينا الحذر: البرنامج سيعطي نتائجاً خاطئة في المدخلات أ-ب-ج أو أ÷ب÷ج، ولكن يمكننا استخدام الأقواس في تلك الحالات.

على العموم قد أنهينا جزء إعراب الصيغ الرياضية، ومازال لدينا 70 سطراً أيضاً!