ما هو كود بايت JVM؟ شرح ملفات جافا

تُعدّ شيفرة بايت JVM مجموعة التعليمات المدمجة التي تعمل بها الآلة الافتراضية لجافا. تعرّف على طريقة عمل ملفات ‎.class، وسبب قيام التعديلات بإعادة كتابة شيفرة البايت، ومكانة ASM في هذا السياق.

Conceptsby trqUpdated June 4, 2026
Key takeaways
  • كود بايت 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.

الأسئلة الشائعة