JavaRush /בלוג Java /Random-HE /קוד מכונה וקוד בתים: באיזו שפה מדברת התוכנית שלך?

קוד מכונה וקוד בתים: באיזו שפה מדברת התוכנית שלך?

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

קוד המכונה

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

אי התאמה מולדת

יתרה מכך, לא כל המעבדים "מדברים" באותה שפה. ישנם הבדלים לא רק בין ארכיטקטורות CISC ו- RISC , אלא גם בתוך ה"מחנות" הללו.

CISC (Complex Instruction Set Computing) הוא תפיסה של עיצוב מעבד המתאפיין במערך המאפיינים הבא:

  • פקודות רבות, שונות באורכן;
  • מצבי פנייה רבים;
  • קידוד הוראות מורכב.
RISC (Reduced Instruction Set Computing) - מעבד עם ערכת הוראות מופחתת. הפקודות הן מאותו פורמט, קצרות, עם קידוד פשוט.
דורות חדשים של מעבדים מציגים סטים נוספים של הוראות שפשוט לא ידועות לדגמים מהדור הישן. בגלל זה, תוכניות הידור עבור ארכיטקטורה אחת (או דור אחד של מעבדים) אינן יכולות לפעול על חומרה אחרת. כל זה מאלץ אותנו להרכיב מחדש תוכניות כדי להבטיח שהן פועלות על מחשבים אחרים. עם זאת, עליך לבצע קומפילציה מחדש לא רק בגלל מעבדים, אלא גם בגלל הבדלים באינטראקציה של תוכניות ומערכת ההפעלה. בגללם אי אפשר להפעיל תוכנית "חלונות" תחת לינוקס, ותוכנית "לינוקס" תחת חלונות.

Bytecode

Bytecode דומה במובנים רבים לקוד מכונה, רק שהוא משתמש בסט של הוראות לא ממעבד אמיתי, אלא ממעבד וירטואלי. יתרה מכך, הוא עשוי לכלול קטעים המתמקדים בשימוש במהדר JIT , אשר מייעל את ביצוע הפקודות עבור המעבד האמיתי עליו פועלת התוכנית.
קומפילציה JIT (קומפילציה בדיוק בזמן, קומפילציה תוך כדי תנועה) או קומפילציה דינמית (תרגום דינמי) היא טכנולוגיה להגברת הביצועים של מערכות תוכנה המשתמשות ב-bytecode על ידי הידור של bytecode לקוד מכונה או לפורמט אחר באופן ישיר תוך כדי. התוכנית פועלת. "רשמית" בג'אווה עד גרסה 9 היה רק ​​מהדר JIT. ב-Java 9, הופיע מהדר נוסף, והוא מקמפל מבעוד מועד (AoT). תכונה זו מאפשרת קומפילציה של מחלקות Java לקוד מקורי לפני הפעלה על מחשב וירטואלי. תכונה זו נועדה לשפר את זמני ההפעלה עבור יישומים קטנים וגדולים כאחד, עם השפעה מוגבלת על ביצועי שיא.
עבור מעבדי CISC , ניתן לשלב הוראות מסוימות למבנים מורכבים יותר הנתמכים על ידי המעבד, ועבור RISC , להיפך, ניתן לפרק אותן לרצפים פשוטים יותר של הוראות.

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

עם זאת, קוד בתים מכיל לא רק הוראות מעבד. הוא מכיל גם היגיון לאינטראקציה עם מערכת הפעלה וירטואלית, מה שהופך את התנהגות האפליקציה לבלתי תלויה במערכת ההפעלה המשמשת במחשב. זה נראה בבירור ב- JVM , שבו עבודה עם קריאות מערכת ו- GUI הם לעתים קרובות בלתי תלויים במערכת ההפעלה שבה התוכנית פועלת. בגדול, ה-JVM מחקה השקה של תהליך תוכנית, בניגוד לפתרונות כמו Virtual Box , שיוצרים רק מערכת/חומרה וירטואלית.

האם JVM היחיד כזה?

בהחלט לא. אותו DotNet CLI הוא גם מכונה וירטואלית, המשמשת לרוב במחשבים שבהם פועל Windows עם מעבדים תואמים x86. עם זאת, יש את היישום שלו עבור מערכות אחרות: אפליקציות עבורו חייבות לפעול על Windows RT הפועלות על מעבדים תואמים ARM (RISC) , או שתוכל להפעיל אותם על Linux/OSX בסביבת Mono , שהיא צד שלישי (ולכן לא תואם לחלוטין) יישום של DotNet עבור פלטפורמות אלה. אז הפלטפורמה הזו, כמו ה- JVM , פועלת על מעבדים שונים ומערכות הפעלה שונות. יש עוד הרבה פתרונות דומים (ישנים וגם חדשים): LLVM , Flash SWF ואחרים. לשפות תכנות מסוימות יש מכונות וירטואליות משלהן. לדוגמה, CPython מרכיב מקורות PY לתוך קובצי PYC - קוד בתים הידור שמוכן להפעלה ב- PVM . או שיש דוגמה הרבה יותר ישנה - ניתן להרכיב את Lisp לקבצי FASL (Fast Load). למעשה, הם מכילים עץ AST שנבנה על ידי המחולל מקוד המקור. ניתן לקרוא ולהפעיל קבצים אלה על ידי מתורגמן Lisp בפלטפורמות שונות, או להשתמש בהם כדי ליצור קוד מכונה עבור ארכיטקטורת החומרה הנמצאת בשימוש כעת.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION