بايت كود

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

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

بما أن تعليمات البايت كود تُعالج بواسطة البرمجيات، فقد تكون معقدة للغاية، ولكنها مع ذلك غالباً ما تُشبه تعليمات الأجهزة التقليدية: تُعد آلات المكدس الافتراضية الأكثر شيوعاً، ولكن تم بناء آلات السجلات الافتراضية أيضاً. [ 2 ] [ 3 ] غالباً ما تُخزن الأجزاء المختلفة في ملفات منفصلة، ​​على غرار وحدات الكائنات ، ولكن يتم تحميلها ديناميكياً أثناء التنفيذ.

تنفيذ

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

بسبب ميزتها في الأداء، تُنفّذ العديد من تطبيقات اللغات اليوم البرنامج على مرحلتين: أولاً، ترجمة الكود المصدري إلى بايت كود، ثم تمرير البايت كود إلى الآلة الافتراضية. توجد آلات افتراضية من هذا النوع تعتمد على البايت كود للغات مثل Java وRaku وPython وPHP وTcl و mawk و Forth ( مع ذلك ، نادرًا ما تُترجم Forth باستخدام البايت كود بهذه الطريقة، وآلتها الافتراضية أكثر عمومية). أما تطبيق Perl و Ruby 1.8 فيعملان من خلال تتبع تمثيل شجرة بناء الجملة المجردة المُستمدة من الكود المصدري.

في الآونة الأخيرة، شكك مؤلفو V8 [ 1 ] و Dart [ 7 ] في فكرة ضرورة وجود بايت كود وسيط لتنفيذ الآلة الافتراضية بسرعة وكفاءة. إذ يقوم كلا التطبيقين اللغويين حاليًا بالترجمة الفورية (JIT) مباشرةً من شفرة المصدر إلى شفرة الآلة دون أي وسيط بايت كود. [ 8 ] على سبيل المثال، تجاوزت الإصدارات الأولى من محرك V8 JavaScript طبقة البايت كود الوسيطة عمدًا، حيث قامت بالترجمة الفورية (JIT) مباشرةً من نص المصدر إلى شفرة الآلة الأصلية عبر مُترجم "Full-codegen". [ 9 ]

مع ذلك، واجهت هذه البنية مشكلة تضخم الذاكرة بشكل كبير على الأجهزة المحمولة، وتعقيدًا يصعب إدارته عند دعم مواصفات ECMAScript الأحدث والأكثر تعقيدًا. ونتيجةً لذلك، أجرت V8 إصلاحًا شاملًا لخط أنابيب التنفيذ الخاص بها في عام 2017، حيث قدمت مترجمًا منخفض المستوى يعتمد على السجلات يُسمى "Ignition". وتعتمد الإصدارات الحديثة من V8 الآن بشكل كبير على التعليمات البرمجية الوسيطة كطبقة تنفيذ أساسية، حيث يتم تصعيد الوظائف "الساخنة" تدريجيًا من التعليمات البرمجية الوسيطة إلى بنية JIT متعددة الطبقات تعتمد على لغة الآلة الأصلية (Sparkplug وMaglev وTurboFan). [ 10 ]

أمثلة

( فك تجميع ( دالة لامدا ( س ) ( طباعة س ))) ؛ تفكيك لـ (دالة لامدا (س)) ؛ 2436F6DF: 850500000F22 اختبار EAX، [#x220F0000]؛ نقطة دخول بدون تحليل وسيطات ؛ E5: 8BD6 نقل EDX، ESI ؛ E7: 8B05A8F63624 نقل EAX، [#x2436F6A8]؛ #<كائن تعريف F للطباعة> ؛ ED: B904000000 نقل ECX، 4 ؛ F2: FF7504 دفع مؤشر DWORD [EBP+4] ؛ F5: FF6005 قفز مؤشر DWORD [EAX+5] ؛ F8: CC0A كسر 10؛ مصيدة خطأ ؛ FA: 02 بايت #X02 ؛ FB: 18 بايت #X18؛ خطأ في عدد الوسائط غير الصالحة ؛ FC: 4F بايت #X4F؛ ECX
يمكن تحليل الكود المُجمَّع وفحصه باستخدام أداة مُدمجة لتصحيح أخطاء الكود البايتي منخفض المستوى. ويمكن تهيئة هذه الأداة من سطر الأوامر، على سبيل المثال:
>>> import dis # "dis" - أداة تفكيك بايت كود بايثون إلى رموز مختصرة. >>> dis.dis ( ' print("Hello, World!")' ) 1  0 LOAD_NAME 0 (print)  2 LOAD_CONST 0 ('Hello, World!')  4 CALL_FUNCTION 1  6 RETURN_VALUE

انظر أيضاً

ملحوظات

  1. يدعم PHP خاصية الترجمة الفورية في الإصدار 8، [ 5 ] [ 6 ] والإصدارات السابقة، بينما لم تكن هذه الخاصية مُفعّلة في الإصدار الافتراضي، إلا أنها كانت تتضمن خيارات مثل HHVM . بالنسبة للإصدارات الأقدم من PHP: على الرغم من أن رموز PHP تُولّد في كل مرة يُشغّل فيها البرنامج، إلا أنها تُفسّر دائمًا ولا تُترجم فوريًا .

مراجع

  1. 1 2 "توليد رمز الآلة الديناميكي" . شركة جوجل. مؤرشف من الأصل بتاريخ 2017-03-05 . تم الاسترجاع بتاريخ 2024-12-01 .
  2. "تطبيق لغة Lua 5.0" .(ملاحظة: هذا يتضمن آلة افتراضية تعتمد على السجلات.)
  3. "Dalvik VM" . مؤرشف من الأصل بتاريخ 18-05-2013 . تم الاطلاع عليه بتاريخ 29-10-2012 .(ملاحظة: هذه الآلة الافتراضية تعتمد على السجلات.)
  4. "الرمز البايتي مقابل رمز الآلة" . www.allaboutcomputing.net . تم الاطلاع عليه بتاريخ 23-10-2017 .
  5. أوفيني، ماثيو وير. "استكشاف مُترجم PHP JIT الجديد" . Zend by Perforce . تم الاسترجاع في 19 فبراير 2021 .
  6. "PHP 8: The JIT - stitcher.io" . stitcher.io . تم ​​الاطلاع عليه بتاريخ 19-02-2021 .
  7. لويتش، فلوريان. "لماذا لا نستخدم آلة افتراضية تعتمد على بايت كود؟" . جوجل . مؤرشف من الأصل بتاريخ 12-05-2013.
  8. "خرافة جافا سكريبت: جافا سكريبت تحتاج إلى بايت كود قياسي" . 2ality.com . مؤرشف من الأصل بتاريخ 20-06-2018.
  9. وينغو، آندي (2011-07-05). "v8: حكاية مُترجمين" . wingolog.org . تم الاطلاع عليه بتاريخ 2026-07-05 .
  10. ماكيلروي، روس (15 مايو 2017). "إطلاق Ignition و TurboFan" . v8.dev . مشروع جوجل V8 . تم الاسترجاع في 5 يوليو 2026 .
  11. ج.، آدم ي. (2022-07-11). "بيركلي باسكال" . جيت هاب . تم الاسترجاع في 2022-01-08 .
  12. "CLHS: Function DISASSEMBLE" . www.lispworks.com .
  13. مجموعة (13-12-2023). "كتاب طبخ لغة Common Lisp - تحسين الأداء ونصائح" . lispcookbook.github.io .
  14. "تطبيق لغة برمجة الأيقونات" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2016-03-05 . تم الاطلاع عليه بتاريخ 2011-09-09 .
  15. "تطبيق الأيقونات والأيقونات الموحدة: موسوعة" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 2022-10-09.
  16. بول، ماتياس ر. (30-12-2001). "البنية الداخلية لملف KEYBOARD.SYS" . مجموعة الأخبار : comp.os.msdos.programmer . تاريخ الاسترجاع: 17-09-2016 . [...] في الواقع، يُعدّ التنسيق متطابقًا بشكل أساسي في أنظمة MS-DOS من الإصدار 3.3 إلى 8.0، و PC DOS من الإصدار 3.3 إلى 2000، بما في ذلك الإصدارات الروسية والليتوانية والصينية واليابانية، وكذلك في أنظمة Windows NT و2000 وXP [...]. توجد اختلافات طفيفة وعدم توافق، لكن التنسيق العام لم يتغير على مر السنين. [...] تحتوي بعض إدخالات البيانات على جداول عادية [...] ومع ذلك، تحتوي معظم الإدخالات على تعليمات برمجية قابلة للتنفيذ يتم تفسيرها بواسطة نوع من مترجمات التعليمات البرمجية p-code في وقت التشغيل ، بما في ذلك الفروع الشرطية وما شابه ذلك. لهذا السبب، يستهلك برنامج تشغيل لوحة المفاتيح (KEYB) مساحة كبيرة من الذاكرة مقارنةً ببرامج تشغيل لوحة المفاتيح التي تعمل بالجداول، والتي يمكن تشغيلها في مساحة تتراوح بين 3 و4 كيلوبايت مع الحصول على نفس مستوى الوظائف باستثناء المترجم. […]   {{cite newsgroup}}: CS1 maint: deprecated archiveal service ( link )
  17. مندلسون، إدوارد (20 يوليو 2001). "كيفية عرض اليورو في MS-DOS وWindows DOS" . عرض رمز اليورو في وضع ملء الشاشة في MS-DOS (بما في ذلك Windows 95 أو Windows 98 في وضع ملء الشاشة). مؤرشف من الأصل في 17 سبتمبر 2016. تم الاسترجاع في 17 سبتمبر 2016. [ ...] يحذر ماتياس [ر.] بول [...] من أن إصدار IBM PC DOS من برنامج تشغيل لوحة المفاتيح يستخدم بعض الإجراءات الداخلية التي لا يتعرف عليها برنامج تشغيل Microsoft ، لذلك، إن أمكن، يجب عليك استخدام إصدارات IBM من كل من KEYB.COM و KEYBOARD.SYS بدلاً من خلط إصدارات Microsoft وIBM [...](ملاحظة: المقصود بـ "الإجراءات" هنا هو بعض التعليمات البرمجية الإضافية في ملف IBM KEYBOARD.SYS غير المدعومة من قبل إصدار Microsoft من برنامج تشغيل لوحة المفاتيح.)
  18. "براءة اختراع الولايات المتحدة رقم 6,973,644" . مؤرشفة من الأصل بتاريخ 2017-03-05 . تم الاطلاع عليها بتاريخ 2009-05-21 .
  19. مواصفات لغة البرمجة C من مايكروسوفت ، صفحة ١٣. لم تُترجم لغة Multiplan إلى لغة الآلة ، بل إلى نوع من التعليمات البرمجية الوسيطة التي يُشغلها مترجم ، وذلك لجعلها قابلة للتنقل بين مختلف أنواع الأجهزة في ذلك الوقت. ميزت هذه التعليمات البرمجية الوسيطة بين تنسيق الفاصلة العائمة الخاص بالجهاز المستخدم في الحساب، وتنسيق خارجي (قياسي) وهو النظام العشري المشفر ثنائيًا (BCD). وكانت تعليمات PACK وUNPACK تُحوّل بين هذين التنسيقين. 
  20. "تثبيت وإدارة R" . cran.r-project.org .
  21. "محرك بايت كود SQLite" . مؤرشف من الأصل بتاريخ 14 أبريل 2017. تم الاطلاع عليه بتاريخ 29 أغسطس 2016 .