مقارنة برامج محاكاة التطبيقات
يشير برنامج محاكاة التطبيقات إلى كلٍ من الآلات الافتراضية للتطبيقات والبرامج المسؤولة عن تنفيذها. تُستخدم الآلات الافتراضية للتطبيقات عادةً لتمكين تشغيل رمز التطبيق (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، وغيرهم | نعم | لا | توجد تطبيقات متنوعة | ||
| HHVM | PHP ، اختراق | هي آلة افتراضية مفتوحة المصدر مصممة لتنفيذ البرامج المكتوبة بلغة 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 ألف |
| NekoVM | NekoVM ، 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 | حثالة | محرك ألعاب الكمبيوتر | ||||
| SECD | ISWIM ، 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 ألف |
انظر أيضاً
مراجع
- ↑ "برنامج عملية مجتمع جافا (SM) - طلبات مواصفات جافا (JSRs): تفاصيل JSR رقم 292" . Jcp.org . تم الاطلاع عليه بتاريخ 4 يوليو 2013 .
- ↑ "JITRewrite – Parrot" . Trac.parrot.org . تم الاطلاع عليه بتاريخ 2013-07-04 .
- ↑ "تنفيذ StoffelVM" . وثائق Stoffel . تم الاطلاع عليه بتاريخ 30-01-2026 .
- ↑ وثائق Apple حول استخدام نظام التشغيل OS X لأرشيف Java المشترك
- ↑ "نظرة فاحصة على المترجم - Erlang/OTP" .
- ↑ "نظرة أولية على JIT - Erlang/OTP" .
- ↑ بنية مُجمِّع LLVM مؤرشفة بتاريخ 31 يوليو 2012 على موقع Wayback Machine ، ohloh.net، 30 نوفمبر 2011
- ↑ "تنفيذ StoffelVM" . وثائق Stoffel . تم الاطلاع عليه بتاريخ 30-01-2026 .
- ^ "نظرة عامة على StoffelLang" . توثيق ستوفيل . تم الاسترجاع 2026-01-30 .
- ↑ فالغريند ، ohloh.net، 30 نوفمبر 2011.
- مقارنات البرامج
- برامج المحاكاة الافتراضية
