الأربعاء، 5 مارس، 2014

مقدمة سريعة عن الحوسبة و البرمجة

توطئة:
 
هذه مقدمة بسيطة مختصرة تصلح لشرح الفكرة العامة لبعض الأمور و المفاهيم الأساسية المتعلقة بالحوسبة computing و البرمجة programming، و الهدف الرئيس من ورائها أن تكون هي نفسها مجرد توطئة للدخول فيما بعد إلي عالم التفاصيل التقنية المتخصصة رويداً رويدا. و لذلك حرصتُ أن تكون خاليةً قدر الإمكان من أية تفاصيل تقنية تتطلب أي نوع من أنواع المعرفة السابقة، مع الحرص علي تشبيه معاني المفاهيم و المصطلحات الحاسوبية المذكورة هنا بأشياء محسوسة من الواقع؛ لتكون الأمور أيسر في الاستيعاب حتي بالنسبة لمن ليست له أية خلفية تقنية قديمة *.
 
 
في البدء: ما هو الحاسوب ؟
 
لتقريب الصورة يمكننا تشبيه الحاسوب بشخص محدود الذكاء و القدرة علي الفهم، و لكنه فائق السرعة في أداء المهمات الموكلة إليه، و يمكنه العمل لفترات طويلة و القيام بالكثير جداً من الأمور بدون الإحساس بالتعب، يعني مثلاً هو لا يستطيع أن يفهم معني جملة "اصنع لي شطيرة من الجبن"، و لكنه يستطيع أن ينفذ التعليمات التالية بمنتهي السرعة و الدقة:
  • أحضر رغيفا من الخبز،
  • أحضر سكيناً حاداً،
  • شق رغيف الخبز إلي نصفين باستخدام السكين،
  • أحضر بعض الجبن،
  • ضع الجبن بين شقي الرغيف،
  • أحضر بعض الخضروات الطازجة،
  • قطِّع الخضروات إلي أجزاء صغيرة باستخدام السكين،
  • ضع الخضروات المقطعة فوق الجبن. 
 
بل و يمكنه تنفيذ جميع الخطوات السابقة أكثر من مرة في الثانية الواحدة بلا كلل و لا ملل، فيكون (رغم عدم فهمه لأهمية ما يقوم به أو الهدف من ورائه) قادراً علي خدمة عشرات الأشخاص، و تجهيز شطائر الجبن الطازجة لهم كلما أرادوا و بالكميات التي يرغبون فيها. و هذا معناه أن القوة الحقيقية للحاسوب ليست في قدرته الخارقة علي الفهم ولا في امتلاكه لذكائه الخاص، بل في قدرته علي إجراء العمليات الطويلة و المعقدة بمنتهي الكفاءة و بمنتهي السرعة، بدون الحاجة لفهم ما يقوم به بأي شكل من الأشكال.
و يمكننا الذهاب في عملية التشبيه بين البشر و الحواسيب إلي مدي أكبر من هذا؛ حيث يمكن تشبيه شاشة الحاسوب بالوجه البشري الذي نطَّلع من خلاله علي التعبيرات المختلفة التي يريد الشخص إيصالها لنا، و أن نشبه لوحة المفاتيح بالعينين التي يري بها الشخص ما نريد كتابته له، بينما السماعات هي فم ذلك الشخص.... إلخ.
 
 
ما هي البرمجة ؟
 
قلنا أن الحاسوب لا يفهم معني جملة "اصنع لي شطيرة من الجبن"، و لكن يجب أن نعلم أيضاً أن الحاسوب مثله مثل الشخص ضعيف الذكاء لا يفهم الأشياء و الكلمات المجردة التي نفهمها نحن البشر، و لذلك سنحتاج في بداية الأمر إلي أن نجعله يفهم ما هو الرغيف و ما هي السكين و ما هو الجبن و ما هي الخضروات؛ ليكون قادراً علي تنفيذ العمليات التي طلبنا منه القيام بها في مجموعة الأوامر السابقة.
 
و يجب أن نحرص هنا علي عدم شرح أي من هذه المعاني أو تسلسل العمليات بشكل خاطئ؛ فالشخص ضعيف الذكاء لن يستطيع معرفة المعلومة الصحيحة من الخاطئة، و لن يستطيع كذلك معرفة الترتيب الصحيح للعمليات التي سيجريها من تلقاء نفسه، و بالتالي سيعتمد علي ما نعطيه إياه من بيانات و ترتيبات للخطوات حتي لو كانت خطأ محضاً، و سيقوم بإجراء العمليات المطلوبة منه بالاعتماد علي البيانات المُعطاة له حتي و إن أدي ذلك إلي حدوث أذي له أو لمن حوله، أو حتي إن أدي إلي مجرد الفشل في إجراء العمليات بشكل صحيح و بالتالي الحصول علي نتائج خاطئة لا يمكن الاعتماد عليها.
 
فكر مثلاً في الحالة التي نقوم فيها بتغيير تسلسل العمليات السابق إلي التالي:
  • شق رغيف الخبز إلي نصفين باستخدام السكين،
  • أحضر رغيفا من الخبز،
  • قطِّع الخضروات إلي أجزاء صغيرة باستخدام السكين،
  • أحضر سكيناً حاداً،
  • ضع الجبن بين شقي الرغيف،
  • ضع الخضروات المقطعة فوق الجبن.
  • أحضر بعض الجبن،
  • أحضر بعض الخضروات الطازجة،
 
من الواضح لنا أن ترتيب الخطوات غير منطقي، و أنه قد تم تقديم بعض الخطوات و تأخير البعض الآخر بما يجعل السياق مختلاً إلي أقصي درجة، و بما أننا كبشر نستوعب هذا الأمر جيداً فإن لنا ميزة القدرة علي إعادة الترتيب إلي الشكل المضبوط، صحيح أن هذه القدرة تختلف في قوتها من شخص إلي آخر و لكنها تظل موجودة في كل البشر ذوي القدرات الذهنية العادية، و لكن بما أن الحاسوب كما قلنا يشبه شخصاً محدود القدرات الذهنية فإنه ليس بإمكانه أن ينتبه إلي الأغلاط التي توجد في التسلسل السابق للأوامر، و هكذا سيقع في حيص بيص حينما يحاول تنفيذ الخطوة الأولي ليجد أنها غير قابلة للتنفيذ من الأصل !
 
و ما شرحناه من كيفية التعامل مع الشخص ضعيف القدرات الذهنية فائق السرعة قليل التعب هو نفسه عملية البرمجة، فقط إذا ما أبعدنا ذلك الشخص و وضعنا محله جهاز الحاسوب؛ حيث سيأخذ الحاسوب مجموعة البيانات و التعريفات التي سيعتمد عليها في عمله، ثم سيقوم بتنفيذ العمليات التي نريدها منه بالترتيب الذي نرغب فيه، و يكرر تنفيذها حسبما نشاء، اعتماداً منه علي التعريفات و البيانات التي وضعناها في ذاكرته.
 
و كل هذا بدون أن يلتفت إلي صحة ما أعطيناه له من بيانات من عدمها، أو حتي صحة التسلسل المنطقي للعمليات التي سيجريها. و يصير من واجب المبرمج أن ينتبه إلي أن التعريفات و العمليات صحيحة و متناسقة و تشكل وحدة منطقية سليمة حسب الأهداف التي يريدها. و إلا حصلنا علي المواقف التي يُطلَق عليها في علوم البرمجة "أغلاط زمن التنفيذ run time exceptions”، أي الأخطاء التي تقع أثناء محاولة الحاسوب تنفيذ مجموعة الأوامر التي كتبناها له لينفذها، بدون أن ننتبه إلي أن بها بعض الخلل المنطقي الذي يجب إصلاحه أولاً لنحصل علي النتيجة التي نرغب فيها.
 
و المختصر المفيد في هذه النقطة أن العملية البرمجية هي مجرد قيام البشر بجعل الحواسيب تُجري الخطوات التي يريد هؤلاء البشر القيام بها بمنتهي السرعة و الدقة، و يقع عبء التحقق من صحة البيانات و تسلسل الأوامر المطلوب تنفيذها علي كاهل البشر لا الحواسيب. لأن البشر يمتلكون الإدراك و الفهم علي عكس الحواسيب التي هي مجرد آلات تُحاكِي أعمال البشر ليس إلا.
 
 
ما هي لغات البرمجة ؟
 
عملية التفاهم بين البشر و تبادل المعلومات و الأوامر فيما بينهم تحتاج للغة تواصل مشتركة تجيدها جميع أطراف النقاش، فمن المستحيل علي شخصين أحدهما لا يتحدث سوي العربية و الآخر لا يتحدث سوي الإنقليزية أن يتفاهما، و لا يمكن الوصول لحالة التفاهم إلا إذا كانت هناك لغة حديث يجيدها كلاهما ليستخدماها في عملية التواصل، و لغة التواصل المشتركة هذه يمكن أن تكون العربية أو الإنقليزية أو الفرنسية أو أي من اللغات البشرية، أو حتي يمكننا تأليف لغة جديدة من خيالنا و تعليمها لهما ليتفاهما بها، فالمهم في النهاية أن الطرفين اللذين يحاولان التفاهم يجيدان لغة مشتركة بينهما تصلح لتبادل المعلومات.
 
و في حالة الفشل في تعليم أي من الطرفين لغة التفاهم المشتركة نلجأ إلي الحل الأخير، و هو توفير مترجم يقوم بتحويل كلام كل طرف إلي اللغة التي يفهمها الطرق الآخر، حتي و إن كان هذا المترجم لا يفهم معني الكلام الذي يترجمه مئة بالمئة (كأن يقوم بترجمة حوار بين اثنين من المتخصصين في مجال لا يفهمه بشكل كبير، فستكون مهمته الرئيسة هنا هي مجرد نقل الكلام من لغة إلي أخري بينما هو لا يدري معني الكلام و لا صحته من خطئه لاختلاف التخصص).
 
و بنفس الشكل فإن التفاهم بين البشر و الحواسيب و تبادل البيانات بينهما يحتاج إلي لغات يفهمها كلاهما، و يمكن من خلالها أن يقوم البشر بجعل الحواسيب تفهم المراد منها لتقوم بتنفيذه، و هذا النوع من اللغات هو ما نطلق عليه وصف "لغات البرمجة". أي أن لغات البرمجة هي طريقة للتواصل بين البشر و الحواسيب بنفس الشكل الذي تعتبر به اللغات البشرية العادية (كالعربية و الإنقليزية) طريقة للتواصل بين البشر.
 
لكن المشكلة أن اللغة التي يفهمها جهاز الحاسب هي لغة تعتمد علي الأرقام بشكل صرف، بل و تتكون أبجديتها من الصفر و الواحد فقط بدون القدرة علي استخدام أية أرقام أخري !، مثل الأمر التخيلي التالي:
 
0010101010110101011110110101
 
الذي يمكن للحاسوب أن يفهمه بسهولة و ينفذه، و لكن كما هو واضح فإن البشر لا يمكنهم فهم معني أوامر الحاسوب المكتوبة بالأصفار و الآحاد بنفس البساطة التي يفهمها بها الحاسوب، و لذلك نشأت لغات البرمجة عالية المستوي، و التي يمكننا أن نستنتج من وصفنا لها بأنها "عالية المستوي" أنها أقرب ما يكون من اللغات التي يتفاهم بها البشر فيما بينهم منها إلي الأصفار و الآحاد التي يفهمها الحاسوب.
 
و في ذلك النوع من لغات البرمجة يمكن أن يكون المكافئ العربي للأصفار و الآحاد التي أوردناها فيما سبق كما يلي (مثال تخيلي لمجرد إيصال المعلومة):
 أكتب "بسم الله الرحمن الرحيم"
 أو كما يلي باللغة الإنقليزية:
write “in the name of allah”
 
أي أننا قمنا بإعطاء الحاسوب أمراً بأن يقوم بكتابة جملة “بسم الله الرحمن الرحيم” علي الشاشة، و لكن أبجديتنا العربية و الإنقليزية يختلفان عن أبجدية الأصفار و الآحاد.
 
و بما أننا وقعنا في مأزق أن كلا الطرفين (البشر و الحواسيب) لا يجيدان لغة تفاهم مشتركة، فإننا نحتاج لوسيط يقوم بالترجمة بين الأبجديات التي يفهمها كلاهما. و هي المهمة التي تقوم بها برامج حاسوبية معينة بمنتهي الدقة و الكفاءة. و يمكننا تشبيه تلك البرامج بأشخاص محدودي القدرات الذهنية و معصوبي الأعين، وظيفتهم الوحيدة هي أن يقوموا بأخذ الأوامر المكتوبة بأبجدية بشرية و أن يستبدلوا بها ما يكافئها من الأصفار و الآحاد، بدون أن يضطروا لفهم معني الكلمات البشرية. ثم بعدها يصير بإمكان الحاسوب أن يفهم معني الأوامر التي أدخلناها إليه لأنه سيتعامل في النهاية مع الأبجدية التي يستوعبها.
 
و من المعلوم أن اللغات البشرية لها قواعد معينة يجب مراعاتها عند استخدام تلك اللغات؛ حتي لا تختلط الأمور علي المتخاطبين بها و يفهم المتلقي معاني غير التي كان القائل يقصد إيصالها، و هكذا تفقد اللغة الهدف الرئيس من ورائها و هو تسهيل التواصل و إيصال المعاني و الأفكار. و بنفس الشكل فإن كل لغة من لغات البرمجة لها قواعد يجب أن يسير المبرمج الذي يستخدم تلك اللغة عليها، و لولا وجود أمثال هذه القواعد لكان من الممكن أن يكتب المبرمج أمراً معيناً للحاسوب فيقوم الأخير بتنفيذ شيء آخر غير الذي أراده المبرمج منه.
 
مثلاً في اللغة العربية تبدأ الجملة الإسمية بمبتدأ ثم خبر:
 
مبتدأ خبر
مثل:
 
البرمجة ممتعة
حيث أن المبتدأ هنا هو "البرمجة"، و الخبر هو "ممتعة"، و وجود هذه القاعدة وفَّر لنا وسيلة مبدئية للحكم علي مدي قابلية الجملة العربية للفهم من عدمها، و ذلك بغض النظر عن صحة ما جاء فيها من معلومات (قد يري البعض أن البرمجة غير ممتعة). و بنفس الشكل فإن تعريف المتغيرات في لغات البرمجة المختلفة يمكن أن يكون له الشكل التالي:
 
نوع المتغير اسم المتغير
 مثل (و هذا مثال بلغة البرمجة العربية "إبداع"):
رقم الرقم
 
حيث قمنا هنا بتعريف متغيرٍ يصلح لحمل القيم الرقمية فقط (شيء يشبه محفظة الجيب التي نحتفظ فيها بالنقود فقط)، و أطلقنا علي ذلك المتغير اسم "الرقم" حتي نستطيع تغيير قيمته أو استخدامها فيما بعد كما نريد. و هذه القاعدة ضمنت لنا أن الحاسوب سوف يطلق اسم "الرقم" علي مكان صغير في ذاكرته، ليخزن فيه القيم الرقمية التي سنتعامل معها في بقية الأوامر، بغض النظر عن استخدامنا لها بشكل صحيح أو بشكل خاطئ فيما بعد.
 
و حينما نجمع كل القواعد الخاصة بلغة بشرية نري أننا نحصل علي "النحو" الخاص بتلك اللغة، و بالمثل نحصل من جمع كل القواعد الخاصة بلغة برمجة معينة علي "المواصفات القياسية" لتلك اللغة البرمجية و التي لها نفس الوظيفة التي لنحو اللغة البشرية، و هي ضبط أسلوب إيصال المعاني و الأوامر بين مستخدمي تلك اللغة.
 
لماذا الأغلبية الساحقة من لغات البرمجة المختلفة مبنية علي الأبجدية الإنقليزية ؟
 
نظراً لأن علم الحوسبة بشكلة الحالي نشأ في الغرب و خصوصاً في الولايات المتحدة الأمريكية، و نظراً لأن الثقافة السائدة حالياً في الغرب هي الثقافة المبنية علي اللغة الإنقليزية (بسبب الاحتلال البريطاني لكثير من أرجاء العالم، و الهيمنة الأمريكية الحالية)، و نظراً لأن معظم الإنتاج العلمي التقني كان و لا يزال يبزغ من هناك (سواءٌ أكان منتجوه غربيين أو غير ذلك) فإنه عند بناء أول اللغات البرمجية اعتماداً علي أبجديات بشرية تم اختيار الأبجدية الإنقليزية ليتم الاشتقاق منها.
بل و لم يكن من الممكن في بداية تصنيع الأجيال الأولي من الحواسيب أن نكتب علي شاشتها أو نخزن في ذاكرتها من الأبجديات البشرية إلا ما يُكتب بتلك الحروف الإنقليزية؛ لأن الرموز التي كانت الحواسيب تفهمها كانت حينها مقصورة علي مجموعة رموزٍ تم جمعها في نظام معياري يعرف بالـascii، و هو يتكون من الحروف الإنقليزية و الأرقام العربية و علامات ترقيم و علامات تحكم فقط.
 
و هذه قائمة ببعض الحروف الأبجدية الإنقليزية و العلامات المختلفة، مع الأصفار و الآحاد التي تمثل كل واحدة منهن في رموز الـ ascii **
 
الحرف أو العلامة
الأصفار و الآحاد المقابلة في نظام الـascii
A
1000001
a
1100001
B
1000010
b
1100010
D
1000100
d
1100100
@
1000000
{
1111101
}
1111011
~
1111110
و بسياسة الأمر الواقع أصبحت الأغلبية الساحقة من لغات البرمجة تستخدم الأبجدية الإنقليزية و الأرقام و علامات الترقيم المختلفة فقط، حتي بعد أن صار من الممكن للحواسيب أن تفهم الرموز غير الإنقليزية (و غير اللاتينية بشكل عام)، بل و حتي و إن كان مصممو تلك اللغات البرمجية و مستخدموها من غير الناطقين باللغة الإنقليزية.
 
علي سبيل المثال هناك لغة برمجة شهيرة للغاية علي المستوي العالمي تسمي Ruby، هذه اللغة صممها عالم حوسبة ياباني يُدعَي "يوكيهيرو ماتسوموتو Yukihiro Matsumoto "، و كانت في سنواتها الأولي غير معروفة إلا في اليابان فقط، و لم يكن يستخدمها ساعتها إلا مبرمجون يابانيون و لم تكون تتوافر لها توثيقات و شروحات إلا باللغة اليابانية، و لكنها و منذ البداية تُكتَب بالأبجدية الإنقليزية و ليس باليابانية.
 
 
إذاً فيمكن برمجة الحاسوب بلغة برمجة مبنية علي أي أبجدية بشرية نرغب في استخدامها ؟
 
هذا صحيح، بل و يمكننا اختراع أي أبجدية نريدها و جعل الحاسوب يفهم التعامل معها؛ ففي النهاية كما أسلفنا الشرح فإن الحاسوب لا يفهم في حقيقة الأمر الأوامر التي نكتبها مباشرة، بل يتم في البداية ترجمة تلك الأوامر إلي الأصفار و الآحاد التي يفهمها ذلك الحاسوب عن طريق برامج الترجمة سالفة الذِكر، و بما أنه يمكننا إنتاج نفس الأصفار و الآحاد اعتماداً علي لغات برمجة ذات أبجديات بشرية مختلفة فإن الحاسوب لا يهتم باللغة التي نستخدمها، و المهم لنجاح تلك العملية هو وجود برنامج للترجمة يمكنه التعامل مع الأبجدية التي نريد الاعتماد عليها و ترجمة ما كُتب بها بشكل صحيح.
 
--------------------------------------------------------
* يمكن تحميل هذا المقال علي هيئة كتيب pdf من الرابط:
 
** يمكن العثور علي قائمة كاملة بمحتويات معيار الـascii علي الرابط:

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

إرسال تعليق