- كود بايت JVM هو مجموعة التعليمات المدمجة التي تنفذها الآلة الافتراضية لجافا.
- ينتج مترجم جافا كود بايت في ملفات
.class، وليس الكود الآلي الأصلي. - نفس ملف
.classيعمل على أي نظام أساسي مزود ببيئة تشغيل جافا، وهذا هو الهدف من هذا التنسيق. - تعدل التعديلات كود البايت لتغيير اللعبة المترجمة دون الحاجة إلى الكود المصدري الخاص بها.
رمز بايت كود الآلة الخاص بـ JVM هو مجموعة التعليمات التي تنفذها الآلة الافتراضية لجافا. عند تجميع كود المصدر الخاص بجافا، لا ينتج المترجم كودًا آليًا لوحدة المعالجة المركزية الخاصة بك. بل ينتج بايت كود، وهو تنسيق مضغوط وقابل للنقل مخزن في ملفات .class. تقرأ JVM هذه التعليمات في وقت التشغيل وتحولها إلى كود أصلي أثناء التنفيذ.
أين Opal يناسب
Opal هو تعديل Fabric، والأدوات التي يعتمد عليها تقوم بالعمل على مستوى الـ bytecode نيابة عنك، لذلك لست مضطرًا للتعامل مع الـ opcodes يدويًا. إذا كنت ترغب في إضافة سلوك باستخدام JavaScript العادي، راجع مقدمة البرمجة النصية
كيف يصبح المصدر كود بايت
ملف .java هو نص يكتبه شخص ما. ملف .class هو المخرجات المترجمة التي يشغلها جهاز JVM الظاهري. يقرأ المترجم المصدر الخاص بك، ويتحقق منه، ويكتب ملف .class واحدًا لكل فئة، يحتوي كل منها على تعليمات كود بايت بالإضافة إلى تجمع ثوابت وجداول طرق وبيانات وصفية أخرى.
كود البايت غير مرتبط بمعالج واحد. يعمل نفس ملف .class على نظام التشغيل Windows أو macOS أو Linux أو أي نظام آخر مزود ببيئة تشغيل Java، لأن جهاز JVM الظاهري هو الطبقة التي تعرف كيفية تنفيذ التعليمات على الجهاز المحلي. هذه القدرة على التنقل هي الهدف الأساسي من هذا التنسيق.
كيف تبدو التعليمات
كود البايت هو مجموعة تعليمات تعتمد على المكدس. تدفع معظم العمليات القيم إلى مكدس العمليات، ثم تسحبها، وتدفع نتيجة. لا يوجد تخصيص مسجل يجب التفكير فيه؛ النموذج بسيط عن قصد حتى يتمكن جهاز JVM الظاهري من التحقق منه وتنفيذه بسرعة.
تعطي بعض التعليمات البرمجية النموذجية فكرة عن الأمر:
| رمز العملية | ما تفعله |
|---|---|
iload | يدفع متغير محلي من النوع int إلى المكدس |
iadd | يسحب رقمين صحيحين، ويدفع مجموعهما |
invokevirtual | استدعاء طريقة مثيل |
getfield | قراءة حقل مثيل |
return | العودة من طريقة |
نادرًا ما تقرأ أو تكتب هذه التعليمات البرمجية يدويًا. الأدوات تولدها وتستهلكها، وهذا هو المكان الذي تأتي فيه مكتبة مثل ASM.
لماذا يهم كود البايت للتعديلات
تكمن أهمية الرمز الثنائي (Bytecode) لأنه يتيح لك تغيير السلوك دون الحاجة إلى المصدر الأصلي. نادرًا ما يحتوي تعديل (Mod) لـ Minecraft على رمز المصدر الخاص باللعبة. ما يمتلكه هو اللعبة المجمعة على القرص. لإضافة أو تغيير ميزة، يقرأ التعديل الرمز الثنائي الموجود، ويعيد كتابته، ثم يرسل النتيجة مرة أخرى إلى JVM أثناء تحميل الفئات.
هذا هو كيف تقوم أطر عمل التصحيح (Patching Frameworks) بإدراج خطافات (Hooks) في الطرق التي لا تملكها. إنها تجد المكان المناسب في طريقة مُجمّعة وتقوم بإضافة استدعاء إلى رمز التعديل. العمل على مستوى الرمز الثنائي يعني أن التعديل يمكنه الاتصال باللعبة على الرغم من أنه لا يرى سطرًا واحدًا من كود Java الأصلي.
مكانة ASM
ASM هي مكتبة Java لقراءة وكتابة وتحويل الرمز الثنائي. إنها تحلل ملف .class إلى أحداث أو شجرة، وتسمح بتعديل التعليمات، ثم تُصدر ملف .class صالحًا مرة أخرى. إنها صغيرة وسريعة وتعمل بالقرب من التنسيق الخام، ولهذا السبب تقوم أدوات التعديل ذات المستوى الأعلى بالبناء عليها بدلاً من تحليل ملفات الفئات بأنفسها.
نادراً ما يستدعي المُعدّلون ASM مباشرةً. إنهم يستخدمون طبقة ذات مستوى أعلى تخفي التعليمات البرمجية (Opcodes) وتعرض طريقة أكثر سهولة لقول "قم بتشغيل كودي في بداية هذه الطريقة". في الأسفل، تقوم تلك الطبقة بتحرير الرمز الثنائي، غالبًا من خلال ASM.
الأسئلة الشائعة
لا. التعليمات البرمجية الآلية هي تعليمات أصلية لوحدة المعالجة المركزية (CPU) محددة. التعليمات البرمجية البايت هي مجموعة التعليمات الخاصة بـ JVM، والتي يقوم الـ JVM بترجمتها إلى تعليمات برمجية آلية في وقت التشغيل. تلك الطبقة الإضافية هي ما يجعل ملف .class يعمل على أي نظام أساسي
جزئياً. تقوم برامج إلغاء الترجمة بإعادة بناء كود جافا المقروء من كود البايت، وتنجح إلى حد كبير مع الكود العادي. النتيجة ليست متطابقة دائماً مع الأصل، وتختفي التعليقات وبعض الأسماء المحلية، ولكنها عادةً ما تكون كافية للمتابعة
لأنّ المُعدّلين عادةً لا يمتلكون المصدر. إنهم يقومون بالتوزيع مقابل اللعبة المجمّعة. يتيح إعادة كتابة البايتكود للمُعدّل تغيير السلوك دون الحاجة إلى لمس، أو حتى امتلاك، ملفات جافا الأصلية
عادةً لا. تهتم أطر التعديل وطبقات البرمجة النصية بالعمل المتعلق بالرمز الثنائي نيابةً عنك. إن معرفة طريقة عملها تساعدك عند تصحيح تحديث معقد أو بناء أدوات