הרכבה ופרשנות
הוצג| English | משמעות |
|---|---|
| compiler/kəmˈpaɪlə/ | מתרגם |
| interpreter/ɪnˈtɜːprɪtə/ | מפרש |
| lexical analysis/ˈleksɪkl əˈnæləsɪs/ | ניתוח לקסיקלי |
| tokens/ˈtəʊkənz/ | טוקנים |
| syntax analysis/ˈsɪntæks əˈnæləsɪs/ | ניתוח סינטקטי |
| abstract syntax tree/ˈæbstrækt ˈsɪntæks triː/ | עץ סינטקטי מ 추抽象 (Abstract Syntax Tree) |
| syntax error/ˈsɪntæks ˈerə/ | שגיאת סינטקס |
| semantic analysis/səˈmæntɪk əˈnæləsɪs/ | ניתוח סמנטי |
| code generation/kəʊd ˌdʒenəˈreɪʃn/ | יצירת קוד |
| code optimisation/kəʊd ˌɒptɪmaɪˈzeɪʃn/ | אופטימיזציה של קוד |
התיקון שגרם לאבן חלל להיפסד, נמצא על ידי פסיק
- המרינר 1 של נאסה הושמד 293 שניות לאחר השקה ב-1962. כשל זה מיוחס לעיתים קרובות לאות שגויה אחת בתוכנת ההנחיה.
- הסיפור מסופר פעמים רבות משום שהוא מבטא את הפחד שמכיר כל מתכנת: קומפיילר שמעביר בחיבה תוכנית אומרת דבר שלא התכוונת אליו.
- קומפיילר אינו תהליך אחד אלא חמישה, וכל אחד מהם תופס מחלקה שונה של טעות. ידועה המידע על כל שלב ומה הוא תופס מאפשר לך לדעת מאין מגיעה כל טעות נתונה.
- שיעור זה מסביר כיצד מפרש (interpreter) מפעיל תוכנית ללא יצירת כל תוצר, ואת חמישת השלבים שאותם עובר קומפיילר.
כיצד מפרש מפעיל תוכנית
- מפרש מעביר ומפעיל את המקור באותו זמן, סעיף אחד בכל פעם.
- עבור כל סעיף הוא קורא את השורה, מנתח אותה, בודק את הסוגים, ואז מבצע את הפעולה מיד, ועובר לסעיף הבא.
- הוא לא מייצר קובץ ביצוע: העיבור קיים רק בזיכרון ומיטול. זוהי בדיוק הנקודה במסלול הלימודים, שהיא יכולה לבצע תוכנית ללא יצירת גרסה מעוברת.
- הוא מדווח על שגיאה ברגע שהוא מגיע לשורה הפוגעת ובדרך כלל עצור, מה שמספק משוב מהיר בעת פיתוח. כל הפעלה מעבירה מחדש, ולכן היא איטית יותר, ויש צורך בנוכחות גם המקור וגם המפרש.

העבר פעם אחת והחזק, או העבר ופעל ושכח
מפרש:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הוא עובד שורה בשורה, מדווח על שגיאות כשהוא מגיע אליהן; אין נשמר דבר כקובץ ביצוע, והוא בדרך כלל איטי יותר.
מפרש יכול לבצע תוכנית ללא יצירת גרסה מתורגמת שלה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
התרגום קיים רק בזיכרון, משפט למשפט, ונמחק. מכאן שהמפרש חייב להיות נוכח בכל פעם התוכנית רוצה.
שלב 1: ניתוח לקסיקלי
- ניתוח לקסיקלי מקבץ את האותיות הבודדות של המקור ל-טוקנים: מילות מפתח, מזהה, אופרטורים וליטרלים.
- רווחים ותגובות מוחלקים, מכיוון שהם אין להם משמעות עבור הקומפיילר, והמזהים נכנסים לטבלת סימנים.
- כך
total ← count * 2הופך לרצף הטוקנים מזהה, הצבה, מזהה, אופרטור, ליטרל. הלেকסר (lexer) לא יודע ולא מתעניין אם הדבר הזה הגיוני.
ניתוח לקסיקלי (הלקסר) הופך:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הלקסר מקבץ תווים לסלילים ומפנה רווחים/הערות; הפארסר בונה את העץ לאחר מכן.
ניתוח לקסיקלי מקבץ את תוויות המקור ל____ ומפנה רווחים והערות.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
מילות מפתח, זיהויים, אופרטורים וליטרלים. הלקסר לא קובע האם הסדרה היא תוכנית תקפה.
שלב 2: ניתוח סינטקטי
- ניתוח סינטקטי, או פרסוף, בודק שרצף הטוקנים מתאים ל-דקדוק השפה, ובונה עץ סינטקטי抽象 המייצג את המבנה.
- סוגר חסר, ⟨
ENDIF⟩ חסר או מילת מפתח במקום שגוי נתפסים כאן: זה מה ששגיאת סינטקס היא, וזוהי הסיבה שהמترגם (compiler) יכול לדווח עליה ללא ביצוע התוכנית לעולם.

הדקדוק נגדו בוחן המפרש
שלב 3: ניתוח סמנטי
- ניתוח סמנטי בודק שמתקף תוכנה תקני מורפולוגית באמת עולה על הקרקע: כל משתנה מוגדר לפני השימוש, הסוגים בשני צדי ההטלה תואמים, ופונקציה נקראת עם מספר הארגומנטים הנכון.
total ← "seven" * 2הוא קוד מורפולוגי תקין לחלוטין אך חסר כל משמעות. רק השלב הזה חושף זאת.- זהו ההבדל שהמבחן בודק: מורפולוגיה היא צורה, סמנטיקה היא משמעות.
איזה מאללו נבדק על ידי ניתוח סמנטי במקום ניתוח סינטקטי?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
סוגרים הם דקדוק, לכן סינטקטי; רווחים הם הלקסר; רישומים הם יצירת קוד. הצהרות וסוגים הם משמעות.
שלבים 4 ו-5: ייצור קוד ואופטימיזציה
- ייצור קוד עובר על העץ ומפיק את קוד המכונה היעד, בוחר רשומות ומסדר את הנתונים.
- אופטימיזציה של קוד משפרת את הקוד ללא שינוי בהתנהגותו: הסרת עבודה מיותרת, חישוב ביטויים קבועים בזמן הרצאה, והסדר מחדש של פקודות להתאמה לשבך.
- הפלט הוא קובץ ביצוע עצמאי שמריץ ללא נוכחות המתרגם.

חמישה שלבים, וכאשר אחד חושף שגיאה שהשלב הקודם לא זיהה
שלבי ההרכבה
מעבר שלב אחר שלב על מה שהרוכב עושה בקוד המקור שלך. כל שלב מעביר את הפלט שלו לשלב הבא — תווים הופכים לטוקנים, טוקנים הופכים לעץ, העץ הופך לקוד מכונה אופטימיזציה.
התאם כל שלב במתקן לפעולה שהוא מבצע.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
כל שלב ממיר את התוכנית צעד נוסף: טוקנים, ולאחר מכן עץ, ואז בדיקה, ולבסוף קוד אופטימיזציה.
סדרו את שלבי המייצר בסדר הנכון.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
לקסיקלי → סינטקטי → סמנטי → יצירת קוד → אופטימיזציה.
אופטימיזצית קוד שואפת ל:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
אופטימיזציה משפרת את הקוד המיוצר (קיפול קבועים, הסרת תכנון מיותר, טרוד למערכת ה pipelines).
דוגמא פתורה: איזה שלב חושף איזה שגיאה
x ← 5 +: הטוקנים אינם עומדים בדקדוק, אופרטור ללא ארגומנט ימני, ולכן ניתוח מורפולוגי.x ← y + 1שבוyמעולם לא הוגדר: הצורה תקינה אך המשמעות אינה כזו, ולכן ניתוח סמנטי.IF a > b THEN OUTPUT aללאENDIF: ניתוח מורפולוגי שוב.- תוכנה שמריצה ומוציאה את הממוצע הלא נכון: שום שלב לא חושף זאת. זוהי שגיאת לוגיקה, ורק בדיקות מאפשרות גילויה. ציין את השלב וגם מדוע השלבים הקודמים אפשרו את מעברו.
התאמו כל שורה פגומה לשלב המייצר שתופס אותה.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
סינטקסה היא צורה, סמנטיקה היא משמעות, וטעות לוגיקה תקפה בשתי האלו אך שגויה במטרה.
דוגמא פתורה: השוו בין שני המתרגמים
- תן שתי הבדלים בין אופן התמודדותם של מתרגם ומפרש עם תוכנה. [4]
- מתרגם מתרגם את כל התוכנה לפני הרצה ומפיק קובץ ביצוע, שמריץ לאחר מכן ללא נוכחות המתרגם; מפרש מתרגם ומבצע פקודה אחת בכל פעם ולא מפיק קובץ ביצוע, ולכן המפרש חיוני בכל הרצה.
- מתרגם מדווח על כל השגיאות יחד לאחר ההרצה; מפרש מדווח על השגיאה הראשונה כשהוא מגיע לשורה הזו ועוצר.
- כל ציון מייצג זוג פעולות: לציין מה אחת עושה ומה השנייה עושה במקום זאת.
סימונים נופלים מהיד
- המתרגם אינו מייצר גרסה מתורגמת. זוהי הניסוח המופיע בסילבוס והציון שמוענק עליו.
- המנתק (lexer) מייצר טוקנים ומשליך רווחים ותגיות; הוא לא בודק האם התוכנית תקפה.
- סינטקס הוא הצורה, סמנטיקה היא המשמעות. משתנה שלא הוכרז הוא שגיאת סמנטיקה, ולא שגיאת סינטקס.
- אופטימיזציה לא יכולה לשנות מה שהתוכנית עושה, אלא רק את מהירות או הדחיסות של ביצועה.
הבנתך מושלמת
- מתרגם מעביר ומבצע פקודה אחת בכל פעם, אינו מייצר קובץ可执行, מדווח על השגיאה הראשונה בשורה שלה, ומעביד מחדש בכל ריצה
- ניתוח לקסיקלי יוצר טוקנים ומשליך רווחים ותגיות; ניתוח סינטקטי בודק את הדקדוק ובונה עץ סינטקס מופשט, תופש שגיאות סינטקס
- ניתוח סמנטי בודק משמעות: הכרזות, סוגים, מספר פרמטרים
- יצירת קוד מפיצה קוד מכונה ואופטימיזציה משפרת אותו ללא שינוי בהתנהגות, ומניבה קובץ可执行 עצמאי