מה הרעיון של VIRTUAL MACHINE?

moshit75

New member
JVM

כאשר אתה מקמפל C++ על גבי מכונת WINDOWS, אתה יוצר EXECUTABLE שנועד לסביבת WINDOWS. כאשר אתה לוקח את אותו קוד מקור ומקמפל אותו על מכונת UNIX כלשהי, אתה יוצר EXECUTABLE שנועד לסביבת UNIX וכן הלאה. הקומפיילר מתרגם את קוד המקור לסביבת מערכת ההפעלה עליה מתבצע הקימפול. EXECUABLE שקומפל לWINDOWS לא יוכל לרוץ על UNIX או על כל מערכת הפעלה אחרת מלבד WINDOWS. כאשר אתה מקמפל JAVA, לפחות באופן תיאורתי, אתה יוצר EXECUTABLE שנועד לרוץ על גבי JVM ולא על גבי פלטפורמה ספציפית. ה JVM יכול להיות מותקן על WINDOWS, UNIX, או כל מערכת הפעלה אחרת. עבור ה EXECUTABLE זה לא משנה כי הוא "רואה" רק את ה JVM.
 

yogevL

New member
מה הרעיון של VIRTUAL MACHINE?

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

yogevL

New member
אבל איך מוודאים שכל מחשב "מבין" את ה JVM?

אנו חוזרים לאותה בעיה...
 

yogevL

New member
נו, אז מה עשינו פה?

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

vinney

Well-known member
כן, אבל את זה אתה עושה רק פעם אחת

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

inbal76

New member
אבל זה לא אתה שצריך לדאוג לזה.

SUN דואגים לזה בשבילך. ננסה להסביר מהתחלה: אם אתה מתכנת ב- ++C לדוגמה, ורוצה שיעבוד גם על ווינדוס וגם על לינוקס, לדוגמה, תצטרך לקמפל על כל מערכת הפעלה בנפרד. יותר גרוע מזה: יש חלקים של הקוד שיתכן שתצטרך לכתוב פעמיים, קוד שונה לכל מ"ה, כי הוא תלוי ב-API של המערכת ואינו בסטנדרט של השפה. אם אתה מתכנת ב-JAVA, אתה צריך לכתוב רק קוד אחד, ולקמפל אותו רק פעם אחת, איפה שאתה רוצה. ה-JVM הוא זה שיעשה את העבודה להתאים למערכת שעליה הוא רץ, וזאת בזמן הריצה. נכון, בתכל'ס מתבצעת אותה עבודה, אין פה קסמים. אבל מבחינתך כמתכנת נחסכה העבודה הקשה של לדאוג לפורטביליות, להכיר את ה-API של המ"ה השונות, להשיג כל מערכת שאתה רוצה לתמוך בה ולקמפל עליה וכולי.
 

yogevL

New member
נראה לי שהבנתי. אגב , שאלה נוספת:

האם הפקודה JAVAC מבצעת גם קומפילציה וגם LINKAGE?
 

inbal76

New member
אני חושבת שאין לזה משמעות.

ב-JAVA אין קימפול ולינקוג' במובן הרגיל, אלא תרגום לקוד ביניים (BYTE CODE). אפשר לקרוא קצת על מה קורה שם בדיוק, כי אני לא מתיימרת להיות מומחית לקומפיילר של JAVA ולא רוצה להטעות אותך
אבל אני לא חושבת שיש שם שלב שמקביל בדיוק לשלב הלינקג'.
 

johnny d

New member
אניח שאתה מדבר מכונות שאינן קיימות במציאות.

כי ישנם VM שמדמות מכונות שקיימות במציאות ואז היתרון שלהן זה שיש לך אפשרויות לעשות דברים שאתה לא יכול לעשות במציאות. בנוגע למכונות שאינן קיימות במציאות, אז הדמייה של המכונות האלו מאפשר עבודה מול מודלים מעניינים שלא ניתן ליצר אותם בדרך אחרת. דוגמה אחת לכך הן high level programming languages, כגון: python, ruby, scheme, השפות האלו מאפשרות תכנות קל ונוח על בסיס מודל חישובי שעוד לא נבנה, ולכן מתכנתים את המכונה שמריצה קוד שכזה. שים לב ששפה שדורשת קומפיילר אינה שונה באופיה, סיבוכיותה, ורמת ההפשטה שלה משפת היעד, לדוגמה C# שוות ערך ל assmebler לכל עניין, מכיוון שניתן ע"י Macro's לכתוב קוד מקביל לחלוטין ל C# ולהריץ אותו על מכונה כמו שהיא. שפות גבוהות (ואולי גם כאלו באמצע כמו java, אני לא מכיר את השפה) לא ניתנות לתרגום ישיר (כלומר ללא הדמיה) לשפת מחשב (asm). אם יש לך שאלה ספציפית יותר שאל...
 

yogevL

New member
למה אתה מתכוון באומרך "הדמיה"?

נאמר שאני יוצר CLASS ב JAVA המכיל שדות שונים. הקומפיילר יודע להקצות מקום בזיכרון לכל השדות, הלא כן? אז למה צריך את התיווך של ה VM?
 

Maha Vailo

New member
JVM

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

johnny d

New member
לא בזכרון של המחשב

מדובר על זכרון של המכונה הוירטואלית.
 

yogevL

New member
לא הבנתי

בכל מחשב,לא משנה מה מערכת ההפעלה שלו, ניתן למשל להתקין את הקומפיילר ++G של ++C. אני טועה? אם כך,מה הבעיה לקמפל ולהריץ את אותו הקוד בפלטפורמות שונות?
 

vinney

Well-known member
אותו קוד מקומפל

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

yogevL

New member
אז איפה נכנסת כאן ה VM?

הקומפיילר ++G הופך את הקוד שכתבתי לקוד אסמבלר. מה הבעיה לשלוח את קוד האסמבלר הנ"ל למשתמשים שונים?
 

moshit75

New member
JVM

כאשר אתה מקמפל C++ על גבי מכונת WINDOWS, אתה יוצר EXECUTABLE שנועד לסביבת WINDOWS. כאשר אתה לוקח את אותו קוד מקור ומקמפל אותו על מכונת UNIX כלשהי, אתה יוצר EXECUTABLE שנועד לסביבת UNIX וכן הלאה. הקומפיילר מתרגם את קוד המקור לסביבת מערכת ההפעלה עליה מתבצע הקימפול. EXECUABLE שקומפל לWINDOWS לא יוכל לרוץ על UNIX או על כל מערכת הפעלה אחרת מלבד WINDOWS. כאשר אתה מקמפל JAVA, לפחות באופן תיאורתי, אתה יוצר EXECUTABLE שנועד לרוץ על גבי JVM ולא על גבי פלטפורמה ספציפית. ה JVM יכול להיות מותקן על WINDOWS, UNIX, או כל מערכת הפעלה אחרת. עבור ה EXECUTABLE זה לא משנה כי הוא "רואה" רק את ה JVM.
 

yogevL

New member
אבל איך מוודאים שכל מחשב "מבין" את ה JVM?

אנו חוזרים לאותה בעיה...
 

johnny d

New member
אי אפשר לתרגם את הקוד לאסמבלר

ניתן להוכיח כי לא ניתן לתרגם ע"י מודל החלפה כלשהו (aka macro expansion) קוד של שפה גבוהה (לא בהכרח java, שוב אני לא מכיר את השפה) לקוד של מכונת RAM, לדוגמה assembler. ולכן קומפיילר לא יכול ליצר קוד מכונה של assembler שלא מכיל מכונה וירטואלית בתוכו, ואתה לא רוצה להפיץ עם כל פיסת תוכנה שאתה כותב מפרש פרטי משלה.
 

vinney

Well-known member
רגע, שאלה

אם אתה לא יכול לתרגם קוד של שפה גבוהה לקוד מכונה של מכונה X, איך בדיוק מכונה וירטואלית תעזור לך להריץ את הקוד על המכונה X? הרי בסופו של דבר, הוראות המכונה הוירטואלית מתורגמות לקוד מכונה X, כך שלמעשה מה שמכונה וירטואלית מסוגלת לעשות, ניתן גם לעשות ישירות, לא? איך יכול להיות, אם לשאול בפשטות, שמכונה וירטואלית לא טרנזיטיבית?
 
למעלה