قلتُ في المقال السابق إنّ البرنامج تعليماتٌ مجمّدةٌ في ملفّات، وأنّ المبرمج يفكّر مرّةً فتعمل فكرته إلى الأبد. لكنّي أجّلتُ سؤالًا: كيف تتحوّل فكرةٌ في رأس إنسانٍ إلى تعليماتٍ ينفّذها المعالج؟ المبرمج يكتب بلغةٍ تشبه لغته، والمعالج لا يفهم إلّا الأصفار والآحاد. بينهما هوّةٌ سحيقة. من يعبرها؟ وما الذي يجري فعلًا في اللحظة التي «يعمل» فيها البرنامج؟
في هذا المقال تعبر هذه الهوّة خطوةً خطوة. تفهم لغة الآلة التي لا يفهم المعالج سواها، ولماذا لا يُكتَب بها مباشرةً، واللغات عالية المستوى التي يُكتَب بها فعلًا. ثمّ تلتقي الجسرين اللذين يترجمان بينهما: المترجم والمفسّر، وطريقًا ثالثًا وسطًا. وأخيرًا تفهم ما يعنيه «يعمل» البرنامج حقًّا، وماذا يحدث في جهازك اللحظة التي تنقر فيها أيقونةً فيدبّ فيها الحياة.
الهوّة: إنسانٌ وآلة
المبرمج إنسانٌ يفكّر بالمعاني والأفكار: «اجمع هذين الرقمين»، «إن كان المستخدم مسجّلًا فأظهر له صفحته». والمعالج آلةٌ لا تفهم معنًى ولا فكرة، بل تيّاراتٍ كهربائيّةً تمثّل أصفارًا وآحادًا، كما مرّ بك في مقال المعالج ومقال النظام الثنائيّ. هذه هوّةٌ حقيقيّة: طرفٌ يفكّر بلغةٍ إنسانيّةٍ غنيّةٍ بالمعاني، وطرفٌ لا يعرف إلّا نبضاتٍ كهربائيّةً صمّاء. كيف يتفاهمان؟
الجواب في سلسلةٍ من الترجمات تنزل بالفكرة الإنسانيّة درجةً درجةً حتّى تصير نبضاتٍ يفهمها المعالج. لا تُترجَم الفكرة دفعةً واحدة، بل عبر طبقاتٍ من اللغات، كلّ طبقةٍ أقرب إلى الآلة من التي فوقها. فهم هذه الطبقات هو فهم كيف يعمل كلّ برنامجٍ صنعه إنسان، ولماذا اختُرِعت لغات البرمجة أصلًا: لتكون سلالم تعبر بها هذه الهوّة.
لغة الآلة: ما يفهمه المعالج وحده
في قاع كلّ شيء لغةٌ واحدةٌ يفهمها المعالج مباشرةً: لغة الآلة. هي تعليماتٌ في صورةٍ ثنائيّةٍ صرفة، سلاسل من الأصفار والآحاد، كلّ سلسلةٍ تأمر المعالج بعمليّةٍ بالغة البساطة: انقل هذا الرقم إلى ذلك المسجّل، اجمع هذين، قارن، اقفز إلى تعليمةٍ أخرى. لا أكثر. المعالج لا يفهم غير هذه الأوامر البدائيّة، لكنّه ينفّذها بمليارات المرّات في الثانية، فتتراكم لتصنع كلّ ما تراه.[1]
هذه اللغة خاصّةٌ بكلّ عائلة معالجات. تعليمات معالجٍ من نوعٍ تختلف عن معالجٍ من نوعٍ آخر، كما مرّ بك في مقال المعالج عند الحديث عن معماريّتي x86 وARM. لهذا برنامجٌ تُرجِم إلى لغة آلةٍ لمعالجٍ لا يعمل على معالجٍ بلغةٍ مختلفة، وهو جزءٌ من سبب أنّ برنامج ويندوز للحواسيب قد لا يعمل على هاتفٍ حتّى لو تشابه النظام. لغة الآلة هي الأرض الصلبة التي ينتهي إليها كلّ برنامج.
لماذا لا نكتب بالثنائيّ؟
قد تسأل: ما دام المعالج يفهم الثنائيّ، فلماذا لا تُكتَب البرامج به مباشرةً؟ الجواب أنّ ذلك جُرِّب في فجر الحوسبة، وكان عذابًا. تخيّل كتابة برنامجٍ كاملٍ كسلاسل من الأصفار والآحاد، تحفظ رموز كلّ تعليمةٍ عن ظهر قلب، وخطأٌ في رقمٍ واحدٍ يفسد كلّ شيء دون أن تدري أين. برامج بدائيّةٌ صغيرةٌ كانت تأخذ أيّامًا، وتصحيح خطأٍ فيها كابوس.
ثمّ جاءت لغة التجميع، خطوةً أرحم قليلًا: استبدلت بالأرقام الثنائيّة رموزًا مختصرةً تشبه الكلمات، فصار المبرمج يكتب رمزًا يعني «اجمع» بدل سلسلة أصفارٍ وآحاد. لكنّها بقيت قريبةً من الآلة، مرهقةً بطيئة. الحاجة كانت إلى قفزةٍ أكبر: لغةٍ يكتب بها الإنسان بمعانيه هو، لا بلغة الآلة، ثمّ تتكفّل أداةٌ بترجمة ما كتبه إلى ما يفهمه المعالج. من هذه الحاجة وُلِدت اللغات عالية المستوى.
وصاحبة الفضل الأولى في هذه الفكرة عالمةٌ اسمها غريس هوبر، التي بنت في خمسينات القرن الماضي أوّل مترجمٍ يحوّل لغةً أقرب للإنسان إلى لغة الآلة. كانت الفكرة ثوريّةً حينها: أن تكتب بكلماتٍ مفهومة، وتتكفّل الآلة نفسها بترجمتها إلى تعليماتها. سخر منها بعضهم أوّلًا، ظانّين أنّ الحاسوب لا يفهم إلّا الأرقام. لكنّ فكرتها فتحت الباب لكلّ لغات البرمجة التي تعرفها، وحوّلت البرمجة من حرفةٍ لقلّةٍ إلى صناعةٍ للعالم.
اللغات عالية المستوى
اللغة عالية المستوى لغةٌ صُمّمت ليكتب بها الإنسان بيسر، قريبةٌ من لغته ومنطقه، بعيدةٌ عن تفاصيل الآلة. فيها كلماتٌ مأخوذةٌ من الإنجليزيّة، وتعبيراتٌ منطقيّةٌ مفهومة: «إن كان» و«كرّر» و«اطبع». المبرمج يكتب فكرته بهذه اللغة في ملفٍّ نصّيٍّ اسمه الشيفرة المصدريّة، دون أن يشغل باله بكيفيّة تنفيذها في العتاد. يفكّر في «ماذا» يريد، لا في «كيف» ينفّذه المعالج بالتفصيل.[3]
وكلّما ارتفع مستوى اللغة، ابتعدت عن الآلة واقتربت من الإنسان، فصارت أسهل في الكتابة لكن أبعد عن التحكّم الدقيق بالعتاد. ولكلّ لغةٍ غايتها: لغةٌ للأنظمة تحتاج قربًا من العتاد وسرعةً قصوى، وأخرى للمواقع، وثالثةٌ سهلةٌ للمبتدئين وعلوم البيانات. هذا التنوّع الهائل في لغات البرمجة ليس ترفًا، بل لأنّ لكلّ مجالٍ حاجاتٍ تناسبها لغةٌ أكثر من غيرها. لكنّها جميعًا تشترك في أنّها تحتاج ترجمةً إلى لغة الآلة قبل أن تعمل.
سلّم التجريد
تخيّل سلّمًا: في أعلاه فكرة المبرمج بالمعاني، وفي أسفله نبضات الكهرباء في المعالج. اللغة عالية المستوى قريبةٌ من القمّة، ولغة التجميع في الوسط، ولغة الآلة في القاع. كلّ درجةٍ ترجمةٌ للتي فوقها إلى صورةٍ أقرب للآلة. البرنامج ينزل هذا السلّم كلّه، من فكرةٍ إنسانيّةٍ إلى كهرباءٍ تسري، عبر خطواتٍ آليّةٍ يقوم بها ما يأتي بيانه الآن من أدوات.
وجمال هذا السلّم أنّه يخفي التعقيد طبقةً طبقة، كما رأيتَ في طبقات البرمجيّات ونظام التشغيل. المبرمج في الأعلى لا يحتاج أن يعرف لغة الآلة، لأنّ الأدوات تترجم له. وهذا هو ما جعل البرمجة ممكنةً لملايين البشر: لولا هذه السلالم، لبقيت حكرًا على قلّةٍ تكتب بالثنائيّ. سلّم التجريد هو ما فتح باب صناعة البرمجيّات للعالم كلّه.
الجسر الأوّل: المترجم
الأداة الأولى التي تعبر الهوّة هي المترجم (Compiler). يأخذ الشيفرة المصدريّة كاملةً، ويحوّلها دفعةً واحدةً إلى لغة آلةٍ جاهزةٍ للتنفيذ، فينتج ملفًّا تنفيذيًّا كالذي مرّ بك، يحمل التعليمات الثنائيّة مباشرة. هذا الملفّ صار مستقلًّا: تشغّله فيعمل فورًا دون حاجةٍ إلى المترجم مرّةً أخرى. الترجمة تمّت مرّةً وقت الصنع، والمعالج ينفّذ الناتج مباشرةً بأقصى سرعة.[2]
ميزة المترجم الكبرى السرعة. لأنّ الترجمة تمّت مسبقًا، يعمل البرنامج الناتج بأقصى ما يقدر عليه العتاد، دون وسيطٍ يبطّئه وقت التشغيل. لهذا تُكتَب أنظمة التشغيل والألعاب والبرامج التي تحتاج أداءً عاليًا بلغاتٍ تُترجَم. عيبه أنّ الناتج مرتبطٌ بنوع المعالج والنظام الذي تُرجِم له، فتحتاج ترجمةً منفصلةً لكلّ منصّة، وهو ما يفسّر وجود نسخٍ مختلفةٍ من البرنامج الواحد لكلّ نظام، كما رأيتَ في مقال الأنظمة.
الجسر الثاني: المفسّر
الأداة الثانية المفسّر (Interpreter)، وطريقته مختلفة. لا يترجم البرنامج كاملًا مسبقًا، بل يقرأ الشيفرة المصدريّة ويترجمها وينفّذها تعليمةً تلو الأخرى، لحظة التشغيل. كلّ مرّةٍ تشغّل فيها البرنامج، يعيد المفسّر قراءته وترجمته سطرًا سطرًا. فلا ملفّ تنفيذيٌّ جاهزٌ هنا، بل شيفرةٌ مصدريّةٌ يقرؤها وسيطٌ ويحوّلها إلى فعلٍ في اللحظة، ثمّ ينتقل للسطر التالي.[2]
ميزة المفسّر المرونة وسهولة التطوير. تعدّل سطرًا وتشغّل فورًا لترى النتيجة، دون انتظار ترجمةٍ كاملةٍ في كلّ مرّة، وهو ما يسرّع التجريب والتعلّم. والشيفرة نفسها تعمل على أيّ جهازٍ فيه المفسّر المناسب، دون ترجمةٍ لكلّ منصّة. عيبه أنّه أبطأ في التنفيذ، لأنّ الترجمة تجري لحظة التشغيل في كلّ مرّة، فيقف وسيطٌ بين الشيفرة والمعالج يستهلك وقتًا. سرعةٌ مقابل مرونة: تلك هي المفاضلة.
البناء: أكثر من مجرّد ترجمة
تحويل الشيفرة إلى برنامجٍ يعمل ليس خطوةً واحدة، بل عمليّةً تسمّى «البناء». بعد أن يترجم المترجم شيفرتك إلى لغة الآلة، تأتي خطوةٌ اسمها الربط: يجمع برنامجك مع المكتبات الجاهزة التي استعملها، فيصير كلٌّ منها جزءًا من الملفّ التنفيذيّ النهائيّ أو مرتبطًا به. برنامجٌ صغيرٌ في شيفرته قد ينتفخ ملفّه التنفيذيّ لأنّه يحمل معه أجزاءً من مكتباتٍ كثيرةٍ يعتمد عليها ليعمل مستقلًّا.
لهذا قد يأخذ بناء برنامجٍ كبيرٍ دقائق أو ساعات، لا لحظات. فالمترجم يفحص ملايين السطور، ويحسّنها ليعمل الناتج أسرع، ويربط عشرات المكتبات، ويولّد الملفّ النهائيّ. هذه العمليّة الثقيلة تجري مرّةً عند صنع البرنامج، لا في كلّ تشغيل، وهي جزءٌ من سبب أنّ البرامج المترجمة سريعةٌ وقت التشغيل: كلّ العمل الثقيل تمّ مسبقًا في البناء، فلم يبقَ للمعالج إلّا التنفيذ.
حين يخطئ المبرمج
الأخطاء في البرمجة نوعان. الأوّل خطأٌ في القواعد، كأن ينسى المبرمج علامةً أو يكتب كلمةً بلغة البرمجة خطأً. هذا يكشفه المترجم أو المفسّر فورًا ويرفض المتابعة، كمن يكتب جملةً بنحوٍ فاسدٍ فلا تُفهَم. سهلٌ نسبيًّا لأنّ الأداة تدلّك على موضعه. والثاني أخبث: خطأٌ في المنطق، حيث تكون القواعد سليمةً لكنّ البرنامج يفعل غير ما قصده كاتبه، كوصفةٍ صحيحة الصياغة لكنّها تعطي طبقًا خاطئًا.
ومطاردة هذه الأخطاء تسمّى التنقيح، وهي جزءٌ كبيرٌ من عمل المبرمج، أكبر أحيانًا من الكتابة نفسها. يستعمل أدواتٍ تتيح له إيقاف البرنامج ومراقبة ما يجري بداخله سطرًا سطرًا ليجد أين انحرف عن قصده. من هنا جاء اسم العيب البرمجيّ «حشرة»: يُروى أنّ عطلًا في حاسوبٍ مبكّرٍ سببته حشرةٌ حقيقيّةٌ علقت فيه، فصار كلّ عيبٍ يُسمّى حشرة، وإصلاحه إزالةً للحشرات.
الطريق الثالث: اللغة الوسيطة
بين المترجم السريع والمفسّر المرن وُلِد طريقٌ ثالثٌ يجمع حسناتهما. تُترجَم الشيفرة أوّلًا إلى لغةٍ وسيطةٍ ليست لغة آلةٍ لمعالجٍ بعينه، بل صيغةٌ مضغوطةٌ عامّة. ثمّ يشغّلها على كلّ جهازٍ برنامجٌ خاصٌّ اسمه الآلة الافتراضيّة، يترجم هذه اللغة الوسيطة إلى لغة آلة الجهاز الذي يعمل عليه. فتُكتَب الشيفرة وتُترجَم إلى الوسيطة مرّةً، ثمّ تعمل على أيّ جهازٍ فيه آلته الافتراضيّة.
هذا النموذج يعطي قابليّة العمل على كلّ المنصّات كالمفسّر، مع أداءٍ أقرب إلى المترجم، لأنّ جزءًا من العمل تمّ مسبقًا. لغاتٌ شهيرةٌ كجافا وسي شارب تعمل هكذا، وهو ما يجعل برنامجًا واحدًا يعمل على ويندوز وماك ولينكس دون تغيير، شرط وجود آلته الافتراضيّة على كلٍّ. هذا الطريق الوسط من أكثر النماذج انتشارًا اليوم، لأنّه يوازن بين السرعة والمرونة والقابليّة للنقل في آنٍ واحد.
وطوّرت الآلات الافتراضيّة حيلةً أذكى اسمها الترجمة اللحظيّة: بدل تفسير الشيفرة الوسيطة سطرًا سطرًا في كلّ مرّة، تترجم الأجزاء كثيرة الاستعمال إلى لغة آلةٍ مباشرةٍ أثناء التشغيل، فتصير سريعةً كالمترجمة تمامًا. هكذا يجمع البرنامج بين مرونة العمل على كلّ منصّة وسرعةٍ تقترب من المترجم في الأجزاء الحرجة. هذه التقنيّة سرّ أنّ لغاتٍ كانت تُعدّ بطيئةً صارت اليوم سريعةً بما يكفي لتطبيقاتٍ ثقيلة.
ماذا يعني «يعمل» البرنامج؟
وهنا قلب السؤال. حين يُقال إنّ البرنامج «يعمل»، ماذا يجري فعلًا؟ يجري ما مرّ بك في مقال المعالج بالتفصيل: دورةٌ لا تتوقّف اسمها الجلب والفكّ والتنفيذ. المعالج يجلب التعليمة التالية من الذاكرة، ويفكّ رمزها ليعرف ما تطلبه، وينفّذها، ثمّ ينتقل إلى التي تليها، ويكرّر هذا مليارات المرّات في الثانية. «تشغيل البرنامج» ليس إلّا هذه الدورة تجري على تعليماته واحدةً تلو الأخرى.
فالبرنامج العامل ليس شيئًا حيًّا غامضًا، بل قائمة تعليماتٍ يقرؤها المعالج وينفّذها بالترتيب، يقفز بينها حسب الشروط، ويكرّر ما يجب تكراره. كلّ ما يفعله جهازك، من عرض هذه الكلمات إلى تشغيل لعبةٍ ثلاثيّة الأبعاد، هو في النهاية هذه الدورة البسيطة تتكرّر بسرعةٍ خياليّةٍ على تعليماتٍ كثيرة. البساطة في الأصل، والعجب في السرعة والكمّ.
ماذا يحدث حين تنقر أيقونة؟
لنجمع خيوط السلسلة كلّها في لحظةٍ واحدة: نقرة على أيقونة برنامج. أوّلًا يتلقّى نظام التشغيل نقرتك، فيعرف أيّ برنامجٍ تريد. يذهب إلى نظام الملفّات فيجد ملفّ البرنامج على القرص. يقرأ تعليماته وينسخها من القرص البطيء إلى الذاكرة العشوائيّة السريعة. ينشئ له عمليّةً ويخصّص لها ذاكرتها كما مرّ بك في مقال النظام. ثمّ يوجّه المعالج إلى أوّل تعليمةٍ في البرنامج.
ومن تلك اللحظة تبدأ دورة الجلب والفكّ والتنفيذ تجري على تعليمات البرنامج، فيظهر على شاشتك حيًّا يستجيب لك. كلّ ما تعلّمتَه في السلسلة اجتمع في هذه الثانية: الملفّ، ونظام الملفّات، والقرص، والذاكرة، ونظام التشغيل، والمعالج، والإدخال والإخراج، تعاونت كلّها لتحوّل أيقونةً جامدةً إلى برنامجٍ نابض. ما بدا نقرةً بسيطةً كان في الحقيقة سيمفونيّةً منظّمةً عزفتها كلّ طبقات جهازك في لحظة.
المكتبات: لا تبنِ كلّ شيءٍ من الصفر
مسألةٌ أخيرةٌ تكمّل الصورة. المبرمج لا يكتب كلّ برنامجٍ من الصفر. فمهامّ كثيرةٌ متكرّرةٌ حلّها آخرون قبله وأتاحوا حلولهم في «مكتبات»: مجموعاتٌ جاهزةٌ من الشيفرة تؤدّي وظائف شائعة، يستدعيها المبرمج بدل أن يكتبها. من يريد عرض صورةٍ أو حساب تاريخٍ أو إرسال بياناتٍ عبر الشبكة، يجد مكتبةً تفعل ذلك، فيبني عليها بدل أن يعيد اختراع العجلة في كلّ مرّة.
لهذا صار بناء البرمجيّات الحديثة أشبه بتركيب قطعٍ جاهزةٍ ذكيّةٍ أكثر من كتابة كلّ شيءٍ حرفًا حرفًا. برنامجٌ تستعمله قد يقوم على عشرات المكتبات كتبها آلافٌ لا يعرفهم صانعه. هذا التعاون التراكميّ هو ما سرّع تطوّر البرمجيّات هذا التسارع المذهل: كلّ جيلٍ يبني على ما تركه سابقوه، فلا يبدأ من الصفر. لكنّه يخلق أيضًا اعتمادًا متشابكًا، فعيبٌ في مكتبةٍ واحدةٍ قد يمسّ آلاف البرامج التي تستعملها.
وفوق المكتبات طبقةٌ أوسع اسمها الأطر: هياكل جاهزةٌ تعطي المبرمج بنيةً كاملةً يبني داخلها، لا مجرّد وظائف متفرّقةٍ يستدعيها. المكتبة أداةٌ تستعملها كما تشاء، والإطار بيتٌ تسكن فيه وتؤثّث غرفه بما تريد ضمن تصميمه. الأطر تسرّع بناء التطبيقات الكبيرة كثيرًا، لأنّها تحلّ المشكلات الشائعة سلفًا، فيركّز المبرمج على ما يميّز تطبيقه لا على إعادة بناء الأساسات في كلّ مرّة.
كيف تتخاطب البرامج؟
لا تعمل البرامج في عزلة، بل يتخاطب بعضها مع بعضٍ عبر ما يسمّى واجهة البرمجة، أو الـAPI. هي عقدٌ متّفقٌ عليه: يعلن برنامجٌ أو خدمةٌ عن مجموعة طلباتٍ يقبلها وما يردّ به عليها، فيستطيع برنامجٌ آخر أن يستعملها دون أن يعرف كيف تعمل من الداخل. حين يعرض تطبيقٌ الطقس، فهو غالبًا يطلبه من خدمة طقسٍ عبر واجهتها البرمجيّة، ثمّ يعرض ما ردّت به، دون أن يقيس الطقس بنفسه.
هذه الفكرة هي ما يجعل عالم البرمجيّات الحديث متشابكًا متعاونًا. تطبيقٌ يستعمل خرائط شركةٍ، ودفع شركةٍ أخرى، وتسجيل دخولٍ بحساب ثالثة، كلٌّ عبر واجهته البرمجيّة، فيبني المطوّر تطبيقًا غنيًّا دون أن يصنع كلّ خدمةٍ بنفسه. الواجهة البرمجيّة هي نداء النظام الذي مرّ بك، لكن موسّعًا: لا بين البرنامج والنظام فقط، بل بين برنامجٍ وآخر، وبين جهازك وخدماتٍ في أنحاء العالم.
لماذا تنهار البرامج؟
حين ينهار برنامجٌ فجأةً ويُغلَق، فغالبًا لأنّه بلغ حالةً لم يتوقّعها كاتبه: طلب بياناتٍ غير موجودة، أو حاول قسمةً على صفر، أو أراد ذاكرةً لا يملكها. عند مثل هذه اللحظة، يوقف النظام العمليّة حمايةً، كما مرّ بك في مقال نظام التشغيل عند الحديث عن العزل. الانهيار في جوهره اصطدام البرنامج بحالةٍ خارج ما حسب له، فيعجز عن المتابعة بأمان، فيتوقّف بدل أن يتصرّف تصرّفًا فاسدًا. ولهذا حين ينهار برنامجٌ مرّةً بعد فعلٍ معيّن ثمّ يتكرّر مع الفعل نفسه، فأنت أمام عيبٍ منطقيٍّ في مكانٍ محدّد، لا عطلٍ عشوائيّ، وهذه ملاحظةٌ تفيد من يبلّغ عن العيب أو يبحث عن حلّ.
الويب منصّةً للبرامج
ومن أهمّ ما جرى في العقود الأخيرة أنّ المتصفّح صار منصّةً كاملةً لتشغيل البرامج، لا مجرّد عارض صفحات. صفحات الويب اليوم تحمل شيفرةً تعمل داخل متصفّحك، يفسّرها كأيّ مفسّر، فتصير الصفحة تطبيقًا حيًّا يتفاعل معك: بريدٌ، ومحرّر مستنداتٍ، ولعبةٌ، كلّها تعمل في المتصفّح دون تثبيت. هذا ما يجعل تطبيق الويب الذي مرّ بك في مقال الهواتف يعمل على أيّ نظامٍ فيه متصفّح.
وهذا حلٌّ أنيقٌ لمشكلة اختلاف الأنظمة التي رأيتَها. بدل أن تكتب نسخةً لكلّ نظام، تكتب تطبيقًا واحدًا يعمل في المتصفّح، والمتصفّح موجودٌ على كلّ نظام. لهذا هاجرت برامج كثيرةٌ إلى الويب، وصار المتصفّح أكثر ما تقضي فيه وقتك. المتصفّح في هذا المعنى نظام تشغيلٍ صغيرٌ داخل نظامك، يشغّل تطبيقاتٍ ويديرها، وهو من أهمّ برمجيّاتٍ على جهازك اليوم بلا منازع.
جرّبه بنفسك
لترى الفرق بين الشيفرة المقروءة ولغة الآلة بعينك، جرّب هذا في متصفّحك: افتح أيّ موقعٍ، ثمّ اطلب «عرض مصدر الصفحة» من قائمة المتصفّح. ستظهر لك شيفرة الصفحة المصدريّة، مكتوبةً بلغةٍ يفهمها البشر نسبيًّا، وهي التي يفسّرها متصفّحك ليعرض لك ما تراه. هذه لغةٌ عالية المستوى للويب، يقرؤها المتصفّح بوصفه مفسّرًا، ويحوّلها إلى الصفحة المنسّقة أمامك. تأمّلها قليلًا: سترى وسوم العناوين والفقرات والصور، وربّما شيفرةً تتحرّك وتتفاعل، وكلّها نصٌّ مقروءٌ يترجمه متصفّحك إلى ما تراه لحظةً بلحظة.
ثمّ افعل العكس: افتح ملفًّا تنفيذيًّا بامتداد .exe بمحرّر نصوصٍ عاديّ، كما جرّبتَ في مقال الملفّات. سترى خليطًا عشوائيًّا من الرموز لا معنى له لعينك، لأنّه لغة آلةٍ ثنائيّةٌ لا نصٌّ للقراءة. الفرق بين الملفّين صارخ: الأوّل شيفرةٌ مصدريّةٌ يقرؤها الإنسان، والثاني ناتج ترجمتها إلى لغة الآلة. رأيت بعينك طرفي السلّم الذي مرّ بك.
من التنفيذ إلى الاقتناء
عبرتَ الهوّة بين الإنسان والآلة: من فكرةٍ بالمعاني، إلى شيفرةٍ بلغةٍ عالية المستوى، تترجمها أداةٌ إلى لغة الآلة، فينفّذها المعالج في دورة جلبٍ وفكٍّ وتنفيذٍ لا تتوقّف. وفهمتَ الفرق بين المترجم والمفسّر واللغة الوسيطة، وماذا يحدث فعلًا حين تنقر أيقونة. صار «تشغيل البرنامج» عندك مكشوفًا، لا لحظةً سحريّةً غامضة.
لكن كيف يصل هذا البرنامج إلى جهازك أصلًا؟ من أين تجلبه بأمان، وكيف تثبّته، وكيف تبقيه محدّثًا سليمًا، وكيف تزيله نظيفًا حين تنتهي منه؟ هذه أسئلةٌ عمليّةٌ تلمسها كلّ يوم، وفيها فخاخٌ كثيرةٌ يقع فيها الناس. المقال القادم دليلٌ عمليٌّ لاقتناء البرمجيّات وتحديثها بأمان، ينتقل بك فيه من فهم كيف تعمل البرمجيّات إلى كيف تتعامل معها بحكمةٍ وأمان في حياتك اليوميّة.
المصادر
- ويكيبيديا، «لغة الآلة» (لغة الآلة تعليماتٌ ثنائيّةٌ ينفّذها المعالج مباشرةً، وخصوصيّتها بكلّ معماريّة معالج). ↩
- حسوب I/O، «الفرق بين Compiler و Interpreter» (المترجم يحوّل الشيفرة كاملةً مسبقًا، والمفسّر يترجمها وينفّذها سطرًا سطرًا وقت التشغيل، ومفاضلة السرعة والمرونة). ↩
- e3arabi، «ما الفرق بين المترجم والمفسّر؟» (الشيفرة المصدريّة عالية المستوى تحتاج ترجمةً إلى لغة الآلة، ودور كلٍّ من المترجم والمفسّر في ذلك). ↩