بايت كود
الشفرة البايتية (وتسمى أيضًا الشفرة المحمولة أو الشفرة 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 ]
أمثلة
- يُنفَّذ ActionScript في آلة ActionScript الافتراضية (AVM)، وهي جزء من Flash Player و AIR . عادةً ما يُحوَّل كود ActionScript إلى صيغة بايت كود بواسطة مُصرِّف . من أمثلة المُصرِّفات مُصرِّف مُدمج في Adobe Flash Professional وآخر مُدمج في Adobe Flash Builder ومتوفر في Adobe Flex SDK .
- كائنات أدوبي فلاش
- BANCStar ، في الأصل بايت كود لأداة بناء واجهة المستخدم، ولكنها تستخدم أيضًا كلغة برمجة
- مرشح حزم بيركلي
- EBPF
- بيركلي باسكال [ 11 ]
- مكتبة هندسة رمز البايت
- مترجمات الآلة الافتراضية من لغة C إلى جافا
- كان تطبيق CLISP للغة Common Lisp يُترجم إلى بايت كود فقط لسنوات عديدة؛ ومع ذلك، فهو يدعم الآن أيضًا الترجمة إلى كود أصلي بمساعدة GNU lightning
- يمكن ترجمة تطبيقات Common Lisp الخاصة بـ CMUCL و Scieneer إما إلى كود أصلي أو إلى بايت كود، وهو أكثر اختصارًا بكثير.
- لغة وسيطة مشتركة يتم تنفيذها بواسطة بيئة تشغيل اللغة المشتركة ، وتستخدمها لغات .NET مثل C#
- يتم تنفيذ بايت كود Dalvik ، المصمم لمنصة Android ، بواسطة الآلة الافتراضية Dalvik
- يتم تنفيذ بايت كود Dis، المصمم لنظام التشغيل Inferno ، بواسطة الآلة الافتراضية Dis
- برنامج EiffelStudio للغة البرمجة Eiffel
- EM، وهي آلة افتراضية من مجموعة أدوات ترجمة أمستردام، تُستخدم كلغة ترجمة وسيطة ولغة بايت كود حديثة
- إيماكس هو محرر نصوص تُنفَّذ معظم وظائفه باستخدام لغة إيماكس ليسب ، وهي لهجة مدمجة من لغة ليسب . تُترجم هذه الميزات إلى بايت كود. تتيح هذه البنية للمستخدمين تخصيص المحرر باستخدام لغة برمجة عالية المستوى، والتي تُحقق أداءً مقبولاً بعد ترجمتها إلى بايت كود.
- يمكن ترجمة تطبيق Common Lisp القابل للتضمين إلى رمز بايت أو رمز C
- توفر لغة Common Lisp
disassembleدالةً [ 12 ] تطبع على المخرج القياسي الشفرة الأساسية لدالة محددة. وتعتمد النتيجة على التنفيذ، وقد تُترجم إلى بايت كود أو لا. ويمكن الاستفادة من فحصها لأغراض تصحيح الأخطاء وتحسين الأداء. [ 13 ] على سبيل المثال، ينتج برنامج Steel Bank Common Lisp ما يلي:
( فك تجميع ( دالة لامدا ( س ) ( طباعة س ))) ؛ تفكيك لـ (دالة لامدا (س)) ؛ 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
- تستخدم شركة إريكسون في تطبيقها للغة إرلانج بايت كود BEAM
- تُعد الآلة الافتراضية لإيثيريوم (EVM) بيئة التشغيل، التي تستخدم رمز البايت الخاص بها، لتنفيذ المعاملات في إيثيريوم (العقود الذكية).
- لغات البرمجة Icon [ 14 ] و Unicon [ 15 ]
- استخدمت شركة إنفوكوم جهاز Z لجعل تطبيقات برامجها أكثر قابلية للنقل
- بايت كود جافا ، الذي يتم تنفيذه بواسطة آلة جافا الافتراضية
- ASM
- بي سي إي إل
- جافاسيست
- تم استخدام بايت كود Keiko بواسطة لغة برمجة Oberon-2 لجعلها ونظام تشغيل Oberon أكثر قابلية للنقل.
- برنامج تشغيل لوحة المفاتيح KEYB ، الخاص بنظامي MS-DOS و PC DOS ، يحتوي على ملف الموارد KEYBOARD.SYS الذي يتضمن معلومات التخطيط وتسلسلات رموز p القصيرة التي ينفذها مترجم داخل برنامج التشغيل المقيم. [ 16 ] [ 17 ]
- LLVM IR
- لغة البرمجة النصية LSL، المستخدمة في العوالم الافتراضية، تُترجم إلى بايت كود يعمل على جهاز افتراضي. يمتلك Second Life النسخة الأصلية Mono، بينما طوّرت Inworldz نسخة Phlox.
- تستخدم لغة Lua آلة افتراضية تعتمد على رمز البايت.
- m-code للغة MATLAB [ 18 ]
- مالبولج هي لغة آلة باطنية لآلة افتراضية ثلاثية.
- رمز مايكروسوفت P المستخدم في Visual C++ و Visual Basic
- Multiplan [ 19 ]
- رمز O للغة البرمجة BCPL
- لغة OCaml قابلة للترجمة بشكل اختياري إلى شكل بايت كود مضغوط
- رمز p لتطبيق لغة باسكال في جامعة كاليفورنيا في سان دييغو
- آلة الببغاء الافتراضية
- اختر لغة BASIC، والتي تُعرف أيضًا باسم Data BASIC أو MultiValue BASIC
- توفر بيئة R للحوسبة الإحصائية مُجمِّعًا للرموز الوسيطة من خلال حزمة المُجمِّع، وهي الآن قياسية مع إصدار R 2.13.0. من الممكن تجميع هذا الإصدار من R بحيث تستفيد الحزم الأساسية والموصى بها من هذه الميزة. [ 20 ]
- لعبة المغامرات بيراميد 2000
- تُترجم نصوص بايثون عند تنفيذها إلى لغة بايت كود بايثون، ويتم تخزين الملفات المُترجمة (.pyc) مؤقتًا داخل مجلد النص البرمجي.
- يمكن تحليل الكود المُجمَّع وفحصه باستخدام أداة مُدمجة لتصحيح أخطاء الكود البايتي منخفض المستوى. ويمكن تهيئة هذه الأداة من سطر الأوامر، على سبيل المثال:
>>> 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
- تطبيق Scheme 48 للغة Scheme باستخدام مترجم بايت كود
- رموز البايت للعديد من تطبيقات لغة سمول توك
- مترجم Spin المدمج في وحدة التحكم الدقيقة Parallax Propeller
- يقوم محرك قاعدة بيانات SQLite بترجمة عبارات SQL إلى تنسيق بايت كود مخصص. [ 21 ]
- أبل سويت 16
- تي سي إل
- يتم استخدام TIMI بواسطة المترجمات على منصة IBM i .
- Tiny Basic
- يتم تجميع Visual Basic for Applications إلى رمز بايت.
- يتم تجميع Visual FoxPro إلى بايت كود
- WebAssembly
- يارف وروبينيوس لروبي
- رمز المنطقة Z
- أكواد Zend Engine للغة PHP
انظر أيضاً
- منصة الحوسبة - البيئة التي يتم فيها تنفيذ برنامج ما
- التمثيل الوسيط - بنية البيانات أو التعليمات البرمجية التي يستخدمها المترجم
- نظام التشغيل – نظام حاسوبي يوفر السلوك المطلوب لتشغيل التعليمات البرمجية
ملحوظات
- ↑ يدعم PHP خاصية الترجمة الفورية في الإصدار 8، [ 5 ] [ 6 ] والإصدارات السابقة، بينما لم تكن هذه الخاصية مُفعّلة في الإصدار الافتراضي، إلا أنها كانت تتضمن خيارات مثل HHVM . بالنسبة للإصدارات الأقدم من PHP: على الرغم من أن رموز PHP تُولّد في كل مرة يُشغّل فيها البرنامج، إلا أنها تُفسّر دائمًا ولا تُترجم فوريًا .
مراجع
- 1 2 "توليد رمز الآلة الديناميكي" . شركة جوجل. مؤرشف من الأصل بتاريخ 2017-03-05 . تم الاسترجاع بتاريخ 2024-12-01 .
- ↑ "تطبيق لغة Lua 5.0" .(ملاحظة: هذا يتضمن آلة افتراضية تعتمد على السجلات.)
- ↑ "Dalvik VM" . مؤرشف من الأصل بتاريخ 18-05-2013 . تم الاطلاع عليه بتاريخ 29-10-2012 .(ملاحظة: هذه الآلة الافتراضية تعتمد على السجلات.)
- ↑ "الرمز البايتي مقابل رمز الآلة" . www.allaboutcomputing.net . تم الاطلاع عليه بتاريخ 23-10-2017 .
- ↑ أوفيني، ماثيو وير. "استكشاف مُترجم PHP JIT الجديد" . Zend by Perforce . تم الاسترجاع في 19 فبراير 2021 .
- ↑ "PHP 8: The JIT - stitcher.io" . stitcher.io . تم الاطلاع عليه بتاريخ 19-02-2021 .
- ↑ لويتش، فلوريان. "لماذا لا نستخدم آلة افتراضية تعتمد على بايت كود؟" . جوجل . مؤرشف من الأصل بتاريخ 12-05-2013.
- ↑ "خرافة جافا سكريبت: جافا سكريبت تحتاج إلى بايت كود قياسي" . 2ality.com . مؤرشف من الأصل بتاريخ 20-06-2018.
- ↑ وينغو، آندي (2011-07-05). "v8: حكاية مُترجمين" . wingolog.org . تم الاطلاع عليه بتاريخ 2026-07-05 .
- ↑ ماكيلروي، روس (15 مايو 2017). "إطلاق Ignition و TurboFan" . v8.dev . مشروع جوجل V8 . تم الاسترجاع في 5 يوليو 2026 .
- ↑ ج.، آدم ي. (2022-07-11). "بيركلي باسكال" . جيت هاب . تم الاسترجاع في 2022-01-08 .
- ↑ "CLHS: Function DISASSEMBLE" . www.lispworks.com .
- ↑ مجموعة (13-12-2023). "كتاب طبخ لغة Common Lisp - تحسين الأداء ونصائح" . lispcookbook.github.io .
- ↑ "تطبيق لغة برمجة الأيقونات" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 2016-03-05 . تم الاطلاع عليه بتاريخ 2011-09-09 .
- ↑ "تطبيق الأيقونات والأيقونات الموحدة: موسوعة" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 2022-10-09.
- ↑ بول، ماتياس ر. (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 ) - ↑ مندلسون، إدوارد (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 من برنامج تشغيل لوحة المفاتيح.)
- ↑ "براءة اختراع الولايات المتحدة رقم 6,973,644" . مؤرشفة من الأصل بتاريخ 2017-03-05 . تم الاطلاع عليها بتاريخ 2009-05-21 .
- ↑ مواصفات لغة البرمجة C من مايكروسوفت ، صفحة ١٣.
لم تُترجم
لغة Multiplan إلى
لغة الآلة
، بل إلى نوع من التعليمات البرمجية الوسيطة التي يُشغلها مترجم
،
وذلك لجعلها قابلة للتنقل بين مختلف أنواع الأجهزة في ذلك الوقت. ميزت هذه التعليمات البرمجية الوسيطة بين
تنسيق الفاصلة العائمة
الخاص بالجهاز المستخدم في الحساب، وتنسيق خارجي (قياسي) وهو
النظام العشري المشفر ثنائيًا
(BCD). وكانت تعليمات PACK وUNPACK تُحوّل بين هذين التنسيقين.
- ↑ "تثبيت وإدارة R" . cran.r-project.org .
- ↑ "محرك بايت كود SQLite" . مؤرشف من الأصل بتاريخ 14 أبريل 2017. تم الاطلاع عليه بتاريخ 29 أغسطس 2016 .
- بايت كود
- المحاكاة الافتراضية
