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

yogevL

New member
זה,בערך גם מה שמטריד אותי

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

vinney

Well-known member
לא, אנחנו שאלנו שני דברים שונים

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

johnny d

New member
תחשוב על זה כך

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

vinney

Well-known member
אז רגע

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

johnny d

New member
ההגבלה היא מבחינת אופרטורים

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

vinney

Well-known member
אוקי, זה מה שלא היה ברור לי../images/Emo13.gif

תודה!
 

inbal76

New member
תרשה לי לחלוק על משהו שכתבת ../images/Emo13.gif

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

inbal76

New member
רק ההברה למנוע טעויות

אסמבלר זה מה שמתרגם את האסמבלי לשפת המכונה.
 

johnny d

New member
זה לא בדיוק נכון

יכולת של שפות בעולם המעשי תלוי בגודל ספריית הפונקציות שנכתבו אליהן. אותי זה לא ממש מעניין לצורת עניין המכונה הוירטואלית למרות שמן הסתם זה הופך שפה לשימושית יותר למתכנת מחשבים בתעשיה. בתיאוריה הנושא מאוד שונה, ויכולת הביטוי של שפה נמדד בעוצמת האופרטורים שהיא מספקת. כפי שכתבתי ניתן לכתוב תוכנית שנראת כאילו היא כתובה ב c# לאסמבלר כל עוד אומרים לאסמבלר להשתמש בקובץ מקרואים קטן כגודל כמה גיגה :) לעומת זאת ישנם אופרטורים בשפות גבוהות יותר (בעלות אופרטורים בעוצמה גבוהה יותר) שלא ניתן לעשות את ההמרה הזו לגביהן. על מנת להריץ תוכנית ב-c# נדרת מפרש שפת x86, לעומת זאת בכדי להריץ תוכנית פייטון נדרש Python byte code interpreter מכונה בעלת אופרטורים עם עוצמה גבוהה משמעותית יותר מ x86. אז כן מתכנת c# יוכל להנצל את כל הידע שלו ולכתוב תוכניות בפייטון בעזרת אותם הכלים שהוא כתב ב c#, אבל מתכנת פייטון שמנצל את עוצמת השפה לא יוכל לכתוב את האבסטרקציה של התוכנית ב c#. לעומת זאת כל אבסטרקציה ב c# (כולל classes) ניתן לפתח macroים שיאפשרו שימוש בכלים הנ"ל עבור מהדר אסמבלר....
 

inbal76

New member
ממש לא הבנתי

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

johnny d

New member
את צריכה להחליט מה הטענות שלך.

קודם כל רמת ההפשטה של Java ו- C# שונות בהחלט, Java הרבה יותר גבוהה מ- C#. כי אני לא יכול להרחיב asm ל- JAVA. ואם את חושבת שהרחבת שפה ע"י מקרואים הופכת אותה לשפה אחרת אז באמת אין על מה לדבר. בכל זאת, העניין לא ממש נתון לשיקול דעתך, סמנטיקה של שפת תכנות מאפשרת העשרה של הכלים לצורך הפשטת התוכנה שבונים. אחרת כל class שהיית מגדירה היה הופך את הקוד שלך לשפה חדשה, אין הרבה הבדל בין היעד class (של c) ל- macro ברמה ששניהם נועדו להרחיב את השפה ולאפשר הפשטה של התוכנה. למעשה מה שאת אומרת זה שכל פעם שאת מוסיף ספרית פונקציות חדשה, אתה למעשה ממציא שפה חדשה. p.s. לעומת זאת class ב lisp הוא אובייקט, ישות סמנטית שלא קיימת ב c#, והאופרטורים שאפשר להפעיל על הישויות האלו בתחשיב הלמדא עוצמתיים בכמה מידות ממה שאפשר לעשות ב c#. מה שאני אומר שסט הכלים התכנותיים שמציעים השפות: c#, c++, c, asm יכולים להיכתב בכל השפות האלו, לעומת java שאני יודע שיש בה כלים שלא ניתן לכתוב בשפות הקודמות, אם כי בjava ניתן לכתוב כלים שמאפרים כל פעולה של כלים מהשפות הקודמות. אם מביטים על python אז שוב יש בה כלים שאי אפשר לדמות ע"י כל השפות הקודמות (כולל java) . . . ו- lisp או scheme לעומת זאת מציעה הפשטה שמאפשרת כתיבת הכלים של כל השפות הקודמות והרבה מאוד יותר.
 

inbal76

New member
לא נראה לי שאנחנו מדברים באותם מושגים

מה זה "רמת הפשטה"? מבחינתך, אם הצלחתי להבין אותך נכון (ובהחלט יתכן שלא) - אם ניתן פקודה בשפה X להרחיב ל-n פקודות בשפה Y - אז יש להן אותה רמת הפשטה. מבחינתי רמת הפשטה זה מידת המרחק (האפשרית) שלך מהברזלים ומידת הקירבה שלך לשפה טבעית. אם בשפה X יש לך טיפוס מסוג String ויש לו אופרטורים ופונקציות כמו size, charAt, concat, reverse וכולי, ובשפה Y יש לך רק מערך, שאתה יכול לגשת לתא i שלו ולקרוא/לכתוב בו ערך, אז ברור שאפשר בשפה Y לממש את אותו הדבר שקיים בשפה X. אבל X ברמת הפשטה גבוהה יותר מ-Y. להתייחס לרכיב במעגל אלקטרוני כביט (0 או 1) = הפשטה. להתייחס לאוסף ביטים כמערך של בתים = הפשטה יותר גבוהה. להתייחס למערך של בתים כמחרוזת, או כמבנה נתונים אחר = הפשטה יותר גבוהה. שפות שונות מספקות לך רמת הפשטה שונה, כאשר C++, JAVA, #C וכדומה מספקות הפשטה גבוהה יותר משפת סף. אם אתה יכול לכתוב מאקרו באסמבלי שנקרא string ומממש מחרוזת בדיוק באותו אופן של ++C, אז זה סבבה, אבל הפקודות במאקרואים הלו אינן חלק משפת אסמבלי. יש הבדל בין מה שהוא חלק מהשפה, לבין מה שניתן לממש בשפה (שזה תמיד הרבה יותר מהשפה עצמה, אחרת לא היה טעם בשום תוכנית).
 

asm32

New member
בכללי...

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