פירוש מושגים ידועים בשפת C. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

פירוש מושגים ידועים בשפת C.


Chaos

Recommended Posts

שלום לכולם.

רציתי את עזרתכם לדעת מה פירוש המושגים הבאים, ובעיקר מה ההבדל המדויק ביניהם.

שגיאות:

- Compilation.

- Linking.

- הרצה.

ההבדל בין:

- Stack, או Stack Segmant.

- Heap, או Data Segmant.

תודה רבה לעוזרים.

קישור לתוכן
שתף באתרים אחרים

compilation-קומפילציה - ("הידור" בעברית) - ההפיכה של התוכנית מקוד בשפת C (או כל שפה אחרת)

לשפת מכונה שהמעבד יכול להבין, ותוך כדי הקומפיילר ("מהדר") בודק האם יש שגיאות בקוד

Linking - קישור - לא זוכר כבר מה זה עושה... (את הבגרות באסמבלר עברתי כבר)

הרצה- זה ההרצה של התוכנית עצמה, שאתה באמת רואה שהיא רצה ועושה מה שהיא אמורה לעשות

Stack Segmant זה אזור בזיכרון שמוקדש לStack - המחסנית (אתה יודע מזה או להסביר?)

ואילו Data Segmant זה אזור בזיכרון שמוקדש לנתונים של התוכנית (כלומר למשתנים וכו')

אין לי מושג מזה Heap, לא זוכר שאף פעם שמעתי את המילה הזאת

אגב יש עוד אזור בזיכרון שבו נמצאות ההוראות של התוכנית, אבל אני לא זוכר את השם שלו

אגב, לאף אחד מהמושגים האלה אין קשר ספציפי לשפת C, הם מושגיים בסיסיים בתכנות והבנת המחשב

קישור לתוכן
שתף באתרים אחרים

אגב, לאף אחד מהמושגים האלה אין קשר ספציפי לשפת C, הם מושגיים בסיסיים בתכנות והבנת המחשב

צודק.

compilation-קומפילציה - ("הידור" בעברית) - ההפיכה של התוכנית מקוד בשפת C (או כל שפה אחרת)

לשפת מכונה שהמעבד יכול להבין, ותוך כדי הקומפיילר ("מהדר") בודק האם יש שגיאות בקוד

Linking - קישור - לא זוכר כבר מה זה עושה... (את הבגרות באסמבלר עברתי כבר)

הרצה- זה ההרצה של התוכנית עצמה, שאתה באמת רואה שהיא רצה ועושה מה שהיא אמורה לעשות

Stack Segmant זה אזור בזיכרון שמוקדש לStack - המחסנית (אתה יודע מזה או להסביר?)

ואילו Data Segmant זה אזור בזיכרון שמוקדש לנתונים של התוכנית (כלומר למשתנים וכו')

אין לי מושג מזה Heap, לא זוכר שאף פעם שמעתי את המילה הזאת

אגב יש עוד אזור בזיכרון שבו נמצאות ההוראות של התוכנית, אבל אני לא זוכר את השם שלו

אגב, לאף אחד מהמושגים האלה אין קשר ספציפי לשפת C, הם מושגיים בסיסיים בתכנות והבנת המחשב

מה היא שגיאת Linking? דוגמה תתקבל בברכה.

מה היא שגיאת הרצה?

אם אפשר הסבר מדויק על Stack, אשמח לדעת.

תודה מראש.

קישור לתוכן
שתף באתרים אחרים

COMPILE זה השלב שבו אתה הופך את קוד המקור לשפת מכונה, אם התוכנית שלך מורכבת מכמה קבצי קוד מקור נפרדים, וספריות חצוניות, אז בשלב הזה, כל קובץ הופך לקוד מקור בנפרד מהאחרים (OBJECT FILES)

LINKAGE זה השלב שהמהדר לוקח את כל קבצי המכונה וספריות (OBJECT, LIBRARY FILES) ומאחד אותם ביחד (כולל לבדוק שכל הפקודות שקשורות בין הקבצים קיימים ומוגדרים), לקובץ ריצה שאותו אתה מריץ (EXECUTABLE)...

שגיאת LINKING היא למשל, כשיש לך פקודה שאתה משתמש בקובץ מסוים אך, היא לא קיימת בספריות המהדר, ולא בקבצי קוד מקור אחר... (בשלב ה COMPILE הוא לא יכול לעלות על פקודות כאלו, כי כאמור הוא מתייחס לכל קובץ בנפרד ולא יודע אילו פקודות מוגדרות בקבצי ספריה וכו'...

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

קישור לתוכן
שתף באתרים אחרים

Stack - מחסנית, זה אזור בזיכרון שעובד בשיטת LIFO שזה Last In First Out,

או במילים אחרות האחרון שנכנס הוא הראשון לצאת והראשון שנכנס הוא האחרון לצאת (כמו מחסנית של רובה למשל)

בכל מקרה, אני לא אסביר בהרחבה איך זה עובד, כי זה משעמם ולא מעניין בכלל,

אבל אל המחסנית אפשר או להכניס (PUSH) או להוציא נתונים (POP).

מה שקורה בזמן ביצוע תוכנית נגיד התוכנית קוראת לפונקציה כלשהי, עכשיו איכשהו התוכנית

צריכה לדעת לאן לחזור לאחר הפונקציה, נכון? אז התוכנית דוחפת למחסנית את המיקום

הנוכחי (מה שנקרא אוגר IP - שזה instruction pointer, האוגר שמחזיק את הכתובת בזיכרון של ההוראה שתתבצע עכשיו)

ואז התוכנית עוברת לפונקציה, עושה מה שצריך לעשות שם, ולאחר סיום הפונקציה היא שולפת מהמחסנית (POP)

את הנתון שהכנסנו קודם לתוך IP ואז בעצם עוברת לשורה לאחר הקריאה המקורית לפונקציה

במילים אחרות ובקצרה, זה מבנה נתונים כלשהו שבו המחשב משתמש על מנת לדעת לאן לחזור לתוכנית בעת קריאה לפונקציה

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

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

פונים ישירות למחסנית (ואני לא יודע אם אפשר בכלל) אבל באסמבלר אני יודע

שגיאת הרצה זה כשיש טעות כלשהי שגורמת לתוכנית לעוף (כלומר להסתיים)

בזמן שהיא כבר רצה בגלל משהו שקרה בזמן ביצוע התוכנית שאינו נכון

(למשל התוכנית ניסתה לחלק באפס למשל, להוציא שורש ממספר שלילי, ציפתה לקלוט מספר אך קיבלה תו [טעות של המשתמש בתוכנית])

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

שגרמה לתוכנית לנסות לעשות משהו בלתי אפשרי (יכול להיות טעות של המתכנת, או של המשתמש, זה לא משנה) ולכן הייתה שגיאה והתוכנית הסתיימה

קישור לתוכן
שתף באתרים אחרים

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

קישור לתוכן
שתף באתרים אחרים

ראשית, תודה רבה לשניכם.

שנית, הבנתי שבעיית Linking יכולה להיות גם גישה לא נכונה לפונקציות:

- הכנסת פרמטר לא מתאים לפונקציה.

- קריאה לפונקציה שאיננה קיימת.

ועוד.

האם אני צודק?

תודה על העזרה.

קישור לתוכן
שתף באתרים אחרים

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

קישור לתוכן
שתף באתרים אחרים

שים לב שבCPP אתה יכול לגרום לשגיאות הרצה באופן מכוון ע"י שימוש בפקודה THROW שאמורה לצאת מהקטע TRY הנוכחי וחיפוש קטע CATCH קרוב. אם הוא לא מוצא הוא עולה למעלה(STACK אתה יודע מה זה?) ומחפש שם עד הMAIN. אם הוא לא מוצא בMAIN אז הוא מציג לך את שגיאת ההרצה המתבקשת.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...