مقایسه نرم‌افزار مجازی‌سازی اپلیکیشن

نرم‌افزار مجازی سازی برنامه‌ها هم به ماشین‌های مجازی و هم به نرم‌افزارهای پیاده‌سازی آن‌ها اشاره دارد. ماشین‌های مجازی برنامه، معمولاً برای تبدیل کردن بایت کد به کد ماشین برای معماری‌های کامپیوتری و سیستم‌عامل‌های مختلف استفاده می‌شوند. برنامه معمولاً با استفاده از مفسر یا کامپایل درجا (JIT) روی رایانه اجرا می‌شود. اغلب چندین پیاده‌سازی از یک ماشین مجازی وجود دارد که هر کدام ویژگی‌های خاصی را دارا می‌باشند.

مقایسه ماشین‌های مجازی ویرایش

ماشین‌ها مجازی برای جاوا اسکریپت گنجانده نشده‌است. فهرست موتورهای ECMAScript را برای پیدا کردن آنها ببینید.

جدول زیر خلاصه ای از عناصری از کارآمدی ماشین‌ها مجازی است، و لیستی از تمام توانایی‌های موجود در هر پیاده‌سازی نیست!

ماشین مجازی مدل ماشین مدیریت حافظه امنیت کد مفسر کامپیال درجا کامپایل جلوتر از زمان کتابخانه‌های اشتراکی مدل شیء زبان مشترک سیستم نوع پویا
ماشین زمان اجرا اندروید (آرت) (ART) ماشین رجیستری (ثباتی) خودکار آری آری آری آری ؟ آری آری
زمان اجرا زبان مشترک (CLR) ماشین پشته‌ای خودکار یا دستی آری آری آری آری آری آری آری
دیس (اینفرنو) ماشین رچیستری (ثباتی) خودکار آری آری آری آری آری آری آری
DotGNU

(.Net قابل حمل)

ماشین پشته‌ای خودکار یا دستی آری آری آری آری آری آری نه
ماشین مجازی جاوا (JVM) ماشین پشته‌ای خودکار آری آری آری آری آری آری آری[۱]
JikesRVM ماشین پشته‌ای خودکار آری آری آری آری ؟ آری آری
LLVM ماشین رجیستری (ثباتی) دستی نه آری آری آری آری آری نه
مونو ماشین پشته‌ای خودکار یا دستی آری آری آری آری آری آری آری
پروت ماشین رجیستری (ثباتی) خودکار نه آری نه[۲] آری آری آری آری
دالویک ماشین رجیستری (ثباتی) خودکار آری آری آری نه ؟ نه نه
اسکوییک ماشین پشته‌ای خودکار نه آری آری نه آری نه آری
BEAM (ارلنگ) ماشین رجیستری (ثباتی) خودکار ؟ آری آری آری آری آری آری
MoarVM ماشین رجیستری (ثباتی) خودکار ؟ آری آری آری آری آری آری

داده‌ها پردازش دستورالعمل‌ها ماشین مجازی در متغیرهای محلی از یک مدل محاسبات استفاده می‌کنند، که معمولاً یک ماشین پشته‌ای، ماشین ثبت، یا ماشین دسترسی تصادفی است که اغلب به نام ماشین حافظه نامیده می‌شوند. استفاده از این سه ماشین باعث ایجاد انگیزه‌ها مختلف شده‌است و ایجاد برتری‌هایی در ماشین‌های مجازی در مقابل ماشین‌های فیزیکی، مانند سهولت در تفسیر، کامپایل و تأیید برای امنیت می‌شود.

مدیریت حافظه در این ماشین‌های مجازی قابل حمل در سطح بالاتری از انتزاع نسبت به ماشین‌های فیزیکی آدرس دهی می‌شود. برخی از ماشین‌های مجازی مانند ماشین جاوا (JVM)، با آدرس‌ها به گونه‌ای درگیر هستند که با اجازه دادن به ماشین مجازی برای ردیابی ارجاع‌های اشاره‌گر، و غیرمجاز ساختن اشاره‌گرها دستی به حافظه، به مدیریت حافظه خودکار ایمن مجهز می‌شوند. سایر ماشین‌های مجازی، مانند LLVM، بیشتر شبیه ماشین‌های فیزیکی سنتی هستند که امکان استفاده مستقیم و دستکاری نشانگرها را فراهم می‌کنند. زبان متوسط معمولی (CIL) ترکیبی را در این بین ارائه می‌دهد که به هر دو امکان استفاده کنترل‌شده از حافظه را می‌دهد (مانند JVM، که مدیریت خودکار حافظه را امکان‌پذیر می‌کند)، در حالی که حالت «ناامن» را امکان‌پذیر می‌سازد که امکان دستکاری اشاره‌گرها را مستقیماً به روش‌هایی که می‌تواند مرزها تایپ متغیرها را نقض کند، مجوزهایی می‌دهد.

امنیت کد، به‌طور کلی به توانایی ماشین مجازی قابل حمل، برای اجرای کد در حالی که تنها مجموعه ای از توانایی‌ها را به کد ارائه می‌دهد، اشاره دارد. به عنوان مثال، ماشین مجازی ممکن است فقط به کد اجازه دسترسی به مجموعه خاصی از توابع یا داده‌ها را بدهد. کنترلرهای یکسانی بر روی پوینترها که مدیریت خودکار حافظه را ممکن می‌سازند و به ماشین مجازی اجازه می‌دهد از دسترسی ایمن به داده‌ها اطمینان حاصل کند، استفاده می‌شود. علت دیگر این کنترلرها این است که اطمینان حاصل شود که یک قطعه کد فقط به عناصر خاصی از حافظه دسترسی دارد و نمی‌تواند ماشین مجازی را دور بزند. سپس سایر مکانیسم‌های امنیتی به عنوان تأیید کننده کد، تأیید کننده پشته و سایر روش‌ها در بالای این کنترلرها قرار می‌گیرند.

یک مفسر اجازه می‌دهد تا برنامه‌های ساخته شده از دستورالعمل‌های مجازی بلافاصله بدون کامپایل پرهزینه در دستورالعمل‌های ماشین بومی بارگیری و اجرا شوند. هر ماشین مجازی که می‌تواند اجرا شود را می‌توان تفسیر کرد، بنابراین تعیین ستون در اینجا به این اشاره دارد که آیا طرح شامل مقرراتی برای تفسیر کارآمد (برای استفاده رایج) است یا خیر.

کامپایل درجا (JIT)، به روشی برای کامپایل کردن کد ماشین در کمترین زمان ممکن، معمولاً بلافاصله قبل یا در حین اجرای برنامه گفته می‌شود. چالش JIT بیشتر یک پیاده‌سازی است تا طراحی ماشین مجازی، با این حال، طراحی‌های مدرن کامپایلر شروع به ملاحظاتی برای کارایی برنامه کرده‌اند. ساده‌ترین روش JIT مانند کامپایل برنامه در یک کامپایلر آفلاین است. با این حال، اغلب از روش‌های پیچیده‌تری استفاده می‌شود که قطعات کد کامپایل‌شده را به بخش‌هایی(fragments) که فقط در زمان اجرا شناخته می‌شوند، اختصاص می‌دهند (به بهینه‌سازی تطبیقی مراجعه کنید).

کامپایل جلوتر از زمان (AOT) به روش کلاسیک تری استفاده از پیش کامپایلر برای تولید مجموعه ای از کد ماشین اشاره دارد که در طول زمان اجرای برنامه تغییر نمی‌کنند. از آنجا که کامپایل و بهینه‌سازی تهاجمی می‌تواند زمان بر باشد، یک برنامه از پیش کامپایل شده ممکن است سریعتر از برنامه ای که برای اجرا به JIT تنها متکی است راه اندازی شود. پیاده‌سازی JVM این هزینه راه‌اندازی را با تفسیر اولیه برای سرعت بخشیدن به زمان راه‌اندازی کاهش داده‌است تا زمانی که قطعات(fragments) کد ماشین توسط JIT تولید شوند.

کتابخانه‌های اشتراکی(Shared Library)توانایی ای برای استفاده مجدد از بخش‌های کد ماشین در چندین برنامه در حال اجرا هستند. در سیستم عامل‌های مدرن، این به‌طور کلی به معنای استفاده از حافظه مجازی برای به اشتراک گذاشتن صفحات حافظه(Memory Pages) حاوی یک کتابخانه مشترک در میان فرآیندهای مختلف است که از طریق روش‌ها حفاظت از حافظه محافظت می‌شوند. جالب است که روش‌های تهاجمی JIT مانند بهینه‌سازی تطبیقی اغلب قطعات کدی را تولید می‌کنند که برای اشتراک‌گذاری در بین فرایندها یا اجرای متوالی برنامه نامناسب هستند، که مستلزم یک معاوضه بین کارایی کد از پیش کامپایل شده و کد مشترک و مزایای کدهای تخصصی تطبیقی است. برای مثال، چندین مفاد طراحی CIL وجود دارد تا امکان کتابخانه‌های مشترک کارآمد را فراهم کند، احتمالاً به قیمت کد JIT تخصصی تر. پیاده‌سازی JVM در OS X از یک آرشیو مشترک جاوا[۳] برای ارائه برخی از مزایای کتابخانه‌های مشترک استفاده می‌کند.


مقایسه پیاده‌سازی‌ها ماشین مجازی برنامه‌ها ویرایش

علاوه بر ماشین‌های مجازی قابل حمل که در بالا توضیح داده شد، ماشین‌های مجازی اغلب به‌عنوان یک مدل اجرایی برای زبان‌های برنامه‌نویسی جداگانه، معمولاً توسط یک مفسر استفاده می‌شوند. این جدول پیاده‌سازی‌های ماشین مجازی خاص، هم ماشین‌های مجازی قابل حمل بالا و هم ماشین‌های مجازی به زبان اسکریپت را فهرست می‌کند.

ماشین مجازی زبان زبان پیاده‌سازی کامپایل درجا مفسر
زمان اجرا زبان مشترک (CLR) C#, C++/CLI, F#, VB.NET سی ++ و سی شارپ آری نه
فلش پلیر اکشن‌اسکریپت, SWF سی ++ آری آری
Dis (Inferno) لیمبو سی آری آری
DotGNU-Portable.NET زبان‌ها CLR آری نه
Forth Forth فورث و اسمبلر فورث نه آری
Glulx Inform 6و Inform 7 چندین مدل پیاده‌سازی نه آری
HHVM PHP, Hack سی ++, OCaml آری آری
Icon Icon سی نه آری
JVM Java, Kotlin, Jython, Groovy, JRuby, C, C++, Clojure, Scala ,.. سی و سی ++ و جاوا آری آری
LLVM C, C++, Kotlin, Objective-C, Swift, Ada, Fortran, Rust سی ++ آری آری
Lua Lua سی LuaJIT آری
MMIX MMIXAL
Mono زبان‌ها CLR سی و سی شارپ آری آری
NekoVM Neko و Haxe سی فقط x86 آری
Oz Oz, آلیس
O-code machine BCPL
p-code machine پاسکال
Parrot Perl 5, Raku, NQP-rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML سی و پرل آری آری
Perl virtual machine پرل سی و پرل نه آری
CPython پایتون سی فقط Psyco آری
PyPy Python پایتون آری آری
Rubinius Ruby سی ++ و روبی آری آری
مایکروسافت سیلورلایت C#, VB.NET سی ++ آری آری
ScummVM Scumm
SECD ISWIM, Lispkit Lisp
Squirrel Squirrel سی ++ Squirrel_JIT آری
Smalltalk Smalltalk
SQLite اس‌کیوال لایت، opcodes
Squeak Squeak Smalltalk Smalltalk/Slang آری آری
SWI-Prolog Prolog: SWI-Prolog, YAP سی و SWI-Prolog نه آری
TraceMonkey جاوااسکریپت سی ++ آری نه
TrueType تروتایپ سی (عموماً) نه آری
Valgrind کد ماشینx86 و x86-64 سی
VisualWorks Smalltalk سی آری نه
Vx32 virtual machine کد ماشین x86 آری نه
Waba
Yet Another Ruby VM (YARV) Ruby سی آری آری
Z-machine Z-Code
Zend Engine PHP سی نه آری

جستارهای وابسته ویرایش

منابع ویرایش

https://en.wikipedia.org/wiki/Comparison_of_application_virtualization_software

منابع ویرایش

  1. «The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 292». jcp.org. دریافت‌شده در ۲۰۲۱-۱۲-۱۲.
  2. «JITRewrite – Parrot». trac.parrot.org. دریافت‌شده در ۲۰۲۱-۱۲-۱۲.
  3. Apple docs on OS X use of Java Shared Archive