مقایسه نرمافزار مجازیسازی اپلیکیشن
نرمافزار مجازی سازی برنامهها هم به ماشینهای مجازی و هم به نرمافزارهای پیادهسازی آنها اشاره دارد. ماشینهای مجازی برنامه، معمولاً برای تبدیل کردن بایت کد به کد ماشین برای معماریهای کامپیوتری و سیستمعاملهای مختلف استفاده میشوند. برنامه معمولاً با استفاده از مفسر یا کامپایل درجا (JIT) روی رایانه اجرا میشود. اغلب چندین پیادهسازی از یک ماشین مجازی وجود دارد که هر کدام ویژگیهای خاصی را دارا میباشند.
مقایسه ماشینهای مجازی
- ماشینها مجازی برای جاوا اسکریپت گنجانده نشدهاست. فهرست موتورهای ECMAScript را برای پیدا کردن آنها ببینید.
جدول زیر خلاصه ای از عناصری از کارآمدی ماشینها مجازی است، و لیستی از تمام تواناییهای موجود در هر پیادهسازی نیست!
ماشین مجازی | مدل ماشین | مدیریت حافظه | امنیت کد | مفسر | کامپیال درجا | کامپایل جلوتر از زمان | کتابخانههای اشتراکی | مدل شیء زبان مشترک | سیستم نوع پویا |
---|---|---|---|---|---|---|---|---|---|
ماشین زمان اجرا اندروید (آرت) (ART) | ماشین رجیستری (ثباتی) | خودکار | بله | بله | بله | بله | ؟ | بله | بله |
زمان اجرا زبان مشترک (CLR) | ماشین پشتهای | خودکار یا دستی | بله | بله | بله | بله | بله | بله | بله |
دیس (اینفرنو) | ماشین رچیستری (ثباتی) | خودکار | بله | بله | بله | بله | بله | بله | بله |
DotGNU
(.Net قابل حمل) | ماشین پشتهای | خودکار یا دستی | بله | بله | بله | بله | بله | بله | خیر |
ماشین مجازی جاوا (JVM) | ماشین پشتهای | خودکار | بله | بله | بله | بله | بله | بله | بله |
JikesRVM | ماشین پشتهای | خودکار | بله | بله | بله | بله | ؟ | بله | بله |
LLVM | ماشین رجیستری (ثباتی) | دستی | خیر | بله | بله | بله | بله | بله | خیر |
مونو | ماشین پشتهای | خودکار یا دستی | بله | بله | بله | بله | بله | بله | بله |
پروت | ماشین رجیستری (ثباتی) | خودکار | خیر | بله | خیر | بله | بله | بله | بله |
دالویک | ماشین رجیستری (ثباتی) | خودکار | بله | بله | بله | خیر | ؟ | خیر | خیر |
اسکوییک | ماشین پشتهای | خودکار | خیر | بله | بله | خیر | بله | خیر | بله |
BEAM (ارلنگ) | ماشین رجیستری (ثباتی) | خودکار | ؟ | بله | بله | بله | بله | بله | بله |
MoarVM | ماشین رجیستری (ثباتی) | خودکار | ؟ | بله | بله | بله | بله | بله | بله |
دادهها پردازش دستورالعملها ماشین مجازی در متغیرهای محلی از یک مدل محاسبات استفاده میکنند، که معمولاً یک ماشین پشتهای، ماشین ریجیستری (ثباتی)، یا ماشین دسترسی تصادفی(RAMachine) است که اغلب به نام ماشین حافظه نامیده میشوند. استفاده از این سه ماشین باعث ایجاد انگیزهها مختلف شدهاست و ایجاد برتریهایی در ماشینهای مجازی در مقابل ماشینهای فیزیکی، مانند سهولت در تفسیر، کامپایل و تأیید برای امنیت میشود.
مدیریت حافظه در این ماشینهای مجازی قابل حمل در سطح بالاتری از انتزاع نسبت به ماشینهای فیزیکی آدرس دهی میشود. برخی از ماشینهای مجازی مانند ماشین جاوا (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 | سی ++ و سی شارپ | بله | خیر |
فلش پلیر | ActionScript, SWF | سی ++ | بله | بله |
Dis (Inferno) | Limbo | سی | بله | بله |
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, Alice | |||
O-code machine | BCPL | |||
p-code machine | Pascal | |||
Parrot | Perl 5, Raku, NQP-rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML | سی و پرل | بله | بله |
Perl virtual machine | Perl | سی و پرل | خیر | بله |
CPython | Python | سی | فقط Psyco | بله |
PyPy | Python | پایتون | بله | بله |
Rubinius | Ruby | سی ++ و روبی | بله | بله |
Silverlight | C#, VB.NET | سی ++ | بله | بله |
ScummVM | Scumm | |||
SECD | ISWIM, Lispkit Lisp | |||
Squirrel | Squirrel | سی ++ | Squirrel_JIT | بله |
Smalltalk | Smalltalk | |||
SQLite | SQLite opcodes | |||
Squeak | Squeak Smalltalk | Smalltalk/Slang | بله | بله |
SWI-Prolog | Prolog: SWI-Prolog, YAP | سی و SWI-Prolog | خیر | بله |
TraceMonkey | JavaScript | سی ++ | بله | خیر |
TrueType | 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
- WebAssembly
منابع
https://en.wikipedia.org/wiki/Comparison_of_application_virtualization_software
منابع
- ↑ «The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 292». jcp.org. دریافتشده در ۲۰۲۱-۱۲-۱۲.
- ↑ «JITRewrite – Parrot». trac.parrot.org. دریافتشده در ۲۰۲۱-۱۲-۱۲.
- ↑ Apple docs on OS X use of Java Shared Archive