כמה שאלות דחופות על JAVA

hmddd

New member
כמה שאלות דחופות על JAVA

שלום,
יש לי כמה שאלות על JAVA שאשמח אם תוכלו לעזור לי לפחות בחלקם:

א. מהו תפקידו של המהדר בג'אווה ( Java Compiler )?

האם זה

ב. מהו תפקידו של המפרש ב-JAVA ? הכוונה ל- Java Interpreter.
האם הוא

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

ד. מהו היתרון בשימוש בפורמט Bytecode ?

ה. מהי ה - (JVM( Java Virtual Machine?

ו. האם המפרש של Java קורא קבצים עם סיומת class ?

ז.האם המהדר של Java כותב קבצים בפורמט bytecode ?

ח.האם המפרש של Java בודק את תחביר הקוד?

ט. האם אותו קובץ בפורמט bytecode ניתן להרצה במערכות הפעלה שונות?

י. האם עבור מערכות הפעלה שונות קיימים מפרשי Java שונים המותאמים עבורן?
יא. האם המפרש של Java ממיר קבצים בפורמט bytecode לקבצי executable?
תודה על העזרה!
 

BravoMan

Active member
מניסוח השאלה שלך, נשמע שאתה מחפש מישהו שיענה על

שיעורי בית במקומך...
&nbsp
את זה אין לי כוונה לעשות, אבל אומר לך רק דבר אחד:
ל-Java אין מפרש.
&nbsp
"מפרש" הוא תוכנה שמריצה שפות סקריפט, כלומר, שפות שלא עוברות קומפילציה, אלא נשארות בצורת קוד מקור שלהם.
&nbsp
המפרש קורא את קובץ המקור ומבצע אותו שורה אחר שורה.
&nbsp
כמובן, Java אינה שפה מפורשת, היא עוברת קומפילציה ל-bytecode, ולכן אין לה מפרש.
 

Guy Yafe

New member
הערה פילוסופית

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

BravoMan

Active member
עם כל הכבוד למרצה שלך, אני חולק על שימוש כזה

בהגדרות:
&nbsp
למעבד אין מקום לפרש את פקודות המכונה שלו.
אומנם במעבדים מודרניים קיימות יכולות אופטימיזציה שעלולות לשנות סדר ביצוע פקודות ועוד כל מיני תוספות, אך בסופו של יום כשכותבים למעבד add ax, bx זה בדיוק מה שהוא מבצע, בלי שום שיקול או אפשרויות שניתן לקרוא להם "פרשנות".
&nbsp
"מפרש", במובן בו משתמשים במונח הזה בתעשייה, עושה למעשה משהו דומה לקומפילציה, הוא מפרש שפה עילית ומחליט מה בדיוק לעשות.
&nbsp
היות ולמדת קומפילציה, אתה וודאי יודע שאפילו משפט if פשוט בשפת C ניתן לתרגם לשפת מכונה במספר צורות, כך שיש מקום לפרשנות ממש.
&nbsp
מפרש הוא למעשה גם קומפיילר, רק שבניגוד לקומפיילר פרופר, במקום לבצע תרגום, לשמור את התוצאה, ולסיים את תפקידו, הוא מבצע את התרגום, מריץ את התוצאה, וזורק אותה לפח בסוף ההרצה.
&nbsp
(כמובן, תיאור זה לא לוקח בחשבון caching וקבצים זמניים, כמו pyc שהמפרש של Python יוצר).
&nbsp
אני לא חושב שנכון להגדיר את JVM כמפרש או קומפיילר.
למיטב ידיעתי, ותקן אותי עם אני טועה, המימוש הסטנדרטי לא כולל קומפילציה לקוד Native, אלא רק הדמיה של מעבד.
&nbsp
בגלל זה הוא Virtual Machine ומשם שמו.
 

Guy Yafe

New member
נראה לי שזה עניין של השקפה

מי שמכיר לעומק את הברזלים לא יאהב את ההגדרה הזו. תיאורטיקן שעולם שפות התכנות יסתכל על הכל כאבסטרקציה.
&nbsp
לגבי הJVM: הוא עושה המון אופטימיזציות, כולל קומפילציה לשפת מכונה: יש לו רכיב שנקרא JIT (קיצור של Just In Time) שאוסף מידע בזמן ריצה על הקוד ומקמפל קטעי קוד "חמים" לשפת מכונה.
&nbsp
https://en.wikipedia.org/wiki/Just-in-time_compilation
http://www.oracle.com/technetwork/articles/java/architect-evans-pt1-2266278.html
&nbsp
אגב, מדובר בJVM סטנדרטי לפי התקנים של אוראקל. אין לי מושג מה קורה באנדרואיד.
&nbsp
 
למעלה