1/3/2012 - نظره على الأجهزة الظاهرية Virtual Machine




مرحباً بالجميع، ما هو موضوعنا اليوم؟ حسناً لنتحدث عن الأجهزه الظاهريه (Virtual Machines) :)، إذا ألقينا نظرة على عالم الحوسبة سنجد ذكراً للأجهزة الظاهرية في عدد من المواضيع مثلاً لغات البرمجة، نُظم التشغيل، لا بد و اننا جميعاً قد سمعنا بجهاز جافا الظاهري (Java Virtual Machine) او جهاز مايكروسوفت CLR، او حتى إستخدمنا البرامج التي تُشغّل لنا نظام تشغيل آخر أثناء عملنا على نظام التشغيل الأساسي المُثبت على الحاسوب، جميع هذه الأمثله عبارة عن أجهزه ظاهريه، ما رأيكم بإلقاء نظره عامه عليها؟ :)

أجهزة الحاسوب تتكون بشكل أساسي من مُعالج (CPU) و ذاكرة (RAM) بالإضافة إلى أجهزة أخرى مثل أجهزة الدخلالخرج (I/O)، عندما نُشغّل برنامجاً على الحاسوب فإن نسخة منه ستُخزن في ذاكرة الوصول العشوائي (RAM) و سيتم تنفيذه عن طريق المُعالج، و لا يخفى علينا أن لكل مُعالج مجموعة تعليمات (Instruction set) و هي مجموعة الأوامر التي يمكن لهذا المُعالج تنفيذها، البرامج ببساطه عباره عن سلسلة من التعليمات يقوم المعالج بتنفيذها، تناولت هذا الموضوع بإسهاب في تدوينة سابقة عنوانها "نظرة على المعالجات" يُمكنك الرجوع إليها اذا أردت المزيد.

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

حسناً ماذا لو قُمنا بكتابة برنامج يقوم بعمل المُعالج؟ يعمل هذا البرنامج على المعالج الفيزيائي بالطبع (و لنفرض أنه من معالجات x86) و لكن وظيفته الأساسية هي محاكاة مُعالج خيالي قمنا بتصميمه و نُريد كتابة برامج له.

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

أغلبية الحواسيب التي نستخدمها الآن تعمل إما على معالجات Intel او AMD، هذه المعالجات تستخدم مجموعة تعليمات x86 و بالتالي البرامج التي تعمل على هذه المعالجات هي التي تُرجمت (Compiled) إلى الشيفرة الثنائية التي تفهمها هذه المعالجات، أي انها استخدمت مجموعة تعليمات x86، لتقريب فكرة الأجهزة الظاهرية إلى الأذهان لنتخيل القصّة التاليه :)، لنفرض ان لدينا مجموعة من البرامج القديمة التي كانت تعمل على أجهزة حاسوب قديمة و هي PDP-11، هذه الحواسيب كانت تعمل على مُعالج له نفس الإسم و له معمارية (architecture) مُختلفة عن التي المعمارية التي نستخدمها في حاسوبنا (و هي x86)، بالإضافة إلى ذلك شيفرات هذه البرامج ليست متوفرة حتى نتمكن من إعادة ترجمتها (Recompile) على أجهزتنا الحالية لتشغيلها، البرامج متوفره على الشكل الثنائي (Binary) فقط، و بالطبع الحواسيب التي تُشغّل هذه البرامج قديمة و لا يمكننا شراء أحدها لتشغيل هذه البرامج، إذاً كيف نحل هذه المشكلة؟ :)

لنفترض الحل التالي، نقوم بكتابة برنامج يعمل على الحواسيب الحديثه، و وظيفة هذا البرنامج محاكاة معمارية PDP-11، بحيث يعمل على أنّه مُعالج PDP-11 و يسلك نفس سلوكه، ثُم نُشغّل البرامج القديمة فوق هذا المعالج الخيالي الذي قمنا ببناءه، هذا البرنامج الذي يقوم بهذه الوظيفه هو ما يُطلق عليه "جهاز ظاهري" Virtual Machine، هل الأمور أكثر وضوحاً الآن؟ :)

تم إستخدام مفهوم الأجهزة الظاهرية بشكل واضح في لغات البرمجة، مثلاً لغة جافا و جهازها الإفتراضي ( راجع التدوينة "وقفة مع الجافا، هل هي تفسيريه ام مترجمه؟" )، نفترض إننا كتبنا برنامجاً بلغة سي، عندما نُترجم (Compile) هذا البرنامج فسينتج ملف تنفيذي يحتوي على شيفرة ثنائية متوافقة مع المعالج المطلوب، و بالتالي عند تشغيل البرنامج فسيعمل على المعالج الفيزيائي بشكل مباشر، لغة جافا تختلف هنا، حيث يتم ترجمة شيفرة جافا إلى ما يُسمّى بـ Bytecode، معالجات x86 مثلاً لا يُمكنها أن تفهم الـ Bytecode و بالتالي لن تتمكن من تنفيذ البرنامج.

إذاً كيف نقوم بتشغيل البرامج المكتوبة بإستخدام لغة جافا؟ سنستخدم برنامج يُدعى جهاز جافا الظاهري (Java Virtual Machine) يعمل هذا البرنامج على إنّه معالج له معماريته الخاصّة و له أوامره الخاصة المُختلفه عن معمارية المعالج الفيزيائي الذي يعمل عليه الجهاز الظاهري، و يُنفّذ جهاز جافا الظاهري برامج جافا لأنه هو من يفهمها.

حسناً هل يمكننا أخذ المعمارية التي يعمل عليها جهاز جافا الظاهري و تحويلها إلى معالج فيزيائي حقيقي؟ هل ستعمل برامج جافا عليه؟ نعم يمكن ذلك و بالتالي يمكننا الإستغناء عن جهاز جافا الظاهري (و هو في الحقيقة برنامج) و تشغيل برامج جافا على المعالج الفيزيائي بشكل مباشر و في الحقيقة هناك مشروع مشابه بإسم picoJava بالإضافه إلى Jazelle و الذي يتيح لبعض مُعالجات ARM تشغيل برامج جافا بشكل مباشر.

هذا كل ما في جعبتي :)