بايت كود JVM

بايت كود JVM هو بنية مجموعة التعليمات (ISA) لآلة جافا الافتراضية (JVM)، وهي اللغة التي تُترجم إليها جافا وغيرها من التعليمات البرمجية المتوافقة مع JVM . [ 1 ] تُمثل كل تعليمة ببايت واحد ، ومن هنا جاء اسم بايت كود ، مما يجعله شكلاً مضغوطاً للبيانات . [ 2 ]

نظراً لطبيعة الآلات الافتراضية والرمز البايتي، يمكن تشغيل برنامج JVM bytecode على أي جهاز مزود بـ JVM متوافق، دون الحاجة إلى عملية التجميع الطويلة من التعليمات البرمجية المصدرية.

يتم استخدام بايت كود JVM في وقت التشغيل إما عن طريق تفسيره بواسطة JVM أو عن طريق تجميعه إلى كود الآلة من خلال التجميع في الوقت المناسب (JIT) وتشغيله كتطبيق أصلي.

بما أن بايت كود JVM مصمم لتحقيق التوافق والأمان بين البرامج عبر المنصات المختلفة، فإن تطبيق بايت كود JVM يميل إلى العمل بشكل متسق عبر مختلف تكوينات الأجهزة والبرامج . [ 3 ]

العلاقة بجافا

بشكل عام، لا يحتاج مبرمج جافا إلى فهم بايت كود JVM أو حتى الإلمام به. مع ذلك، وكما ورد في مجلة IBM developerWorks، فإن "فهم بايت كود وما يُحتمل أن يُولّده مُصرّف جافا يُفيد مبرمج جافا بنفس الطريقة التي تُفيد بها معرفة لغة التجميع مبرمج C أو C++ ". [ 4 ]

بنية مجموعة التعليمات

تتضمن الشفرة الوسيطة أنواعًا مختلفة من التعليمات، بما في ذلك معالجة البيانات، ونقل التحكم، وإنشاء الكائنات ومعالجتها، واستدعاء الأساليب، وكلها جزء لا يتجزأ من نموذج البرمجة الكائنية التوجه في جافا . [ 1 ]

تُعدّ آلة جافا الافتراضية (JVM) آلة مكدس وآلة مسجلات في آنٍ واحد . يحتوي كل إطار لاستدعاء دالة على "مكدس معاملات" ومصفوفة من "المتغيرات المحلية". [ 5 ] : 2.6 [ 2 ] يُستخدم مكدس المعاملات لتمرير المعاملات إلى العمليات الحسابية ولاستقبال القيمة المُعادة من الدالة المُستدعاة، بينما تؤدي المتغيرات المحلية نفس وظيفة المسجلات وتُستخدم أيضًا لتمرير وسائط الدوال. يُعدّ الحد الأقصى لحجم مكدس المعاملات ومصفوفة المتغيرات المحلية، الذي يحسبه المُصرّف، جزءًا من خصائص كل دالة. [ 5 ] : 4.7.3 يمكن تحديد حجم كل منها بشكل مستقل من 0 إلى 65535 قيمة، حيث يبلغ طول كل قيمة 32 بت. longأما doubleأنواع البيانات الأخرى، التي يبلغ طولها 64 بت، فتشغل متغيرين محليين متتاليين [ 5 ] : 2.6.1 (لا يشترط أن يكونا مُحاذيين لـ 64 بت في مصفوفة المتغيرات المحلية) أو قيمة واحدة في مكدس المعاملات (لكنهما يُحسبان كوحدتين في عمق المكدس). [ 5 ] : 2.6.2

مجموعة التعليمات

يتكون كل رمز بايت من بايت واحد يمثل رمز العملية ، بالإضافة إلى صفر أو أكثر من البايتات للمعاملات. [ 5 ] : 2.11

من بين 256 رمزًا تشغيليًا ممكنًا بطول البايت ، اعتبارًا من عام 2015يُستخدم 202 تعليمة (حوالي 79%)، و51 تعليمة محجوزة للاستخدام المستقبلي (حوالي 20%)، و3 تعليمات (حوالي 1%) محجوزة بشكل دائم لتطبيقات JVM. [ 5 ] : 6.2 تُستخدم اثنتان من هذه التعليمات ( impdep1و impdep2) لتوفير نقاط توقف للبرامج والأجهزة الخاصة بالتنفيذ، على التوالي. أما الثالثة فتُستخدم لأدوات تصحيح الأخطاء لتنفيذ نقاط التوقف.

تندرج التعليمات ضمن عدد من المجموعات العامة:

  • تحميل وتخزين (على سبيل المثال aload_0، istore)
  • الحساب والمنطق (على سبيل المثال ladd، fcmpl)
  • تحويل النوع (على سبيل المثال i2b، d2i)
  • إنشاء الكائنات ومعالجتها ( new, putfield)
  • إدارة مكدس المعاملات (على سبيل المثال swap، dup2)
  • نقل التحكم (على سبيل المثال ifeq، goto)
  • استدعاء الدالة وإرجاعها (على سبيل المثال invokespecial، areturn)

كما توجد بعض التعليمات لعدد من المهام الأكثر تخصصًا مثل طرح الاستثناءات والمزامنة وما إلى ذلك.

تحتوي العديد من التعليمات على بادئات و/أو لواحق تشير إلى أنواع المعاملات التي تعمل عليها. [ 5 ] : 2.11.1 وهي كالتالي:

البادئة/اللاحقةنوع المعامل
iعدد صحيح
lطويل
sقصير
bبايت
cشخصية
fيطفو
dمزدوج
aمرجع

على سبيل المثال، iaddستجمع الدالة عددين صحيحين، بينما daddستجمع الدالة عددين عشريين. قد تأخذ التعليمات const، و load، و storeلاحقة على شكل ، حيث n عدد من 0 إلى 3 للدالتين و . يختلف الحد الأقصى لـ n للدالة باختلاف نوعها._nloadstoreconst

تقوم هذه constالتعليمات بدفع قيمة من النوع المحدد إلى المكدس. على سبيل المثال، iconst_5ستدفع تعليمة `get` عددًا صحيحًا (قيمة 32 بت) بقيمة 5 إلى المكدس، بينما dconst_1ستدفع تعليمة `get` عددًا عشريًا (قيمة 64 بت) بقيمة 1 إلى المكدس. يوجد أيضًا تعليمة `get` aconst_nullالتي تدفع nullمرجعًا. يحدد المعامل `n`load في تعليمتي ​​`get` و` get` storeفهرس المتغير المحلي المراد التحميل منه أو التخزين فيه. aload_0تدفع تعليمة `get` الكائن الموجود في المتغير المحلي 0 إلى المكدس (وهو عادةً thisالكائن `get`). istore_1تخزن تعليمة `get` العدد الصحيح الموجود في أعلى المكدس في المتغير المحلي 1. بالنسبة للمتغيرات المحلية التي تتجاوز 3، يتم حذف اللاحقة ويجب استخدام المعاملات.

مثال

انظر إلى كود جافا التالي:

في الحلقة الخارجية : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) continue outer ; } System.out.println ( i ) ; }

قد يقوم مترجم جافا بترجمة كود جافا أعلاه إلى بايت كود على النحو التالي، بافتراض أن ما سبق قد تم وضعه في دالة:

0 : iconst_2 1 : istore_1 2 : iload_1 3 : sipush 1000 6 : if_icmpge 44 9 : iconst_2 10 : istore_2 11 : iload_2 12 : iload_1 13 : if_icmpge 31 16 : iload_1 17 : iload_2 18 : irem 19 : ifne 25 22 : goto 38 25 : iinc 2, 1 28 : goto 11 31 : getstatic #84; // Field java/lang/System.out : Ljava/io/PrintStream; 34 : iload_1 35 : invokevirtual #85 ; // الطريقة java/io/PrintStream.println:(I)V 38 : iinc 1, 1 41 : goto 2 44 : return

جيل

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

  • مُترجم Eclipse للغة Java (ECJ)
  • Jikes ، يقوم بالترجمة من لغة جافا إلى بايت كود JVM (تم تطويره بواسطة IBM ، وتم تنفيذه بلغة C++ )
  • يقوم برنامج Espresso بتحويل الكود من لغة Java إلى بايت كود JVM (Java 1.0 فقط)
  • يقوم برنامج GNU Compiler for Java (GCJ) بالترجمة من Java إلى بايت كود JVM؛ ويمكنه أيضًا الترجمة إلى كود الآلة الأصلي وكان جزءًا من مجموعة GNU Compiler Collection (GCC) حتى الإصدار 6.

تُوفّر بعض المشاريع مُجمّعات جافا لتمكين كتابة بايت كود JVM يدويًا. كما يُمكن توليد كود التجميع بواسطة الآلة، على سبيل المثال بواسطة مُترجم يستهدف آلة جافا الافتراضية. ومن أبرز مُجمّعات جافا ما يلي:

  • Jasmin ، تأخذ أوصافًا نصية لفئات Java، مكتوبة بصيغة بسيطة تشبه لغة التجميع باستخدام مجموعة تعليمات الآلة الافتراضية Java، وتنشئ ملف فئة Java [ 6 ].
  • جامايكا، لغة تجميع ماكرو لآلة جافا الافتراضية. يُستخدم بناء جملة جافا لتعريف الفئات أو الواجهات. يتم تحديد أجسام الأساليب باستخدام تعليمات بايت كود. [ 7 ]
  • تحتوي أدوات Krakatau Bytecode حاليًا على ثلاث أدوات: أداة فك تجميع وتفكيك لملفات فئات Java وأداة تجميع لإنشاء ملفات الفئات. [ 8 ]
  • ليلاك، وهو برنامج تجميع وتفكيك لآلة جافا الافتراضية. [ 9 ]

وقد قام آخرون بتطوير مترجمات للغات برمجة مختلفة، تستهدف آلة جافا الافتراضية، مثل:

تنفيذ

تتوفر اليوم العديد من آلات جافا الافتراضية لتنفيذ بايت كود JVM، سواءً المجانية منها أو التجارية. إذا كان تنفيذ البايت كود في آلة افتراضية غير مرغوب فيه، فيمكن للمطور ترجمة كود جافا المصدر أو البايت كود مباشرةً إلى كود الآلة الأصلي باستخدام أدوات مثل مُترجم GNU لجافا (GCJ). بعض المعالجات قادرة على تنفيذ بايت كود JVM بشكل أصلي، وتُسمى هذه المعالجات بمعالجات جافا .

دعم اللغات الديناميكية

توفر آلة جافا الافتراضية بعض الدعم للغات ذات الكتابة الديناميكية . معظم مجموعة تعليمات آلة جافا الافتراضية الحالية ذات كتابة ثابتة - بمعنى أن توقيعات استدعاءات الدوال يتم التحقق من نوعها في وقت الترجمة ، دون وجود آلية لتأجيل هذا القرار إلى وقت التشغيل ، أو لاختيار إرسال الدالة بطريقة بديلة. [ 12 ]

أضاف طلب مواصفات جافا ( JSR ) 292 ( دعم اللغات ذات الكتابة الديناميكية على منصة جافا ) [ 13 ] تعليمة جديدة invokedynamicعلى مستوى آلة جافا الافتراضية (JVM)، للسماح باستدعاء الدوال بالاعتماد على التحقق الديناميكي من النوع (بدلاً من التعليمة الحالية التي تعتمد على التحقق الثابت من النوع invokevirtual). آلة دافنشي هي نموذج أولي لتنفيذ آلة افتراضية تستضيف امتدادات JVM التي تهدف إلى دعم اللغات الديناميكية. جميع آلات جافا الافتراضية التي تدعم منصة جافا، الإصدار القياسي (JSE) 7 تتضمن أيضًا invokedynamicرمز العملية.

انظر أيضاً

مراجع

  1. 1 2 "مواصفات آلة جافا الافتراضية" . أوراكل . تم الاطلاع عليه بتاريخ 14 نوفمبر 2023 .
  2. 1 2 ليندهولم، تيم (2015). مواصفات آلة جافا الافتراضية . أوراكل. ISBN 978-0133905908.
  3. أرنولد، كين (1996). "لغة برمجة جافا". صن مايكروسيستمز . 1 (1): 30-40 .
  4. "مطور IBM" . developer.ibm.com . تم الاطلاع عليه بتاريخ 20 فبراير 2006 .
  5. 1 2 3 4 5 6 7 ليندهولم، تيم؛ يلين، فرانك؛ براخا، جلعاد؛ باكلي، أليكس (13 فبراير 2015). مواصفات آلة جافا الافتراضية (جافا إس إي الإصدار 8). 
  6. "الصفحة الرئيسية لبرنامج ياسمين" . jasmin.sourceforge.net . تم الاطلاع عليه بتاريخ 2 يونيو 2024 .
  7. هوانغ، جيمس جيانبو. "جامايكا: مُجمِّع الماكرو لآلة جافا الافتراضية (JVM)" . جافا وورلد . مؤرشف من الأصل في 14 نوفمبر 2023. تم الاطلاع عليه في 2 يونيو 2024 .
  8. ^ "ستورييلر/ كراكاتاو" . 1 يونيو 2024 . تم الاسترجاع في 2 يونيو 2024 عبر جيثب.
  9. "ليلاك - مُجمِّع جافا" . lilac.sourceforge.net . تم الاطلاع عليه بتاريخ 2 يونيو 2024 .
  10. "ميزات جديدة في FPC 3.0.0" . ويكي فري باسكال . تم الاطلاع عليه بتاريخ 2 يونيو 2024 .
  11. "FPC JVM - ويكي فري باسكال" . wiki.freepascal.org . تم الاطلاع عليه بتاريخ 2 يونيو 2024 .
  12. ناتر، تشارلز (3 يناير 2007). "InvokeDynamic: هل هو مفيد حقًا؟" . تم الاطلاع عليه بتاريخ 25 يناير 2008 .
  13. "برنامج عملية مجتمع جافا (SM) - طلبات مواصفات جافا (JSRs): تفاصيل JSR رقم 292" . www.jcp.org . تم الاطلاع عليه في 2 يونيو 2024 .