البايت كود

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

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

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

تنفيذ

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

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

في الآونة الأخيرة، تحدى مؤلفو V8 [1] و Dart [7] فكرة أن البايت كود الوسيط مطلوب لتنفيذ VM سريع وفعال. يقوم كلا تنفيذي هاتين اللغتين حاليًا بالتجميع المباشر في JIT من الكود المصدر إلى الكود الآلي بدون وسيط بايت كود. [8]

أمثلة

( تفكيك ' ( lambda ( x ) ( طباعة x ))) ؛ تفكيك (LAMBDA (X)) ؛ 2436F6DF: 850500000F22 اختبار EAX، [#x220F0000] ؛ نقطة دخول بدون تحليل وسيطة ؛ E5: 8BD6 MOV EDX، ESI ؛ E7: 8B05A8F63624 MOV EAX، [#x2436F6A8] ؛ #<كائن FDEFINITION للطباعة> ؛ ED: B904000000 MOV ECX، 4 ؛ F2: FF7504 PUSH DWORD PTR [EBP+4] ؛ F5: FF6005 JMP DWORD PTR [EAX+5] ؛ F8: CC0A BREAK 10 ؛ فخ الخطأ ؛ FA: 02 بايت #X02 ؛ FB: 18 بايت #X18؛ INVALID-ARG-COUNT-ERROR ؛ FC: 4F بايت #X4F؛ ECX    











يمكن تحليل الكود المجمّع والتحقيق فيه باستخدام أداة مدمجة لتصحيح أخطاء البايت كود منخفض المستوى. يمكن تهيئة الأداة من الغلاف، على سبيل المثال:
>>> استيراد  dis  # "dis" - تفكيك كود البايت في Python إلى أدوات مساعدة. 
>>> 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 على التجميع الفوري في PHP 8، [5] [6] وما قبل ذلك بينما لم تكن مفعلة في الإصدار الافتراضي، كانت تحتوي على خيارات مثل HHVM . بالنسبة للإصدارات الأقدم من PHP: على الرغم من أن أكواد PHP يتم إنشاؤها في كل مرة يتم فيها تشغيل البرنامج، ويتم تفسيرها دائمًا ولا يتم تجميعها في الوقت المناسب .

مراجع

  1. ^ ab "Dynamic Machine Code Generation". Google Inc. مؤرشف من الأصل في 2017-03-05 . تم الاسترجاع 2023-02-21 .{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  2. ^ "تنفيذ Lua 5.0".(ملاحظة: يتضمن هذا جهازًا افتراضيًا يعتمد على السجل.)
  3. ^ "Dalvik VM". مؤرشف من الأصل في 2013-05-18 . تم الاسترجاع 2012-10-29 .(ملاحظة: هذه الآلة الافتراضية تعتمد على السجل.)
  4. ^ "Byte Code Vs Machine Code". www.allaboutcomputing.net . تم الاسترجاع في 2017-10-23 .
  5. ^ O'Phinney, Matthew Weier. "استكشاف مُجمِّع PHP JIT الجديد". Zend بواسطة Perforce . تم الاسترجاع في 2021-02-19 .
  6. ^ "PHP 8: The JIT - stitcher.io". stitcher.io . تم الاسترجاع في 2021-02-19 .
  7. ^ Loitsch, Florian. "لماذا لا تكون آلة افتراضية بايت كود؟". Google . مؤرشف من الأصل في 2013-05-12.
  8. ^ "أسطورة JavaScript: JavaScript يحتاج إلى رمز ثنائي قياسي". 2ality.com .
  9. ^ G., Adam Y. (2022-07-11). "Berkeley Pascal". GitHub . تم الاسترجاع في 2022-01-08 .
  10. ^ "CLHS: تفكيك الدالة". www.lispworks.com .
  11. ^ "ضبط الأداء والنصائح". lispcookbook.github.io .
  12. ^ "تطبيق لغة برمجة الأيقونات" (PDF) . مؤرشف من الأصل (PDF) في 2016-03-05 . تم الاسترجاع 2011-09-09 .
  13. ^ "تطبيق الأيقونات واليونيكون في كتاب واحد" (PDF) . مؤرشف من الأصل (PDF) في 2022-10-09.
  14. ^ بول، ماتياس ر. (2001-12-30). "البنية الداخلية لـ KEYBOARD.SYS". مجموعة الأخبار : comp.os.msdos.programmer. مؤرشف من الأصل في 2017-09-09 . تم الاسترجاع في 2016-09-17 . […] في الواقع، التنسيق هو نفسه بشكل أساسي في MS-DOS 3.3 - 8.0، PC DOS 3.3 - 2000، بما في ذلك الإصدارات الروسية والليتوانية والصينية واليابانية، وكذلك في Windows NT و2000 وXP […]. هناك اختلافات طفيفة وعدم توافق، لكن التنسيق العام لم يتغير على مر السنين. […] تحتوي بعض إدخالات البيانات على جداول عادية […] ومع ذلك، تحتوي معظم الإدخالات على كود قابل للتنفيذ يتم تفسيره بواسطة نوع من مفسر p-code في * وقت التشغيل *، بما في ذلك الفروع الشرطية وما شابه ذلك. هذا هو السبب في أن برنامج تشغيل KEYB لديه مثل هذه المساحة الضخمة من الذاكرة مقارنة ببرامج تشغيل لوحة المفاتيح التي يتم تشغيلها بواسطة الجدول والتي يمكن القيام بها في 3 - 4 كيلوبايت للحصول على نفس مستوى الوظيفة باستثناء المترجم. […]
  15. ^ Mendelson, Edward (2001-07-20). "كيفية عرض اليورو في MS-DOS وWindows DOS". عرض رمز اليورو في MS-DOS بشاشة كاملة (بما في ذلك Windows 95 أو Windows 98 بشاشة كاملة). مؤرشف من الأصل في 2016-09-17 . تم الاسترجاع في 2016-09-17 . […] يحذر Matthias [R.] Paul […] من أن إصدار IBM PC DOS من برنامج تشغيل لوحة المفاتيح يستخدم بعض الإجراءات الداخلية التي لا يتعرف عليها برنامج تشغيل Microsoft ، لذا، إذا أمكن، يجب عليك استخدام إصدارات IBM لكل من KEYB.COM و KEYBOARD.SYS بدلاً من خلط إصدارات Microsoft وIBM […](ملاحظة: المقصود بـ "الإجراءات" هنا هو بعض البايتات الإضافية في ملف IBM KEYBOARD.SYS والتي لا تدعمها نسخة Microsoft من برنامج التشغيل KEYB.)
  16. ^ "براءة اختراع الولايات المتحدة رقم 6,973,644". مؤرشف من الأصل في 2017-03-05 . تم الاسترجاع في 2009-05-21 .
  17. ^ مواصفات Microsoft C Pcode . ص. 13. لم يتم تجميع Multiplan إلى كود آلي ، ولكن إلى نوع من الكود الثنائي الذي تم تشغيله بواسطة مفسّر ، من أجل جعل Multiplan محمولاً عبر الأجهزة المتنوعة على نطاق واسع في ذلك الوقت. ميز هذا الكود الثنائي بين تنسيق النقطة العائمة الخاص بالآلة للحساب عليه، وتنسيق خارجي (قياسي)، وهو تنسيق عشري مشفر ثنائيًا (BCD). تم تحويل تعليمات PACK وUNPACK بين الاثنين.
  18. ^ "تثبيت وإدارة R". cran.r-project.org .
  19. ^ "محرك بايت كود SQLite". مؤرشف من الأصل في 2017-04-14 . تم الاسترجاع في 2016-08-29 .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Bytecode&oldid=1252902532"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate