مقارنة برامج محاكاة التطبيقات

يشير برنامج محاكاة التطبيقات إلى كلٍ من الآلات الافتراضية للتطبيقات والبرامج المسؤولة عن تنفيذها. تُستخدم الآلات الافتراضية للتطبيقات عادةً لتمكين تشغيل رمز التطبيق (bytecode) بسلاسة على العديد من بنى الحواسيب وأنظمة التشغيل المختلفة. ويتم تشغيل التطبيق عادةً على الحاسوب باستخدام مترجم فوري أو ترجمة فورية (JIT). غالبًا ما توجد عدة تطبيقات للآلة الافتراضية الواحدة، يغطي كل منها مجموعة مختلفة من الوظائف.

مقارنة بين الآلات الافتراضية

يلخص الجدول هنا العناصر التي تهدف تصميمات الآلات الافتراضية إلى أن تكون فعالة من أجلها، وليس قائمة القدرات الموجودة في أي تطبيق.

آلة افتراضيةطراز الآلةإدارة الذاكرةأمان الكودمترجمنظام الإنتاج في الوقت المناسب (JIT)هجوم العمالقةالمكتبات المشتركةنموذج كائنات اللغة المشتركةالكتابة الديناميكية
بيئة تشغيل أندرويد (ART)يسجلأوتوماتيكينعمنعمنعمنعم؟نعمنعم
بيئة تشغيل اللغة المشتركة (CLR)كومةأوتوماتيكي أو يدوينعمنعمنعمنعمنعمنعمنعم
ديس ( الجحيم )يسجلأوتوماتيكينعمنعمنعمنعمنعمنعمنعم
DotGNU Portable.NETكومةأوتوماتيكي أو يدوينعمنعمنعمنعمنعمنعملا
نقطة اتصال JVMكومةأوتوماتيكينعمنعمنعمنعمنعمنعمنعم [ 1 ]
JikesRVMكومةأوتوماتيكينعمنعمنعمنعم؟نعمنعم
LLVMيسجليدويلانعمنعمنعمنعمنعملا
كثرة الوحيداتكومةأوتوماتيكي أو يدوينعمنعمنعمنعمنعمنعمنعم
ببغاءيسجلأوتوماتيكيلانعملا [ 2 ]نعمنعمنعمنعم
دالفيكيسجلأوتوماتيكينعمنعمنعملا؟لالا
صريركومةأوتوماتيكيلانعمنعملانعملانعم
BEAM ( إرلانج )يسجلأوتوماتيكي؟نعمنعمنعمنعمنعمنعم
MoarVMيسجلأوتوماتيكي؟نعمنعمنعمنعمنعمنعم
StoffelVM [ 3 ]يسجلأوتوماتيكينعملالانعملانعملا

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

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

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

يُتيح المُفسِّر تحميل البرامج المُكوَّنة من تعليمات افتراضية وتشغيلها فورًا دون الحاجة إلى ترجمة مُكلفة إلى تعليمات الآلة الأصلية. يُمكن تفسير أي آلة افتراضية قابلة للتشغيل، لذا يُشير تصنيف العمود هنا إلى ما إذا كان التصميم يتضمن آليات تفسير فعّالة (للاستخدام الشائع).

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

يشير التجميع المسبق (AOT) إلى الطريقة التقليدية لاستخدام مُجمِّع مُسبق لإنشاء مجموعة من التعليمات الأصلية التي لا تتغير أثناء تشغيل البرنامج. ولأن التجميع والتحسين المُكثَّفين قد يستغرقان وقتًا، فقد يبدأ تشغيل البرنامج المُجمَّع مُسبقًا أسرع من البرنامج الذي يعتمد على الترجمة الفورية (JIT) فقط. وقد خفَّفت تطبيقات JVM من تكلفة بدء التشغيل هذه من خلال التفسير الأولي لتسريع أوقات التشغيل، إلى حين إمكانية إنشاء أجزاء من التعليمات البرمجية الأصلية بواسطة JIT.

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

مقارنة تطبيقات الآلات الافتراضية

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

آلة افتراضيةاللغات المنفذةتعليقاتمترجمنظام الإنتاج في الوقت المناسب (JIT)لغة التنفيذSLOC
شعاعإرلانغ ، إكسير ، غليم ، مسماري ، إل إف إي ، كلوجيرل، لورلنعم [ 5 ]نعم [ 6 ]إرلانج، سي، سي++1561 ألفًا بما في ذلك رمز التحقق لمرة واحدة
بيئة تشغيل اللغة المشتركة (CLR)سي شارب ، سي++/CLI ، إف شارب ، في بي.نتلغة البايت كود هي CIL ؛ بيئة تشغيل .NET Core متوفرة على GitHubلانعمسي شارب، سي ++
أدوبي فلاش بلاير (ويعرف أيضا باسم تامارين )ActionScript ، SWF (تنسيق الملف)أداة تأليف مواقع الويب التفاعلية؛ يُطلق على رمز البايت اسم ActionScript Byte Code (.abc)نعمنعملغة سي++135 ألف (تم إصداره مبدئياً)
ديس ( الجحيم )ليمبومواصفات الجهاز الظاهرينعمنعمج15 ألف + 2850 لكل بنية JIT + 500 لكل نظام تشغيل مضيف
DotGNU -Portable.NETلغات واجهة سطر الأوامر، بما في ذلك: C#نسخة من وقت تشغيل اللغة المشتركةلانعمنسخة#
إلى الأمامإلى الأماميتم تبسيط الميزات، وعادة ما تشمل المجمع والمترجم والمفسرات على مستوى النص وعلى مستوى الملفات الثنائية، وأحيانًا المحرر والمصحح ونظام التشغيل؛ سرعة التجميع >20 SKLOC/S، وتتصرف بشكل مشابه لـ JIT.نعملافورث، مُجمِّع فورثمن 2.8 ألف إلى 5.6 ألف؛ أما التطبيقات المتقدمة والاحترافية فهي أصغر حجماً.
غلولكسأبلغ 6، أبلغ 7، وغيرهمنعملاتوجد تطبيقات متنوعة
HHVMPHP ، اختراقهي آلة افتراضية مفتوحة المصدر مصممة لتنفيذ البرامج المكتوبة بلغة Hack و PHP.نعمنعملغة C++، لغة OCaml
نقطة اتصالجافا ، كوتلين ، جيثون ، جروفي ، روبي ، سي ، سي++ ، كلوجر ، سكالا، وغيرها الكثيرتطبيق مرجعي لـ JVM من شركة Sun؛ OpenJDK : الكود مرخص بموجب رخصة GPL ؛ IcedTea : الكود والأدوات مرخصة بموجب رخصة GPLنعمنعمJDK و OpenJDK و IcedTea مع JIT العادي  : Java و C و C++ و ASM  ؛ IcedTea مع JIT "Zero"  : Java و C و C++يبلغ عدد خطوط HotSpot حوالي 6500 ألف خط؛ بينما يبلغ عدد اختبارات TCK حوالي 80 ألف اختبار وحوالي 1000 ألف خط.
رمزرمزيوفر الكود المصدري الأساسي كلاً من المفسر ونسخة غير مدعومة للترجمة إلى لغة C. أما كود وقت التشغيل، المشترك بين المترجم والمفسر، فهو مكتوب بلغة C معدلة تُسمى RTT.نعملاC، RTT (واجهة أمامية مخصصة للغة C، يتم توفيرها مع المصدر الأساسي لـ Icon).إجمالي حجم الملف حوالي 180 كيلوبايت. (من المصدر إلى البايت كود: حوالي 11 كيلوبايت، مترجم البايت كود: حوالي 46 كيلوبايت، iconc: حوالي 23 كيلوبايت، common/headers: حوالي 13 كيلوبايت، rtt: حوالي 15 كيلوبايت)
LLVMلغات البرمجة: C ، C++ ، Kotlin ، Objective-C ، Swift ، Ada ، Fortran ، Rustيدعم البرنامج إخراج البيانات بلغات MSIL وC وC++. كما يدعم إخراج البيانات بلغة بايت كود ActionScript بواسطة Adobe Alchemy. يُسمى بايت كود "LLVM Bytecode (.bc)"، بينما يُسمى التجميع "LLVM Assembly Language (*.ll)".نعمنعملغة سي++811 ألف [ 7 ]
لغة لوالغة لوانعمLuaJITج13 ألف + 7 آلاف LuaJIT
مزيج MMIXميكسال
كثرة الوحيداتلغات سطر الأوامر، بما في ذلك: C# و VB.NET و IronPython و IronRuby وغيرهانسخة من وقت تشغيل اللغة المشتركةنعمنعمنسخة2332 ألف
NekoVMNekoVM ، Haxeنعممعالجات x86 فقطج46 ألف
أوزأوز، أليس
آلة O-codeبي سي بي إل
آلة رمز pباسكالمعالج باسكال من جامعة كاليفورنيا في سان دييغو، الذي انتشر على نطاق واسع في أواخر السبعينيات بما في ذلك جهاز أبل 2نعملاالتجميع، باسكال
ببغاءبيرل 5 ، راكو ، NQP-rx، PIR ، PASM ، PBC ، BASIC ، bc ، C99 ، ECMAScript ، Lisp ، Lua ، m4 ، Tcl ، WMLScript ، XML ، وغيرهانعمنعمسي، بيرل111 ألف  C، 240 ألف  Perl
آلة بيرل الافتراضيةبيرلرمز العملية: سائر الأشجارنعملاسي، بيرل175 ألف  C، 9 آلاف  Perl
سي بايثونبايثوننعمج387 ألف سطر  بلغة C، 368 ألف  سطر بلغة بايثون، 10 آلاف  سطر بلغة التجميع، 31 ألف  سطر بلغة سايكو
باي بايبايثونتطبيق بايثون ذاتي الاستضافة ، الجيل التالي من Psycoنعمنعمبايثون
روبينيوسروبيآلة افتراضية لتطبيق روبي آخرنعمنعملغة C++، لغة Ruby
سيلفرلايتسي شارب ، في بي.نتنسخة مصغرة من إطار عمل Microsoft .NET تسمح بتشغيل التطبيقات في بيئة معزولة داخل المتصفحنعمنعملغة سي++7 ميجابايت (الإصدار الأول)
ScummVMحثالةمحرك ألعاب الكمبيوتر
SECDISWIM ، Lispkit Lisp
السنجابالسنجابنعمسكويرل_جيتلغة سي++12 ألف
أحاديث قصيرةأحاديث قصيرة
SQLiteرموز عمليات SQLiteمحرك قاعدة بيانات افتراضي
صريرحديث قصير غير واضحتطبيق استضافة ذاتية لآلة Squeak الافتراضية. دعم غني للوسائط المتعددة.نعمCog & Exuperyأحاديث جانبية/عامية110 ألف كلمة في برنامج سمول توك، وحوالي 300 ألف كلمة في برنامج سي
StoffelVM [ 8 ]ستوفيل لانغ [ 9 ]محرك تنفيذ حسابات متعدد الأطراف آمنلالاالصدأ~18.7 ألف صدأ لـ StoffelVM، ~11.2 ألف صدأ لـ StoffelLang
مقدمة SWIبرولوج: SWI-Prolog ، YAPنعملاج، SWI-Prolog
TraceMonkeyجافا سكريبتمستوحى من التامارينلانعملغة سي++173 ألف
ترو تايبترو تايبمحرك عرض الخطوطنعملاج (عادةً)
فالغريندملفات ثنائية x86 / x86-64فحص عمليات الوصول إلى الذاكرة وتسريباتها في نظام لينكسج467 ألف [ 10 ]
VisualWorksأحاديث قصيرةلانعمج
آلة افتراضية Vx32ثنائيات x86المحاكاة الافتراضية على مستوى التطبيق للتعليمات البرمجية الأصليةلانعم
واباآلة افتراضية للأجهزة الصغيرة، على غرار جافا
آلة روبي الافتراضية الأخرى ( YARV )روبيالآلة الافتراضية للتنفيذ المرجعي للغة روبي 1.9 والإصدارات الأحدثنعمنعمج
آلة Zالرمز Z
محرك زيندPHPنعملاج75 ألف

انظر أيضاً

مراجع

  1. "برنامج عملية مجتمع جافا (SM) - طلبات مواصفات جافا (JSRs): تفاصيل JSR رقم 292" . Jcp.org . تم الاطلاع عليه بتاريخ 4 يوليو 2013 .
  2. "JITRewrite – Parrot" . Trac.parrot.org . تم الاطلاع عليه بتاريخ 2013-07-04 .
  3. "تنفيذ StoffelVM" . وثائق Stoffel . تم الاطلاع عليه بتاريخ 30-01-2026 .
  4. وثائق Apple حول استخدام نظام التشغيل OS X لأرشيف Java المشترك
  5. "نظرة فاحصة على المترجم - Erlang/OTP" .
  6. "نظرة أولية على JIT - Erlang/OTP" .
  7. بنية مُجمِّع LLVM مؤرشفة بتاريخ 31 يوليو 2012 على موقع Wayback Machine ، ohloh.net، 30 نوفمبر 2011
  8. "تنفيذ StoffelVM" . وثائق Stoffel . تم الاطلاع عليه بتاريخ 30-01-2026 .
  9. ^ "نظرة عامة على StoffelLang" . توثيق ستوفيل . تم الاسترجاع 2026-01-30 .
  10. فالغريند ، ohloh.net، 30 نوفمبر 2011.