שאלה בקימפול

eyal the one

New member
שאלה בקימפול

כשאומרים ששפה מתקמפלת לקוד native , למה הכוונה, מה זה שפה שלא מתקמפלת ל native?
 

vinney

Well-known member
אתה מדבר על JAVA בטח

מדובר בקוד שהוא לא קוד מכונה של מכונה ספציפית, אלא קוד מכונה "כללי" של JAVA, שמתורגם תוך כדי הריצה על ידי JAVA VIRTUAL MACHINE לקוד מכונה של המכונה המוסימת עליה אתה מריץ את האפליקציה. היתרון הוא שאתה לא צריך לקמפל את הקוד שלך מפלטפורמה לפלטפורמה, ואותו קובץ EXE ירוץ לך עם אותן הפונקציונליות גם ב UNIX וגם בחלונות. החסרון כמובן בזמן ריצה שמבוזבז על ההמרת קוד תוך כדי הריצה (לא הרבה במחשבים של ימינו). אותה שיטה אגב עובדת גם עבור NET., רק ששם במקום NATIVE קוראים לזה ASSEMBLEY (למרות שזה לא באמת אסמבלי של המכונה), ומבקום ה VM יש שם את ה JIT (שזה JUST IN TIME COMPILER). שפות תכנות שלא משתמשות בשיטה הזאת מתקמפלות ישירות לקוד מכונה, ולכן צריך לקמפל את הקוד מחדש במעבר מפלטפורמה לפלטפורמה.
 

MotiAd

New member
לא בהכרח...

אולי בJAVA הקוד מתורגם תוך כדי הריצה. ב-.NET ואני יכול לערוב לכך כל הקוד מתורגם לפני שהוא מורץ וכך אתה משיג ביצועים מיטביים יותר.
 

vinney

Well-known member
אתה בטוח ?

לדעתי ה framework עושה את העבודה תוך כדי ההרצה. בASP.NET אני אפילו די בטוח שזה ככה, לא מבטיח לגבי windows application.
 

MotiAd

New member
200% ולמה...

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

vinney

Well-known member
הא, הבנתי את הכוונה שלך ../images/Emo13.gif

נכון, ב NET הכל מקומפל לפני הביצוע ואז מבוצע, כל זה לכל ביצוע מחדש. הרעיון ב ASP.NET הוא לאפשר למתכנת לשנות את הקוד on the fly, והבא שיעלה את האתר אחרי השינוי יגרום לקימפולו מחדש לאסמבלי.
 

MotiAd

New member
לא לגמרי...

יש את מה שנקרא Asembly Cache. ברגע שמגיעה תוכנה היא עוברת קימפול ואז נכנסת לתוך הקאש הזה. רק ברגע שמגיעה תוכנה בגירסה חדשה יותר היא תעבור קימפול מחדש רק אז. מה שאמרת נכון במיוחד ל-ASP.NET שם באמת לכל משתמש שנכנס לאתר כל דף עובר קימפול מחדש גם ברגע שיש שינוי בתוך התוכן של דף, הכל נשלח לשרת שם מועבד ואז הפלט חוזר ללא קימפול.
 

eyal the one

New member
רגע c++ אי אפשר לקמפל native?

קראתי פעם שקוד native של c++רץ בצורה מאוד מהירה, למה הכוונה אם כך?
 

selalerer

New member
קוד C++ תמיד מקומפל לNATIVE

אין לו אפשרות לרוץ בשום צורה אחרת.
 

scalla

New member
native זו שפת מכונה

לא native זה משהו כמו הbytecode (נדמה לי שזה השם) של JAVA שחייב את הVM כדי לרוץ. הרעיון שתוכנה שקומפלה לnative רצה באופן "עצמאי" (לרוב תלויות במערכת הפעלה) ואחת שלא קומפלה לnative צריכה תוכנה שתריץ אותה. ומערכת הפעלה חייבת להיות מקומפלת לnative.
 

eyal the one

New member
אז לפי מה שאתה אומר

java זה לא native , כי זה חייב את ה vm שתריץ אותה. אבל קודם אמרו לי שאני בטח מדבר על java כשאני אומר native? וחוץ מזה מה זאת אומרת native זה שפת מכונה ובכפיפה אחת c++ זה תמיד native?. ממתי c++ זה שפת מכונה?? חשבתי שרק 10011011010101110111000011100111 זה שפת מכונה.. מישהו יכול לתת הגדרה יותר מדויקת או יותר כללית?
 

DecayCell

New member
לא הבנת בדיוק

הכוונה הייתה שכנראה התכוונת ל-Java כשדיברת על לא native. נאמר ש-++C מתקמפלת רק ל-native - היא עצמה לא native, אבל ברגע שמהדרים את התוכנית היא הופכת לקוד native, ולא לשום דבר אחר (בניגוד ל-Java, שם התוכנית המהודרת הופכת ל-bytecode שזקוק ל-VM בשביל לרוץ).
 

selalerer

New member
אתה עושה סלט.

כל שפת תכנות, אתה כותב את התוכנית כקובץ טקסט ולאחר מכן היא עוברת איזשהו תהליך בכדי שתוכל לרוץ. ברוב השפות התהליך מתבצע לפני ההרצה ויש מספר שפות שהתהליך הזה מתבצע תוך כדי הריצה. יש שפות שהתהליך מעביר אותן לשפת מכונה (כמו C++), לפני התהליך הזה הן היו טקסט ואחריו הן שפת מכונה (00111000) ויש שפות שהתהליך מעביר אותן ל"שפה אחרת" אשר אינה מובנת לאדם אך מובנת לתוכנה אחרת אשר כבר נמצאת בשפת מכונה. התוכנה הזאת קוראת את ה"שפה אחרת" ובהתאם נותנת פקודות למחשב. ב C++ אתה כותב טקסט ולאחר מכן מקמפל ומקשר אותו והתוצאה היא תוכנית בשפת מכונה. התוכנית הזאת היא native. ב java אתה כותב טקסט ולאחר מכן מקמפל אותו ומקשר אותו והתוצאה היא קבוץ byte code שזה שורת הוראות אשר תוכנה בשם Virtual Machine מסוגלת לקרוא ולפעול על פיהן, לכאורה להריץ את התוכנה הכתובה בbyte code, אבל את הbyte code הזה יכולה להריץ Virtual Machine שרצה על Windows או Virtual Machine שרצה על לינוקס ולכן הbyte code נקרא קוד שאיננו native, הוא לא מותאם למע' הפעלה+פלטפורמה, זאת או אחרת אלא מותאם לVirtual Machine שהיא תוכנית שנכתבה בשפה native עבור כל אחד מהסביבות שרוצים להריץ בהן byte code של java. -ועכשיו אני אבלבל אותך קצת: קוד של java ניתן להפוך לnative בעזרת כלים מסויימים שזה תפקידם, במקום להפוך אותו לbyte code הן הופכים את הקוד java לתוכנית native אך אז היא לא יכולה לרוץ על סביבות אחרות מכיוון שהיא לא רצה בעזרת Virtual Machine אלא ישירות על המחשב, בלי מתווכים, ולכן מבצעת פקודות המותאמות ספציפית לסביבה שעליה היא עובדת וגם בנוייה כתוכנית לסביבה זאת (כגון EXE לWINDOWS) בשל כך לא תוכל לרוץ על סביבות אחרות.
 

eyal the one

New member
ואו! תודה רבה רבה

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

selalerer

New member
מדוייק.

רוב המערכות הפעלה היום באות כבר עם הVM מותקן בתוכן ואם לא אז אפשר להוריד מהאתר של sun (יצרנית java).
 

eyal the one

New member
אתה רשמת שבשפות אחרות

יש צורך לקמפל במעבר מפלטפורמה לפלטפורמה, האם כך הדברים גם לגבי תוכנת c++ שלא עושה שימוש בשום api. לדוגמא:
int main() { int a = 0; return a; }​
אם אני מקמפל את זה בסביבת windows נניח עם vs , אני לא אוכל להריץ את ה exe שנוצר ב unix? האם יש קומפילרים שכן מאפשרים את זה? או שזה לא שאלה בכלל של קומפילר, אלא שפשוט exe יכול לרוץ רק על הפלטפורמה בה הוא נוצר?? כי אם כן, אז האם גם ה virtual machine צריך להיות שונה מפלטפורמה לפלטפורמה? תודה מראש אייל
 

selalerer

New member
לא, לא תוכל להריץ את הEXE בunix

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