البايت كود
This article needs additional citations for verification. (January 2009) |
| Program execution |
|---|
| General concepts |
| Types of code |
|
| Compilation strategies |
| Notable runtimes |
|
| Notable compilers & toolchains |
|
البايت كود (يُسمى أيضًا الكود المحمول أو الكود-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]
أمثلة
- يتم تنفيذ ActionScript في ActionScript Virtual Machine (AVM)، وهو جزء من Flash Player و AIR . يتم تحويل كود ActionScript عادةً إلى تنسيق البايت كود بواسطة مُجمِّع . تتضمن أمثلة المُجمِّعات مُجمِّعًا مدمجًا في Adobe Flash Professional وآخر مدمج في Adobe Flash Builder ومتاحًا في Adobe Flex SDK .
- كائنات Adobe Flash
- BANCStar، وهو في الأصل بايت كود لأداة بناء الواجهة ولكن تم استخدامه أيضًا كلغة
- مرشح حزمة بيركلي
- صندوق التأمين الصحي الأوروبي
- بيركلي باسكال [9]
- مكتبة هندسة البايت كود
- مُجمِّعات الآلة الافتراضية من C إلى Java
- كان تنفيذ CLISP للغة Common Lisp يستخدم للتجميع إلى كود ثنائي فقط لسنوات عديدة؛ ومع ذلك، فهو الآن يدعم أيضًا التجميع إلى كود أصلي بمساعدة GNU Lightning
- يمكن لتطبيقات CMUCL وScienceer Common Lisp الخاصة بـ Common Lisp أن تترجم إما إلى كود أصلي أو إلى كود ثنائي، وهو أكثر إحكاما بكثير
- لغة وسيطة مشتركة يتم تنفيذها بواسطة Common Language Runtime ، وتستخدمها لغات .NET مثل C#
- يتم تنفيذ بايت كود Dalvik المصمم لمنصة Android بواسطة الآلة الافتراضية Dalvik
- يتم تنفيذ بايت كود Dis، المصمم لنظام التشغيل Inferno ، بواسطة الآلة الافتراضية Dis
- برنامج EiffelStudio للغة البرمجة Eiffel
- EM، آلة افتراضية من مجموعة Amsterdam Compiler Kit تُستخدم كلغة تجميع وسيطة وكلغة بايت كود حديثة
- Emacs هو محرر نصوص يتم تنفيذ معظم وظائفه بواسطة Emacs Lisp ، وهي لهجته المدمجة من Lisp . يتم تجميع هذه الميزات في بايت كود. تسمح هذه البنية للمستخدمين بتخصيص المحرر بلغة عالية المستوى، والتي بعد التجميع في بايت كود تعطي أداءً معقولاً.
- يمكن تنفيذ Common Lisp القابل للتضمين في Common Lisp والتجميع إلى كود ثنائي أو كود C
- توفر لغة Common Lisp
disassembleوظيفة [10] تطبع على الإخراج القياسي الكود الأساسي لوظيفة محددة. تعتمد النتيجة على التنفيذ وقد يتم حلها إلى رمز ثنائي أو لا يتم حلها. يمكن استخدام فحصها لأغراض التصحيح والتحسين. [11] على سبيل المثال، تنتج لغة Common Lisp من Steel Bank :
( تفكيك ' ( 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
- يستخدم تطبيق Ericsson لـ Erlang أكواد البايت BEAM
- تعتبر الآلة الافتراضية (EVM) الخاصة بـ Ethereum بمثابة بيئة وقت التشغيل، والتي تستخدم الكود الثنائي الخاص بها، لتنفيذ المعاملات في Ethereum (العقود الذكية).
- لغات البرمجة Icon [12] و Unicon [13]
- استخدمت شركة Infocom جهاز Z-machine لجعل تطبيقاتها البرمجية أكثر قابلية للنقل
- بايت كود Java ، والذي يتم تنفيذه بواسطة الآلة الافتراضية Java
- شركة ايه اس ام
- بي سي إي إل
- جافاسيسيست
- البايت كود Keiko المستخدم بواسطة لغة البرمجة Oberon-2 لجعلها ونظام التشغيل Oberon أكثر قابلية للنقل.
- KEYB ، برنامج تشغيل لوحة مفاتيح MS-DOS / PC DOS مع ملف الموارد الخاص به KEYBOARD.SYS الذي يحتوي على معلومات التخطيط وتسلسلات p-code القصيرة التي ينفذها مفسّر داخل برنامج التشغيل المقيم. [14] [15]
- LLVM IR
- يتم تجميع لغة البرمجة النصية LSL المستخدمة في العوالم الافتراضية إلى كود ثنائي يعمل على جهاز افتراضي. تحتوي Second Life على الإصدار الأصلي Mono، كما طورت Inworldz إصدار Phlox.
- تستخدم لغة Lua آلة افتراضية للبايت كود تعتمد على السجل
- m-code للغة MATLAB [ 16]
- Malbolge هي لغة آلة غامضة لآلة افتراضية ثلاثية.
- كود Microsoft P المستخدم في Visual C++ و Visual Basic
- متعدد الخطط [17]
- كود O للغة البرمجة BCPL
- يتم تجميع لغة OCaml بشكل اختياري إلى نموذج بايت كود مضغوط
- p-code لتنفيذ UCSD Pascal للغة Pascal
- آلة الببغاء الافتراضية
- اختر BASIC ويشار إليه أيضًا باسم Data BASIC أو MultiValue BASIC
- توفر بيئة R للحوسبة الإحصائية مُجمِّعًا للبايت كود من خلال حزمة المُجمِّع، والتي أصبحت الآن قياسية مع إصدار R 2.13.0. من الممكن تجميع هذا الإصدار من R بحيث تستغله الحزم الأساسية والموصى بها. [18]
- لعبة المغامرات Pyramid 2000
- يتم تجميع نصوص Python عند تنفيذها إلى لغة البايت كود الخاصة بـ Python، ويتم تخزين الملفات المجمعة (.pyc) مؤقتًا داخل مجلد النص
- يمكن تحليل الكود المجمّع والتحقيق فيه باستخدام أداة مدمجة لتصحيح أخطاء البايت كود منخفض المستوى. يمكن تهيئة الأداة من الغلاف، على سبيل المثال:
>>> استيراد 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
- تنفيذ المخطط 48 باستخدام مُفسِّر البايت كود
- البايتات الخاصة بالعديد من تطبيقات لغة Smalltalk
- مُفسِّر الدوران المُدمج في متحكم Parallax Propeller
- يقوم محرك قاعدة بيانات SQLite بترجمة عبارات SQL إلى تنسيق بايت كود مخصص. [19]
- تفاحة سويت 16
- تي سي ال
- يتم استخدام TIMI بواسطة المترجمين على منصة IBM i .
- تيني بيسك
- يتم تجميع Visual FoxPro إلى بايت كود
- ويب أسيمبلي
- YARV و Rubinius لـ Ruby
- زد كود
- أكواد تشغيل Zend Engine لـ PHP
انظر أيضا
ملحوظات
- ^ تحتوي لغة PHP على التجميع الفوري في PHP 8، [5] [6] وما قبل ذلك بينما لم تكن مفعلة في الإصدار الافتراضي، كانت تحتوي على خيارات مثل HHVM . بالنسبة للإصدارات الأقدم من PHP: على الرغم من أن أكواد PHP يتم إنشاؤها في كل مرة يتم فيها تشغيل البرنامج، ويتم تفسيرها دائمًا ولا يتم تجميعها في الوقت المناسب .
مراجع
- ^ ab "Dynamic Machine Code Generation". Google Inc. مؤرشف من الأصل في 2017-03-05 . تم الاسترجاع 2023-02-21 .
{{cite web}}: CS1 maint: bot: original URL status unknown (link) - ^ "تنفيذ Lua 5.0".(ملاحظة: يتضمن هذا جهازًا افتراضيًا يعتمد على السجل.)
- ^ "Dalvik VM". مؤرشف من الأصل في 2013-05-18 . تم الاسترجاع 2012-10-29 .(ملاحظة: هذه الآلة الافتراضية تعتمد على السجل.)
- ^ "Byte Code Vs Machine Code". www.allaboutcomputing.net . تم الاسترجاع في 2017-10-23 .
- ^ O'Phinney, Matthew Weier. "استكشاف مُجمِّع PHP JIT الجديد". Zend بواسطة Perforce . تم الاسترجاع في 2021-02-19 .
- ^ "PHP 8: The JIT - stitcher.io". stitcher.io . تم الاسترجاع في 2021-02-19 .
- ^ Loitsch, Florian. "لماذا لا تكون آلة افتراضية بايت كود؟". Google . مؤرشف من الأصل في 2013-05-12.
- ^ "أسطورة JavaScript: JavaScript يحتاج إلى رمز ثنائي قياسي". 2ality.com .
- ^ G., Adam Y. (2022-07-11). "Berkeley Pascal". GitHub . تم الاسترجاع في 2022-01-08 .
- ^ "CLHS: تفكيك الدالة". www.lispworks.com .
- ^ "ضبط الأداء والنصائح". lispcookbook.github.io .
- ^ "تطبيق لغة برمجة الأيقونات" (PDF) . مؤرشف من الأصل (PDF) في 2016-03-05 . تم الاسترجاع 2011-09-09 .
- ^ "تطبيق الأيقونات واليونيكون في كتاب واحد" (PDF) . مؤرشف من الأصل (PDF) في 2022-10-09.
- ^ بول، ماتياس ر. (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 كيلوبايت للحصول على نفس مستوى الوظيفة باستثناء المترجم. […]
- ^ 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.)
- ^ "براءة اختراع الولايات المتحدة رقم 6,973,644". مؤرشف من الأصل في 2017-03-05 . تم الاسترجاع في 2009-05-21 .
- ^ مواصفات Microsoft C Pcode . ص. 13.
لم يتم تجميع
Multiplan إلى
كود آلي
، ولكن إلى نوع من الكود الثنائي الذي تم تشغيله بواسطة
مفسّر
، من أجل جعل Multiplan محمولاً عبر الأجهزة المتنوعة على نطاق واسع في ذلك الوقت. ميز هذا الكود الثنائي بين
تنسيق النقطة العائمة
الخاص بالآلة للحساب عليه، وتنسيق خارجي (قياسي)، وهو تنسيق
عشري مشفر ثنائيًا
(BCD). تم تحويل تعليمات PACK وUNPACK بين الاثنين.
- ^ "تثبيت وإدارة R". cran.r-project.org .
- ^ "محرك بايت كود SQLite". مؤرشف من الأصل في 2017-04-14 . تم الاسترجاع في 2016-08-29 .
