Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Studies

קומפילציה והרצה

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

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

קוד שאינו עובר קומפילציה

נבחן את התוכנית הבאה:

int main() {
    int x = y;
    printf("%d\n", x);
}

אינטואטיבית, התוכנית אינה מרגישה הגיונית. מהו y? איך אפשר לתת ל-x ערך של משתנה שאינו קיים? כמו כן, לא כתבנו #include <stdio.h> כפי שראינו שיש לעשות קודם.

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


bad_comp.c:2:13: error: use of undeclared identifier 'y'
    2 |     int x = y;
      |             ^


bad_comp.c:3:5: error: call to undeclared library function 'printf' with type
      'int (const char *, ...)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    3 |     printf("%d\n", x);
      |     ^


bad_comp.c:3:5: note: include the header <stdio.h> or explicitly provide a declaration for
      'printf'

הקומפיילר מדפיס מידע שימושי מאוד בשביל לתקן את הקומפילציה של התוכנית!

  1. ראשית, הוא מסמן לנו במדויק מה הבעיה. use of undeclared identifier, עם סימון על המשתנה y - הקומפיילר זיהה שהשתמשנו במזהה (identifier) שאינו מוצהר (undeclared) ולכן אין אפשרות לקמפל את התוכנית.
  2. כמו כן, הקומפיילר מציין כי השתמשנו בפונקציה שאינה מזוהה printf. במקרה זה, מכיוון שמדובר בשגיאה נפוצה, הקומפיילר גם אומר לנו מה צריך לעשות בשביל לתקן אותה - לבצע include ל-<stdio.h>.

לסיכום, כדאי ללמוד לקרוא את הפלט של הקומפיילר ולהשתמש בו - הוא הכלי החשוב ביותר עבור מתכנת בשפה C.

Note

קיימים מספר קומפיילרים שונים לשפת C - הפופולריים ביניהם הם gcc ו-clang. ההבדלים העיקריים בין הקומפיילרים לא רלוונטי לצרכים שלנו בקורס ולכן ניתן להשתמש בכל אחד מהם, אבל יתכן שבהתאם לקומפיילר בו תשתמשו תראו הודעות שגיאה מעט שונות ביחס לאלו שמופיעים בקורס עבור אותו הקלט. בקורס נשתמש בקומפיילר clang.

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

  1. כתיבת קוד - הרבה פעמים בעורך קוד כלשהו, כמו VS Code או Code::Blocks
  2. תיקון שגיאות/אזהרות קומפיילר עד לקומפילציה תקינה
  3. תרגום ע״י הקומפיילר משפת C לשפת מכונה
  4. הרצה של הקוד - הרבה פעמים ע“י עורך הקוד בו אנחנו משתמשים

Note

לא כל שפות התכנות עוברות קומפילציה. כדוגמא אחרת, קיימות שפות הנקראות ״מפורשות״ (interpreted), אותן מריצים בצורה אחרת. קיימת תוכנה הנקראת interpreter שקוראת קוד בשפות כאלו שורה אחר שורה ומבצעות אותן. דוגמא לשפות כאלה הן Python ו-JavaScript.

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