ماشین مجازی
در علم کامپیوتر ماشین مجازی است که بر روی یک کامپیوتر پیاده‌سازی می‌شود. این پیاده‌سازی به‌گونه‌ای است که تصور می‌شود یک کامپیوتر واقعی در حال اجرای برنامه‌های ماست.
یک ماشین مجازی، در ابتدا توسط Popek and Goldberg به صورت «یک نسخه کپی شده از روی یک ماشین واقعی، به صورت کارا و ایزوله شده» تعریف شد. استفاده‌های کنونی، ماشین‌های مجازی‌ای را شامل می‌شود که هیچ ارتباط با سخت‌افزار واقعی ندارند.
ماشین‌های مجازی، بر اساس استفاده و درجه ارتباط به ماشین واقعی، به دو دسته اصلی تقسیم می‌شوند. یک ماشین مجازی سیستمی یک زیرساخت محاسباتی کامل را فراهم می‌کند که از اجرای یک سیستم‌عامل کامل پشتیبانی می‌کند. در مقابل، یک ماشین مجازی فرایند، برای اجرای یک برنامه واحد طراحی شده، که این به این معناست که صرفاً از یک فرایند خاص پشتیبانی می‌کند. یک ویژگی مهم یک ماشین مجازی، این است که نرم‌افزاری که درون آن در حال اجراست، با منابع و سطوح انتزاعی که توسط ماشین مجازی اعمال می‌شود، محدود شده‌است – یعنی نمی‌تواند از دنیای مجازی خود خارج شود. ماشین های مجازی می توانند فعالیت های خاصی را انجام دهند که انجام دادن آنها در محیط میزبان بسیار خطرناک است ، مانند دسترسی به داده های آلوده به ویروس یا آزمایش سیستم عامل ها. از آنجا که ماشین مجازی از بقیه سیستم جدا شده است ، نرم افزار داخل ماشین مجازی نمی تواند کامپیوتر میزبان را دستکاری کند.
ماشین مجازی سیستمی و ماشین مجازی فرایند به دهه ی 60 میلادی بازمی‌گردند و همچنان درحال توسعه می‌باشند.
ماشین‌های مجازی سیستمی از سیستم‌های اشتراک زمانی ایجاد شدند به ویژه که این سیستم‌ها در سیستم اشتراک زمانی سازگار یا CTSS پیاده سازی شدند. اشتراک زمانی به کاربرها این اجازه را می‌دهد که از یک کامپیوتر به صورت هم زمان استفاده کنند به طوری که به نظر می‌رسد هر برنامه دسترسی کامل به ماشین دارد اما در حقیقت تنها یک برنامه در یک لحظه در حال اجرا می‌باشد به صورتی که سیستم در فاصله‌های زمانی بین برنامه‌ها تعویض انجام می‌دهد که هر بار باعث صرفه جویی و بازیابی حالت می‌شود. این مطلب در قالب ماشین‌های مجازی تکامل یافت به خصوص به وسیله‌ی سیستم‌های تحقیقاتی شرکت IBM مانند سیستم M44/44X که از مجازی سازی جزئی استفاده می‌کرد و CP_40 و SIMMON که از مجازی سازی کامل استفاده می‌کردند و نمونه‌های اولیه‌ی هایپروایزرها بودند. اولین معماری ماشین مجازی که به طور گسترده در دسترس قرار گرفت CP-67/CMS بود (برای دسترسی به اطلاعات بیشتر به تاریخچه‌ی CP/CMS رجوع کنید). یک تمایز مهم بین استفاده از چند ماشین مجازی بر روی یک سیستم میزبان برای اشتراک زمانی مثلاً در M44/44X و CP_40 و استفاده از یک ماشین مجازی بر روی یک سیستم میزبان برای نمونه سازی مثلاً در SIMMON وجود داشت. برابرسازها که وظیفه ی شبیه سازی سخت افزار سیستم‌های قبلی برای سازگاری را دارند به مانند System/360 IBM در سال 1963 بوجود آمدند. این در حالی است که شبیه سازی نرم‌افزار (که آن زمان به نام "simulation" شناخته می‌شد) به قبل از آن بازمی‌گردد.
ماشین‌های مجازی فرایند در ابتدا به عنوان زمینه‌های انتزاعی برای یک زبان میانی استفاده شده به عنوان نمایش میانی یک برنامه به وسیله ی یک کامپایلر به وجود آمدند که نمونه‌های اولیه آن به سال 1966 بازمی‌گردند. یک نمونه ی اولیه در سال 1966 ماشین O_code بود که یک ماشین مجازی است که O_code (کد شئ) خارج شده از جلوبندی کامپایلر بی سی پی ال را اجرا می‌کند. این انتزاعی سازی این اجازه را به کامپایلر می‌داد که به راحتی به یک معماری جدید انتقال یابد و این کار به وسیله ی پیاده سازی یک عقب بندی جدید که کد شئ موجود را تبدیل به کد ماشین برای ماشین فیزیکی فعلی می‌کرد، انجام می‌شد. زبان اویلر از یک طراحی مشابه برخوردار است و زبان میانی آن P می‌باشد. این مطلب درحدود سال 1970 به وسیله ی پاسکال (زبان برنامه‌نویسی) عمومیت یافت به خصوص در سیستم پاسکال_پی (1973) و کامپایلر پاسکال_اس (1975) که در آن‌ها پی_کد نامیده شد و ماشین حاصل ماشین پی_کد نامیده شد. این مطلب تاثیر گذار بوده‌است و ماشین‌های مجازی از این نظر به طور کلی ماشین پی_کد خوانده می‌شوند. پی_کد پاسکال علاوه بر یک زبان میانی بودن، به صورت مستقیم به وسیله ی یک مفسر که ماشین مجازی را پیاده سازی می‌کند، اجرا می‌شود به خصوص در پاسکال UCSD (1978). این مطلب مفسرهای بعدی به خصوص ماشین مجازی جاوا را تحت تاثیر قرار داد. یک مثال ابتدایی دیگر SNOBLO4 (1967) می‌باشد که به زبان پیاده سازی اسنوبول نوشته شده‌است. SNOBLO4 یک زبان اسمبلی برای یک ماشین مجازی است و پس از آن ماشین‌های فیزیکی را با ترنسپایل کردن اسمبلر محلی به وسیله ی اسمبلرهای سطح-بالا مورد هدف قرار داد. با این وجود از آن زمان اسمبلرهای سطح_بالا از رده خارج شده‌اند در نتیجه این روش کمتر تاثیرگذار بوده‌است. ماشین‌های مجازی فرایند، رویکردی محبوب برای پیاده سازی نرم‌افزارهای میکرو کامپیوترهای اولیه مانند تاینی بیسیک و بازی‌های ماجراجویی بودند و از پیاده سازی‌های یک باره مانند Pyramid 2000 گرفته تا یک موتور همه منظوره مانند z-machine شرکت Infocom که به گفته ی گراهام نلسون "شاید بیشترین میزان قابل حمل بودن برای یک ماشین مجازی " را داراست را پیاده سازی می‌کردند.
پیشرفت‌های قابل توجهی در پیاده سازی اسمال تاک – 80 رخ داد به خصوص پیاده سازی دویچ/شیفمان که کامپایل در جا را به عنوان رویکرد پیاده سازی که از ماشین مجازی فرایند استفاده می‌کند، به جلو راند. از دیگر ماشین‌های مجازی قابل توجه اسمال تاک می‌توان VisualWorks، Strongtalk و Squeak را نام برد. زبان مرتبط دیگری که نوآوری‌های بسیاری را در زمینه ی ماشین‌های مجازی ایجاد کرد زبان برنامه نویسی سلف می‌باشد که بهینه سازی تطبیقی و جمع آوری زباله‌های نسلی را پایه گذاری کرد. این تکنیک‌ها از نظر تجاری مثلاً در ماشین مجازی جاوای هات اسپات (سال 1999) موفق بودند. نوآوری‌های دیگر شامل استفاده از ماشین مجازی مبتنی بر ثبات برای تطابق بهتر با سخت افزار اصلی، به جای استفاده از ماشین مجازی مبتنی بر پشته که تطابق نزدیک تری با زبان برنامه نویسی دارد، می‌باشد؛ این مطلب در سال 1995 به وسیله ی ماشین مجازی دیس برای زبان برنامه نویسی لیمبو پایه گذاری شد.OpenJ9 یک جایگزین برای ماشین مجازی جاوا HotSpot در OpenJDK می‌باشد و یک پروژه ی منبع_باز اکلیپس می‌باشد که مدعی استارتاپ بهتر و استفاده از منابع کمتر در مقایسه با HotSpot می‌باشد.