אתר הקורס http://www.cs.technion.ac.il/~cs236360 איתן אביאור תורת הקומפילציה 2 ספרות איתן אביאור תורת הקומפילציה 3 איתן אביאור תורת הקומפילציה 4 מהדר ( )Compiler • תוכנית תרגום ( )translation תוכניות משפת מקור ( )source language לשפת מטרה ( )target language • תוצר.

Download Report

Transcript אתר הקורס http://www.cs.technion.ac.il/~cs236360 איתן אביאור תורת הקומפילציה 2 ספרות איתן אביאור תורת הקומפילציה 3 איתן אביאור תורת הקומפילציה 4 מהדר ( )Compiler • תוכנית תרגום ( )translation תוכניות משפת מקור ( )source language לשפת מטרה ( )target language • תוצר.

‫אתר הקורס‬
‫‪http://www.cs.technion.ac.il/~cs236360‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪2‬‬
‫ספרות‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪3‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪4‬‬
‫מהדר (‪)Compiler‬‬
‫• תוכנית תרגום (‪ )translation‬תוכניות‬
‫משפת מקור (‪)source language‬‬
‫לשפת מטרה (‪)target language‬‬
‫• תוצר נוסף‪ :‬הודעות שגיאה (‪)error messages‬‬
‫תוכנית מטרה‬
‫(‪)target program‬‬
‫מהדר‬
‫(‪)compiler‬‬
‫תוכנית מקור‬
‫(‪)source program‬‬
‫הודעות שגיאה‬
‫(‪)error messages‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪5‬‬
‫מגוון‬
‫•‬
‫•‬
‫•‬
‫•‬
‫שפות תכנות עיליות‪ ,Fortran ,Pascal ,Java ,C++ ,C :‬ועוד ‪...‬‬
‫שפות מטרה‪ :‬שפות עליות אחרות‪ ,‬שפות ביניים‪ ,‬שפות סף‪ ,‬שפות‬
‫מכונה‪ ,‬צורן (‪ ,)silicon‬ועוד ‪...‬‬
‫שיטות‪ :‬חד‪-‬מעברי (‪ ,)one-pass‬רב‪-‬מעברי (‪.)multi-pass‬‬
‫ייעוד‪ :‬טעינה והרצה (‪ ,)load-and-go‬ניפוי (‪,)debugging‬‬
‫אופטימיזציה‪ ,‬ועוד ‪...‬‬
‫הודעה‬
‫משמחת‪:‬‬
‫איתן אביאור‬
‫לכולם טכניקות בסיסיות דומות‬
‫תורת הקומפילציה‬
‫‪6‬‬
‫הקלט למהדר‬
‫• שפות תכנות‪Perl ,Fortran ,Pascal ,C :‬‬
‫• שפות לעיבוד הטקסט‪Teχ ,html ,Postscript :‬‬
‫• שפות פקודות‪C-shell ,emacs :‬‬
‫• שפות שאילתה (לעיבוד נתונים)‪SQL :‬‬
‫• שפות לתיאור חומרה‪VHDL :‬‬
‫• שפות בקרה‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪7‬‬
‫פלט המהדר‬
‫• קוד מכונה‪PDP/11 ,MIPS ,IA32 :‬‬
‫• שפת סף‪PDP/11 ,MIPS ,IA32 :‬‬
‫• שפת ביניים‪Byte-code (java) ,P-code (Pascal) :‬‬
‫• שפות עיבוד טקסט‪PostScript ,dvi (Teχ) :‬‬
‫• תוכנה לשליטה ובקרה על מכשירים‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪8‬‬
‫ניתוח וחיבור‬
‫(‪)Analysis and Synthesis‬‬
‫• ניתוח (‪ ─ )analysis‬פירוק תוכנית המקור לגורמים‬
‫ויצירת ייצוג ביניים של התוכנית‪.‬‬
‫• חיבור (‪ ─ )synthesis‬יצירת תוכנית המטרה מתוך‬
‫ייצוג הביניים‪.‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪9‬‬
‫תוצרי הניתוח‬
‫• נתון הפסוק הבא‪:‬‬
‫‪position := initial + rate * 60‬‬
‫• תוצר אפשרי של שלב הניתוח עשוי להיות עץ תחביר (‪)syntax tree‬‬
‫המייצג את ניתוח התחביר של הפסוק‪:‬‬
‫=‪:‬‬
‫‪+‬‬
‫*‬
‫‪60‬‬
‫איתן אביאור‬
‫‪position‬‬
‫‪initial‬‬
‫‪rate‬‬
‫תורת הקומפילציה‬
‫‪10‬‬
‫כלי תוכנה נוספים‬
‫המבצעים ניתוח תוכניות‬
‫‪ .1‬עורך (‪)structure editor‬‬
‫‪ .2‬מדפיס מסודר (‪)pretty printer‬‬
‫‪ .3‬בודק סטטי (‪)static checker‬‬
‫‪ .4‬מפרש (‪)interpreter‬‬
‫‪ .5‬ניתוח חתימה‬
‫‪ .6‬ערבול‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪11‬‬
‫מהדרים מיוחדים‬
‫‪ .1‬מעבד תמלילים (‪)text formatter‬‬
‫‪ .2‬מהדר צורן (‪)silicon compiler‬‬
‫‪ .3‬מפרש שאילתות (‪)query interpreter‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪12‬‬
‫ההקשר של מהדר‬
‫שלד תוכנית מקור‬
‫קדם מעבד (‪)preprocessor‬‬
‫תוכנית מקור‬
‫מהדר (‪)compiler‬‬
‫תוכנית סף ‪ -‬מטרה‬
‫מאסף (‪)assembler‬‬
‫קוד מכונה‬
‫ספריות שגרות‬
‫איתן אביאור‬
‫קשר (‪)linker‬‬
‫להרצה‬
‫תורתתוכנית‬
‫הקומפילציה‬
‫‪13‬‬
‫ניתוח תוכנית המקור‬
‫• ניתוח לקסיקאלי (‪)lexical analysis‬‬
‫• ניתוח תחביר (‪)syntax analysis‬‬
‫• ניתוח משמעות (‪)semantic analysis‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪14‬‬
‫ניתוח לקסיקאלי‬
‫(‪)Lexical Analysis‬‬
‫• ניתוח קווי (‪ )linear analysis‬המפרק את התוכנית‬
‫לזרם של תמניות (‪)stream of tokens‬‬
‫• תמנית (‪ ─ )token‬הרחבה של מושג המלה בשפה‪:‬‬
‫– מלת מפתח (‪)keyword‬‬
‫– מזהה (‪)identifier‬‬
‫– קבוע‬
‫– אופרטור‬
‫– מפריד (‪)separator‬‬
‫– מסיים (‪)delimiler‬‬
‫– ועוד ‪...‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪15‬‬
‫ דוגמה‬− ‫ניתוח לקסיקאלי‬
position := initial + rate  60
position
:=
initial
+
rate

60
‫הפסוק‬
:‫מתפרק ל‬
(identifier)
(assignment operator)
(identifier)
(operator)
(identifier)
(operator)
(integer constant)
‫ נעלמים בד"כ‬− '‫ סוף שורה וכד‬,‫ טבולטור‬,‫ רווח‬:‫התווים הלבנים‬
16
‫תורת הקומפילציה‬
‫איתן אביאור‬
‫ניתוח התחביר‬
‫(‪)Syntax Analysis‬‬
‫• ניתוח היררכי (‪ )hirarchial analysis‬המייצר או סורק‬
‫מבנה נתונים (בד"כ עץ) המייצג את ניתוח הפסוק‬
‫(או התוכנית כולה) לפי הגדרת השפה‬
‫• נקרא גם פריסה (‪)parsing‬‬
‫• אחד המבנים המקובלים לייצוג תוצר הניתוח הינו‬
‫עץ פריסה (‪)parse tree‬‬
‫• לא תמיד נוצר מבנה נתונים או עץ בפועל‪ .‬לעיתים נוצר‬
‫פלט הנראה כאילו נוצר מסריקה של מבנה נתונים כנ"ל‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪17‬‬
‫ דוגמה‬− ‫ניתוח התחביר‬
‫הפסוק‬
position := initial + rate * 60
:‫ואשר פורק לזרם התמניות דלעיל מיוצג ע"י עץ הפריסה‬
assignment
statement
identifier
position
18
:=
expression
+
expression
expression

identifier
expression
initial
identifier
number
rate
60
‫תורת הקומפילציה‬
expression
‫איתן אביאור‬
‫ניתוח התחביר ‪ −‬המשך הדוגמה‬
‫או ע"י עץ התחביר (‪:)syntax tree‬‬
‫=‪:‬‬
‫‪+‬‬
‫*‬
‫‪60‬‬
‫איתן אביאור‬
‫‪position‬‬
‫‪initial‬‬
‫‪rate‬‬
‫תורת הקומפילציה‬
‫‪19‬‬
‫ניתוח לקסיקאלי וניתוח התחביר‬
‫ניתוח התחביר משתמש בהגדרות שפה רקורסיביות ואילו‬
‫הניתוח הלקסיקאלי משתמש בהגדרות יותר פשוטות‪.‬‬
‫בד"כ הקו המפריד בין שני השלבים יהיה המקום בו‬
‫נכנסות ההגדרות הרקורסיביות של השפה‪.‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪20‬‬
‫ניתוח משמעות‬
)Semantic Analysis(
‫• הבנת המשמעות של התוכנית ובדיקת נכונותה‬
)‫(עד רמה מסוימת כמובן‬
)type checking( ‫• חלק חשוב בשלב זה הינו בדיקת טיפוסים‬
‫ יתורגם באופן שונה ע"פ טיפוסי הנתונים‬alpha += beta ‫הביטוי‬
.beta-‫ ו‬alpha ‫של‬
int alpha;
int beta;

add beta, alpha
21
float alpha;
float beta;
float alpha;
int beta;


addf beta, alpha
cvtif beta, f0
addf f0, alpha
‫תורת הקומפילציה‬
int alpha[2];
int beta(int, float);

error
‫איתן אביאור‬
‫ דוגמה‬− ‫ניתוח משמעות‬
:=
position
+
initial
:=
position
rate
+
initial
rate
*
60
*
inttoreal
60
22
‫תורת הקומפילציה‬
‫איתן אביאור‬
‫ שלבים‬− ‫מבנה המהדר‬
lexical analyser
‫מנתח לקסיקאלי‬
syntax analyser
‫מנתח תחביר‬
semantic analyser ‫מנתח משמעות‬
‫מנהל סמלים‬
symbol manager
23
‫מייצר קוד ביניים‬
intermediate code generator
code optimizer
‫מייעל קוד‬
code generator
‫מייצר קוד‬
‫תורת הקומפילציה‬
‫מטפל שגיאות‬
error handler
‫איתן אביאור‬
‫מבנה המהדר ‪ −‬צדדים‬
‫צד קדמי‬
‫‪front end‬‬
‫מנתח לקסיקאלי‬
‫‪lexical analyser‬‬
‫מנתח תחביר‬
‫‪syntax analyser‬‬
‫כל מה שאיננו‬
‫קשור או תלוי‬
‫בשפת מטרה‬
‫מנתח משמעות ‪semantic analyser‬‬
‫מייצר קוד ביניים‬
‫‪intermediate code generator‬‬
‫מטפל שגיאות‬
‫‪error handler‬‬
‫צד אחורי‬
‫‪back end‬‬
‫איתן אביאור‬
‫מייעל קוד‬
‫‪code optimizer‬‬
‫מייצר קוד‬
‫‪code generator‬‬
‫תורת הקומפילציה‬
‫מנהל סמלים‬
‫‪symbol manager‬‬
‫מה שקשור או תלוי‬
‫בשפת מטרה‬
‫‪24‬‬
‫טבלת סמלים‬
‫(‪)Symbol Table‬‬
‫מכילה רשימה עבור כל סמל המוגדר בתוכנית המייצג ישות כגון‪:‬‬
‫– משתנים‬
‫– קבועים בעלי שם‬
‫– פונקציות‬
‫– אובייקטים‬
‫– ועוד‪...‬‬
‫הרשומה מכילה את כל המידע הנחוץ לגבי אותה ישות‪.‬‬
‫הישויות מיוצגות במבני הנתונים האחרים של המהדר ע"י הפניה‬
‫למיקום הסמל בטבלת הסמלים‪:‬‬
‫… ‪1 position‬‬
‫…‬
‫‪2 initial‬‬
‫‪id1  position‬‬
‫…‬
‫‪3 rate‬‬
‫‪id2  initial‬‬
‫‪id3  rate‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪25‬‬
‫ניתוח וחיבור‬
‫ניתוח‬
‫(‪)analysis‬‬
‫מנתח לקסיקאלי‬
‫‪lexical analyser‬‬
‫מנתח תחביר‬
‫‪syntax analyser‬‬
‫מנתח משמעות ‪semantic analyser‬‬
‫מייצר קוד ביניים‬
‫‪intermediate code generator‬‬
‫מייעל קוד‬
‫חיבור‬
‫(‪)synthesis‬‬
‫איתן אביאור‬
‫מייצר קוד‬
‫‪code optimizer‬‬
‫עשוי להכיל‬
‫ניתוח נוסף‬
‫‪code generator‬‬
‫תורת הקומפילציה‬
‫‪26‬‬
‫תוצר שלב הניתוח‬
‫=‪:‬‬
‫‪+‬‬
‫‪‬‬
‫‪60‬‬
‫‪id1‬‬
‫‪id2‬‬
‫=‪:‬‬
‫‪id3‬‬
‫‪+‬‬
‫‪‬‬
‫‪num 60‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪id 1‬‬
‫‪id 2‬‬
‫‪id 3‬‬
‫‪27‬‬
‫ייצור קוד ביניים‬
‫(‪)Intermidiate Code Generation‬‬
‫קוד הביניים עשוי להיות מיוצג בשיטות שונות‪.‬‬
‫ביטויים אריתמטים עשוים להיות מיוצגים ע"י‬
‫הוראות משולשות (‪.)three address code‬‬
‫‪dest := src1 op src2‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪28‬‬
‫ דוגמה‬− ‫קוד ביניים‬
position := initial + rate * 60
:‫הפסוק‬
:=
:‫לעץ התחביר‬
position
+
initial
*
rate inttoreal
‫שנותח‬
60
temp1
temp2
temp3
id1
29
:=
:=
:=
:=
inttoreal(60)
id3 * temp1
id2 + temp2
temp3
‫תורת הקומפילציה‬
:‫ייוצג ע"י‬
‫איתן אביאור‬
‫ייעול (‪)Optimization‬‬
‫מטרתו לפשט את התוכניות במספר מימדים‪:‬‬
‫– גודל הקוד הנוצר‬
‫– זמן הריצה‬
‫– השימוש במשאבים (זיכרון‪ ,‬אוגרים וכו')‬
‫חלקו בלתי תלוי בשפת המטרה‪,‬‬
‫וחלקו תלוי בשפת המטרה ו‪/‬או במכונת המטרה (‪:)target machine‬‬
‫– מספר האוגרים‬
‫– אוסף ההוראות‬
‫– הוראות מיוחדות‬
‫– צינור (‪)pipeline‬‬
‫– ועוד ‪...‬‬
‫לעיתים נעשה חלק מהאופטימיזציה גם לאחר שלב ייצור קוד המטרה‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪30‬‬
‫ דוגמה‬− ‫ייעול‬
temp1
temp2
temp3
id1
:=
:=
:=
:=
inttoreal(60)
id3 * temp1
id2 + temp2
temp3

temp1 := id3 * 60.0
id1
:= id2 + temp1
31
‫תורת הקומפילציה‬
‫איתן אביאור‬
‫ייצור קוד‬
‫(‪)Code Generation‬‬
‫מייצר את תוכנית המטרה באחד (או יותר) מאלה‪:‬‬
‫– שפה עילית אחרת‬
‫– שפת סף‬
‫– שפת מכונה‬
‫דוגמה בשפות סף‬
‫מכונת ‪ 3‬כתובות עם פעולות‬
‫אריתמטיות בין תאי זיכרון‬
‫‪mulf3 #60.0, id3, r2‬‬
‫‪addf3 id2, r2, id1‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫מכונת ‪ 2‬כתובות עם פעולות‬
‫אריתמטיות בין אוגרים‬
‫‪id3, r2‬‬
‫‪#60.0, r2‬‬
‫‪id2, r1‬‬
‫‪r2, r1‬‬
‫‪r1, id1‬‬
‫‪movf‬‬
‫‪mulf‬‬
‫‪movf‬‬
‫‪addf‬‬
‫‪movf‬‬
‫‪32‬‬
‫עזרים לבניית מהדר‬
‫תוכניות עזר לבניית מהדרים מתוך הגדרות פורמאליות של‬
‫שפת המקור ו‪/‬או שפת מטרה‪.‬‬
‫נקראות בשמות כגון‪:‬‬
‫• ‪compiler−compile‬‬
‫• ‪compiler−generator‬‬
‫• ‪translator−writing system‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪33‬‬
‫עזרים לבנית מהדר ‪ −‬המשך‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫מייצר פורס (‪ ─ )parser generator‬מתוך דקדוק חסר הקשר‬
‫מייצר סורק (‪ ─ )scanner generator‬מתוך ביטויים רגולריים‬
‫מנוע תרגום מונחה תחביר‬
‫(‪ ─ )syntax directed translation engine‬מייצר שגרות‬
‫העוברות על עץ הפריסה ומייצרות קוד‬
‫מייצר קוד אוטומטי (‪ ─ )automatic code generator‬מתוך אוסף‬
‫כללים לתרגום ההוראות של קוד ביניים עושה שימוש בטכניקה של‬
‫השוואת תבניות (‪)template matching‬‬
‫מנוע זרימת מידע (‪ ─ )data-flow engine‬מנתח את זרימת‬
‫המידע בתוכנית ע"מ לאפשר אופטימיזציות מתקדמות‪.‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪34‬‬
‫תום פרק ‪1‬‬
‫איתן אביאור‬
‫תורת הקומפילציה‬
‫‪35‬‬