[تطوير وبرمجة]: ما هو المُفسر Interpreter في عالم لغات البرمجة؟
ما هو المفسر؟
لا يستطيع المعالج فهم الشيفرة المصدرية المكتوبة بإحدى لغات البرمجة عالية المستوى (مثل بايثون أو روبي) مباشرةً، فهو يحتاج إلى وسيلة أو آلية تنقل البرنامج من شكله الأصليّ إلى التمثيل الذي يفهمه المعالج، أي البتات الثنائية الممثلة على شكل سلسلةٍ من الأصفار والواحدت. وفي مجال علوم الحاسب، فإنه يمكن استخدام مصطلح “المُفسر Interpreter” للإشارة إلى نمطٍ من البرامج قادر على تحويل الشيفرة المصدرية إلى تعليماتٍ تنفيذية يستطيع المعالج فهمها وتنفيذها.
- اقرأوا أيضاً: مقدمة في لغات البرمجة
يُعتبر المفسر جزءاً من نظام معالجة لغات البرمجة Language Processing System والذي يتضمن برامج أخرى مثل المترجم Compiler والمجمع Assembler. ما يتميّز به المفسر هو قيامه بتحويل الشيفرة المصدرية (أي البرنامج) من شكله المكتوب بإحدى لغات البرمجة عالية المستوى إلى تعليماتٍ تنفيذية للمعالج بشكلٍ مباشر، أي أن المفسر يقرأ الشيفرة المصدرية تعليمةً تلو الأخرى، ويقوم فوراً بتحليل التعلمية للبحث عن أي خطأ فيها ومن ثم تنفيذها ومن ثم الانتقال للتعليمة التالية، بخلاف المترجم الذي يقوم بتحليل كامل الشيفرة المصدرية والتعليمات التي تتضمنها ومن ثم توليد البرنامج التنفيذي القابل للتشغيل من قبل المعالج.
- اقرأوا أيضاً: ما هو المترجم في لغات البرمجة؟
يعتمد المفسر عادةً على عدة طرق أو أساليب من أجل تنفيذ البرامج:
- تفسير الشيفرة المصدرية وتنفيذها مباشرةً
- ترجمة الشيفرة المصدرية إلى تمثيلٍ وسيط أكثر كفاءة ومن ثم تنفيذ تعليمات التمثيل الوسيط: يعتبر هذا الأسلوب هو الأكثر انتشاراً في الوقت الحاليّ بالنسبة للغات البرمجة المفسرّة وهو مستخدم في لغات بيرل، بايثون، روبي وماتلاب.
- القيام بتنفيذ الخرج الناتج عن شيفرةٍ مصدرية مترجمة، وبهذه الحالة يمكن النظر للمعالج نفسه على أنه مفسر يقوم بتنفيذ تعليمات لغة الآلة واحدةً تلو الأخرى
كيف يعمل المفسر؟ مثال من لغة بايثون
تعتبر لغة بايثون Python إحدى أشهر لغات البرمجة المستخدمة في الوقت الحاليّ وفي مجالاتٍ مختلفة، وهي بدورها تمتلك عدة أشكال من حيث كيفية تنفيذها، وأشهر هذه الأشكال هو نموذج سي-بايثون CPython المعتمد على مكاتب من لغة سي البرمجية. من ناحيةٍ أخرى، تعتبر لغة بايثون أشهر مثالٍ على لغات البرمجة المفسرة. يتطلب تشغيل وتنفيذ البرامج باستخدام بايثون أمرين أساسيين: وجود مفسر اللغة بالإضافة إلى مكتبات الدعم Support Libraries التي توّفر مرجعاً يمكن استخدامه لجلب توابع أو مودودلات مضمنة أو ثوابت أو أنماط معطيات والتي تستخدم جميعها أثناء عملية التفسير بهدف التنفيذ الصحيح للتعليمات.
ببساطة، فإنه يمكن فهم عملية تنفيذ البرامج المكتوبة بلغة بايثون سيتم توليد تمثيلٍ وسيط يعرف باسم شيفرة البايت Bytecode، والتي تستخدم مجدداً من قبل برنامجٍ آخر هو آلة بايثون الافتراضية Python Virtual Machine لتحويلها لتعليماتٍ تنفيذية يستخدمها المعالج.
بشكلٍ عام، يمكن تقسيم عملية تفسير النصوص البرمجية في لغة بايثون إلى الأقسام التالية:
التحقق القواعدي والترجمة Syntax Checking and Translation: يبدأ المفسر عمله عبر قراءة النص البرمجيّ المكتوب بلغة بايثون ومن ثم يتأكد من أن التعليمة البرمجية مكتوبة بشكلٍ صحيح من الناحية القواعدية للغة، وفي حال اكتشاف خطأ ما أثناء هذه الخطوة سيتم إيقاف العملية وعرض رسالة خطأ حول المشكلة المكتشفة. في حال صحة التعليمة سينتقل المفسر إلى الخطوة التالية. في مفسرات لغة بايثون المبنية على معيار CPython، فإن هذه المرحلة تتضمن الخطوات التالية:
- تشكيل شجرة التفسير Parse Tree الخاصة بالتعليمة (أو مجموعة التعليمات) من الشيفرة المصدرية.
- تحويل شجرة التفسير إلى الشجرة القواعدية المجردة AST: Abstract Syntax Tree والتي توفر تمثيلاً عالي المستوى لشجرة التفسير يتيح فهم التعليمات المتواجدة ضمنها ولكن بتفاصيل أقل.
- توليد مخطط التحكم التدفقي Control Flow Graph والتي توفر تمثيلاً يعتمد على مفهوم المخططات للتعليمة، وتتضمن كل كتلة ضمن هذا المخطط تعليمات البرنامج ممثلةً باستخدام شيفرة البايت.
توليد شيفرة البايت Bytecode Generation: بعد التحقق من صحة التعليمة وتشكيل المخطط التحكم التدفقي يقوم المفسر بتوليد تمثيلٍ وسيط يُعرف باسم شيفرة البايت والتي تتميز بكونها أعلى كفاءة من التعليمة (أو مجموعة التعليمات) في الشيفرة المصدرية المكتوبة بلغة بايثون، كما أنها غير مرتبطة بنوع المعالج أو نظام التشغيل المستخدم.
آلة بايثون الافتراضية PVM: Python Virtual Machine: بهذه المرحلة يتم فعلياً تنفيذ التعليمات في البرنامج بعد أن تم تحويلها لتمثيل شيفرة البايت.
من المهم فهم أمرٍ هام، وهو أن عملية التحقق القواعدي والترجمة وتوليد شيفرة البايت هي مهامٌ يقوم بها مترجم Compiler خاص بالمفسر، ولكن وبخلاف الوظيفة التقليدية للمترجم المتمثلة بمسح كامل الشيفرة المصدرية ومن ثم توليد شيفرة لغة الآلة، يقوم المترجم الخاص بمفسر لغة بايثون بمسح التعليمات وإجراء عمليات التحقق ومن ثم توليد تمثيلٍ وسيط يستخدم لاحقاً من قبل برنامجٍ آخر هو آلة بايثون الافتراضية لتنفيذ البرنامج.
خلاصة : المفسر ووظائفه
المفسر عبارة عن وسيلة تساعد على تحويل النص البرمجيّ لشكلٍ تنفيذيّ، وعند استخدامه يتم وصف لغة البرمجة المعتمدة عليه على أنها “مفسرة Interpreted”، بخلاف اللغات المعتمدة على المترجمات والتي تعرف على أنها “مترجمة Compiled”. يمكن تلخيص المفسر ووظائفه عبر النقاط التالية:
- تحويل الشيفرة المصدرية للبرنامج من لغةٍ عالية المستوى إلى شكلٍ تنفيذيّ سطراً تلو الآخر وخلال زمن التنفيذ Run Time
- لا يقوم المفسر بتحليل كامل الشيفرة المصدرية وتحسينها ومن ثم تنفيذها (مثل المترجمات)
- عمليات تحسين البرنامج والكشف عن الخطأ تتم خلال تنفيذه
- توّفر المفسرات زمناً أقصر لتحليل ومعالجة الشيفرة المصدرية
- توّفر المفسرات زمناً أطول من ناحية زمن تنفيذ البرنامج
مصادر أخرى للاطلاع
تم الاعتماد على بعض المقالات والمصادر المفيدة من أجل كتابة هذه المقال والتي من شأنها توفير معلومات إضافية حول المفسرات وعملها والفرق بينها وبين المترجمات:
4 تعليقات