מכונה וירטואלית

במדעי המחשב, מכונה וירטואלית היא תוכנה היוצרת סביבה הנחוצה להפעלתה של תוכנה אחרת, מבלי שיהיה צורך במימוש פיזי של סביבה זו. מכונה וירטואלית משחררת את התוכנה המתבססת עליה מתלות בחומרה מסוימת, משום שכל חומרה שעליה תמומש המכונה הווירטואלית תאפשר את הפעלת התוכנה.

מכונה וירטואלית למערכות הפעלה

מכונה וירטואלית למערכות הפעלה מכונה גם "מחשב וירטואלי".

במחשב אישי

מכונה וירטואלית מאפשרת להריץ כמה מערכות הפעלה שונות על מחשב אחד, ואף בו זמנית. כך לדוגמה ניתן להריץ מערכת הפעלה לינוקס על מערכת הפעלה חלונות ולהפך. מכונה וירטואלית למערכת הפעלה במחשב אישי מקלה את השימוש הסימולטני בתוכנות וחומרות התואמות מערכות הפעלה שונות. מכונה כזו מתפקדת כחלון המדמה מחשב אישי עם מערכת הפעלה השונה מזו של שאר המחשב. האלטרנטיבות למכונה הווירטואלית הן התקנה של מספר מערכות ההפעלה על המחשב הפיזי ואתחול המחשב בכל פעם שרוצים לשנות סביבת עבודה (מסורבל מאוד), החלפה של חלק מהחומרות והתוכנות כך שכל היישומים יתאמו אותה מערכת הפעלה (יקר ולפעמים בלתי אפשרי) או קניית מחשב נוסף (יקר).
מכונה וירטואלית למערכת הפעלה חוסכת זמן וכסף, גם כאשר משתמשים בה בניסוי וטעייה לצורך לימוד או חקר תחזוקת מחשבים. כאשר מכונה וירטואלית כזו מתקלקלת בשל ניסוי לא מוצלח, ניתן על נקלה למחוק אותה ולהגדיר מכונה וירטואלית חדשה במקומה, מכיוון שהמכונה הווירטואלית מסתכמת למעשה בקובץ או מספר קובצי מחשב, תמיד ניתן לגבות קבצים אלו ולשכתב מחדש את המכונה הווירטואלית, זאת במקום לתקן או להחליף מחשב. שימוש נפוץ נוסף במכונה וירטואלית, הוא לבחינה של בתי תוכנה לתוכנה חדשה שהם מפיצים בסביבה נקייה, כדי לדמות תנאים שעלולים לשרור במחשבי לקוחות. כמו כן משתמש יכול לבחון תוכנה חדשה כאשר יש חשש לסיכון, אם בשל באגים או קוד זדוני שעלול לפגוע במחשב, בשל כך שהמכונה הווירטואלית רצה בסביבה "מנותקת" ממערכת ההפעלה הראשית.

במחשבים מרכזיים ובשרתים

חברת IBM הייתה ראשונה (בשנת 1972) ליישם את רעיון של מכונה וירטואלית במחשבים מרכזיים מסדרת 370, במערכת ההפעלה VM שמאז עברה הרבה מהדורות ונמצאת עד היום בשימוש בגרסה הקרויה z/VM. מערכת הפעלה זו מסוגלת להריץ תחתיה אלפי עותקים של מערכות הפעלה אחרות: MVS, VSE, LINUX ואף את מערכת ההפעלה VM בעצמה. כל מערכות ההפעלה האורחות מקבלות שירותים ממערכת ההפעלה VM, ומתנהגות כאילו בוצעו במחשב אמיתי. מערכת כזו חוסכת קנייה ותחזוקה של מחשבים רבים; היא מאפשרת למחשב אחד לפתוח מסופים רבים שמתפקדים כמחשבים בעלי מערכות הפעלה מגוונות או להפעיל תוכניות שירות שונות בסביבות שונות בו זמנית.
יתרון נוסף במכונה וירטואלית המצויה בשרת היא רציפות עבודת השרת למרות תיקונים והחלפות של החומרה. בזמן ששרת וירטואלי עובד על מחשב שיש לתחזק את החומרה שלו, נותנים לשרת הווירטואלי פקודה לעבור, בעזרת סיב אופטי, אל מחשב אחר. המעבר נעשה בלא הפסקה של מתן השירות ובסופו החומרה הישנה פנויה לעבודות תחזוקה.

רשת וירטואלית - ענן

רשת מקומית וירטואלית, המכונה גם ענן, עוצבה כדי לתת מענה לקושי הרב בניהול רשתות מחשבים מקומיות בגודל בינוני. רשתות אלה שייכות למשרדים בגודל בינוני שאינם יכולים להרשות לעצמם הוספה של מנהל רשת לצוות המשרד (בניגוד למשרדים גדולים) ואינם מחזיקים רשת פשוטה לתפעול ולאבטחת מידע (בניגוד למשרדים קטנים ובתים פרטיים). מה שהופך רשת כזו לקשה לתפעול הוא הצורך בשרת מקומי ובבקרה על פעולתם של משתמשים רבים, יחסית, ששגיאה שלהם יכולה לסכן את כלל מחשבי הרשת.
שימוש ברשתות מקומיות וירטואליות מאפשר קודם כל ריכוזיות ושכירת מנהל רשת אחד עבור רשתות רבות. שרתים מקומיים וירטואליים רבים מצויים בשרת אחד גדול, המצוי בחוות שרתים. כך שלמעשה, אין שרת מקומי במשרד והרשת המשרדית המקומית פרושה באופן המאפשר פרטיות ואבטחת מידע, דרך רשת האינטרנט.
היתרון השני של הרשתות המקומיות הווירטואליות על פני הרשתות המקומיות הגשמיות הוא אי תלות במיקום גאוגרפי. עובד שטס עם המחשב הנייד שלו לתקופת עבודה בחוץ לארץ, עדיין יכול להתחבר, כל בוקר, אל הרשת המקומית של המשרד.

מכונה וירטואלית לשפת תכנות

על מנת להריץ תוכנה על מחשב, יש לתרגם אותה משפת התכנות שבה נכתבה, לשפה אותה המחשב מסוגל להבין - שפת מכונה. בדרך כלל שפות המכונה מכילות מספר קטן של פקודות, וכל פקודה בהן מיוצגת על ידי רצף של אפסים ואחדות בלבד, מה שהופך כתיבת תוכניות בצורה ישירה בשפת מכונה למלאכה טכנית ומייגעת. על כן, רוב התוכנות נכתבות בשפות מתוחכמות יותר ונוחות יותר לשימוש אנושי, ולאחר מכן מתורגמות לשפת מכונה בידי תוכנה מיוחדת הנקראת מהדר. התהליך בו לוקח המהדר תוכנית הכתובה בשפת תכנות כלשהי ובונה ממנה תוכנה בשפת מכונה הניתנת להרצה על המחשב נקרא הידור.
מכיוון שלמחשבים שונים יש שפות מכונה שונות, תוכנה שהודרה בידי מהדר כך שתפעל על מחשב אחד אינה שמישה במחשב אחר, בעל שפת מכונה שונה. זוהי בעיה של תאימות, ושימוש במכונות וירטואליות הוא פתרון אפשרי לבעיה זו.
הדרך שבה מתגברות מכונות וירטואליות על בעיית תאימות היא על ידי כך שהתוכנית מהודרת לשפת ביניים, במקום לשפת מכונה. בזמן ריצה, המכונה הווירטואלית נכנסת לפעולה, ומתרגמת את שפת הביניים לשפת מכונה, בהתאם למחשב ולמערכת ההפעלה המותקנת עליו. כלומר, אם מתכנת כתב תוכנית ב-Java, בעת ההידור התוכנית תתורגם לשפת ביניים, שאותה מסוגלת המכונה הווירטואלית של Java להבין בלי תלות במחשב ובמערכת ההפעלה עליה היא מותקנת. בעת הרצת התוכנה, המכונה הווירטואלית תתרגם את התוכנית לשפה שהמחשב עליו היא רצה מבין. לפיכך ניתן להעביר תוכניות מהודרות בין מחשבים שונים ולקבל אותה תוצאה בסיום ההרצה. המכונה הווירטואלית תבטיח שהתוכנית תתבצע כראוי על כל אחד משני המחשבים.
מכונה וירטואלית, לפיכך, היא תוכנית מחשב, המקבלת כקלט הוראות הכתובות בשפת ביניים, מתרגמת אותן לשפת מכונה ומריצה אותן. להבדיל ממהדר, אשר מתרגם את התוכנית כולה בטרם ניתן יהיה להריץ אותה, המכונה הווירטואלית מבצעת את התרגום תוך כדי ההרצה עצמה, בדומה למפרש. חשוב להדגיש כי המכונה הווירטואלית לא מתרגמת שפה עילית לשפת ביניים. שלב זה מבוצע על ידי המהדר בשלב הידור התוכנית.
Java היא דוגמה בולטת לשפת תכנות המתבססת על מכונה וירטואלית. תוכנית מחשב שנכתבה בשפת Java מהודרת לא לשפת מכונה, שנועדה מטבעה לחומרה מסוימת, אלא ל-bytecode המתבצע על-גבי מכונה וירטואלית - (Java Virtual Machine (JVM. זו התכונה המאפשרת לתוכנית Java לרוץ על כל מערכת הפעלה בעלת JVM, מטלפונים סלולרים ועד למחשבי על. כך לדוגמה, יישומון Java המשולב בדף HTML יכול להתבצע במערכות ההפעלה Windows, Mac OS, לינוקס ואחרות, ללא כל צורך בהתאמה לאחת ממערכות ההפעלה, משום שבכל אחת ממערכות ההפעלה רץ היישומון על המכונה הווירטואלית JVM.
ארכיטקטורת NET. של מיקרוסופט מכילה אף היא רכיב החוצץ בין התוכנית המתבצעת לבין מערכת ההפעלה, המכונה Common Language Runtime (בקיצור CLR), ושפתו נקראת Common Intermediate Language (בקיצור CIL, "שפת ביניים משותפת"). רכיב זה מהווה למעשה מכונה וירטואלית, המפרידה בין החומרה לתוכנה. רכיב זה מאפשר לפתח בשפות שונות, כל עוד השפה מהודרת לקובץ היכול לרוץ על ה־CLR.

יתרונות וחסרונות

ניידות היא אחת מהבעיות הקשות עימן מתמודד עולם המחשוב כיום. מדי שנה מוציאים סכומים ניכרים על מנת להתמודד עימה. מכונה וירטואלית, מבחינה זו, פותרת בעיה זו. גם אם יומצא מחשב חדש אין צורך להדר את התוכנית מחדש. יש לכתוב מכונה וירטואלית עבור אותו מחשב, ומרגע זה הוא יוכל להריץ את כל התוכניות שהודרו למכונה וירטואלית מסוג זה.
עם זאת, תוכניות המורצות על ידי מכונה וירטואלית איטיות יותר, וזאת בשל הצורך לתרגם את התוכנית לשפת מכונה בכל הרצה.
על אף התקדמות רבה בשנים האחרונות, תוכניות שאמורות לפעול בזמן אמת עדיין מתורגמות לשפת מחשב על מנת לשפר את ביצועיהן. אמנם ברבות מהשפות המבוססות על מכונה וירטואלית ניתן להדר את התוכנית ישירות לשפת מכונה (ולא לשפת ביניים), אך בכך אובדת תכונת הניידות של השפה, החשובה מאד. על אף האמור, הקצאת זיכרון, לדוגמה, מתבצעת מהר יותר באמצעות מכונה וירטואלית.
בנוסף, מאחר שרוב התוכניות והספריות הקיימות היום מתורגמות כבר לשפת מחשב, שילובן בשפה המבוססת על מכונה וירטואלית חיונית, אך אינה דבר פשוט כלל ועיקר וקיימים מנגנונים מסובכים על מנת להתמודד עם בעיה זו.