**نرم‌افزار مجازی سازی برنامه‌ها** هم به ماشین‌های مجازی و هم به نرم‌افزارهای پیاده‌سازی آن‌ها اشاره دارد. ماشین‌های مجازی برنامه، معمولاً برای تبدیل کردن بایت کد به کد ماشین برای معماری‌های کامپیوتری و سیستم‌عامل‌های مختلف استفاده می‌شوند. برنامه معمولاً با استفاده از مفسر یا کامپایل درجا (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 | سی | نه | آری |

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

* مجازی سازی اپلیکیشن
* بستگی زبانی
* رابط عملکرد خارجی
* قرارداد تماس‌گرفتن
* دستکاری نام
* رابط برنامه‌نویسی کاربردی (API)
* واسط دودویی کاربردی (ABI)
* مقایسه نرم‌افزار مجازی سازی پلت فرم
* لیست موتورهای ECMAScript
* وب‌اسمبلی

منابع
-----

منابع
-----

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