Download presentation
Presentation is loading. Please wait.
1
1 תורת הקומפילציה 236360 מרצה –פרופ"ח ארז פטרנק erez@cs שעת קבלה – יום שני 13:30-14:30 טאוב 528 מתרגלים –קירה רדינסקי, מתרגלת אחראית –חגי טולדנו
2
2 אדמיניסטרציה אתר: http://webcourse.cs.technion.ac.il/236360 25% - תרגילי בית –5% תרגילים "יבשים", רשות (מגן) –20% תרגילים "רטובים", חובה 75% - מבחן סוף הקורס ציון נכשל במבחן גורר כשלון בקורס, ללא קשר לציון התרגילים. קדם: אוטומטים ושפות פורמליות 236353 מועד ג' למילואימניקים (בלבד). העתקות...
3
3 ספרות ספר עיקרי A.V. Aho, M. S. Lam, R. Sethi, and J.D. Ullman – “Compilers – Principles, Techniques, and Tools”, Addison-Wesley, 2007 ספר משני R. Wilhelm, and D. Maurer – “Compiler Design”, Addison- Wesley, 1995
4
4 ספרות-המשך ספר נוסף K.D.Cooper and L.Torczon “Engineering A Compiler”, Morgan Kaufmann, 2004
5
5 פרס טיורינג March 10, 2009: ACM has named Barbara Liskov the recipient of the 2008 ACM A.M. Turing Award for her contributions to practical and theoretical foundations of programming language and system design.
6
6 מורכבות קומפילציה שפות תכנות הנדסת תכנה מבנה מחשבים מערכות הפעלה שפות פורמליות אלגוריתמים מבני נתונים משלב תחומים רבים ממדעי המחשב משלב מחקר תיאורטי ומעשי
7
7 קומפילציה (הידור) – מושגי יסוד זמן קומפילציה זמן ריצה compiler source programtarget program target program outputinput
8
8 אינטרפרטציה )= פרשנות( interpreter source program input output שימושים: -שפות סקריפט שבהם כל שורה קוראת לביצוע של משהו מורכב (אין טעם ליעל) -שפות מאד גבוהות (APL) שבהן הנתונים מורכבים ואינם ידועים בעת הקומפילציה
9
9 דוגמא למבנה מודרני חשוב - Java source program input output Translator (javac) Intermediate program (bytecode) Bytecode is standard, machine-independent Just In Time -- תוך כדי פרשנות התכנית, ה- interpreter מבצע קומפילציה של חלקי תוכנית על מנת שהמשך הביצוע יהיה מהיר יותר. Java Virtual Machine Virtual machine- תלוי מכונה. מבצע טוב כפי יכולתו על המכונה הנתונה.
10
10 הידור / אינטרפרטציה – הכללות Source to Source Virtual Machine Pre-processors C ++ program C program translator Java bytecodeJava program compiler “pure” program program with embedded pre-pocessing statements (e.g., #include, macros) preprocessor
11
11 שימושים של קופיילרים יעד קוד מכונה: SPARC, P690, IA32 שפת אסמבלי קוד עבור אינטרפרטר: Java Virtual Machine, P-Code, … שפות עבוד טקסט: PostScript, TeX, html, RTF, … תוכנה למכשור מעגל חשמלי קלט שפות תכנות:C, Pascal, Assembler,... שפות לעיבוד טקסט: PostScript, TeX, html, RTF,… שפות scripting: C-shell, emacs, perl, Hypercard… שפות שאילתה לעבוד נתונים (SQL) שפות לתיאור חומרה (VHDL) שפות בקרה
12
12 כלים נוספים לעיבוד שפה – דוגמא Skeletal source program Preprocessor Source program Target assembly program Assembler Relocateable machine code Loader/Link-editor Absolute machine code compiler Library, releasable, object files איסוף מודולים, פתיחת מקרואים. כתובות יחסיות, הפניות לספריה כתובות יחסיות, לכל התוכנית Link: כתובות אבסולוטיות Load:
13
13 קומפילציה – חשיבות התחום לפיתוח שמושים מתקדמים –ניצול של כלים לפיתוח קומפיילרים להקלת מאמץ הפיתוח –קריאה (ו"הבנה") אוטומטית של קבצי קלט למפתחי תוכנה –הבנה של האבחנה בין זמן קומפילציה לזמן ריצה –הבנה של מה יעשה קומפיילר עם התוכנה שלכם (שיפור זמן ריצה, התראות של שגיאות) –שימוש נכון במבנים שונים של שפות התכנות –ניצול נכון של ארכיטקטורת המחשב
14
14 קומפילציה – חשיבות התחום לאנשי שפות תכנות –תמיכה יעילה בשפה חדשה לאנשי ארכיטקטורה של מחשבים –הבנה טובה של האיזון העדין שבין חומרה לתכנה –הבנה מעמיקה מה יעשה קומפיילר (כלומר: מה תעשה כל תוכנה) עם החומרה שלכם
15
15 תורת הקומפילציה – תוכן הקורס מבוא מבנה הקומפיילר ניתוח מילוני (lexical analysis) ניתוח תחבירי (parsing) ניתוח סמנטי יצירת קוד נושאים מתקדמים: –אופטימיזציות, ניתוח סטטי, Data-flow analysis, ניהול זיכרון, קומפיילרים Just-In-Time ו-Virtual Machines, קומפיילרים "פתוחים"
16
16 מבנה הקומפיילר – תמונה כללית Wilhelm and Maurer – Chapter 6 Aho, Sethi, and Ullman – Chapter 1 Cooper and Torczon – Chapter 1
17
17 קומפיילר – כקופסא שחורה target code int a, b; a = 2; b = a*2 + 1; SET R1,2 STORE #0,R1 SHIFT R1,1 STORE #1,R1 ADD R1,1 STORE #2,R1 source code מתרגם משפת המקור לשפת היעד תוכנית זהה סמנטית (עושה אותו דבר) כיוון שהתירגום מסובך, חילקו אותו לשלבים מודולריים סטנדרטיים.
18
18 קומפיילר – חלוקה גסה תוכנית מקור תוכנית מטרה analysis code optimization code generation יצוג ביניים ייצוג ביניים Front End Back End
19
19 מרכיבי הקומפיילר – חלוקה עדינה Character Stream Lexical Analyzer Token Stream Syntax Analyzer Syntax Tree Semantic Analyzer Decorated Syntax Tree Machine-Independent Code Optimization Intermediate Representation Code Generator Target Machine Code Machine-Dependent Code Optimization Intermediate Code Generator Intermediate Representation Target Machine Code
20
20 מרכיבי הקומפיילר – Front End Character Stream Lexical Analyzer Token Stream Syntax Analyzer Syntax Tree Semantic Analyzer Decorated Syntax Tree Intermediate Code Generator קל, טיפול בביטויים רגולריים יותר מסובך, רקורסיבי, עבודה עם דקדוק חסר הקשר. יותר מסובך, רקורסיבי, דורש עליה וירידה בעץ של הגזירה. השטחת העץ. חלק האופטימיזציות נח לעשות על עץ, וחלק על קוד
21
21 דוגמה לתפקידי החלקים
22
22 דוגמה לתפקידי החלקים
23
23 טבלת הסמלים מבנה נתונים לכל identifier. שומר את התכונות שלו (attributes) ומאפשר גישה מהירה. –לדוגמא: מיקום בזיכרון, טיפוס, scope. –הטבלה נבנית במהלך הניתוח. למשל: הניתוח הלקסיקלי לא מגלה מה הטיפוס. רק השלב של ייצור הקוד יודע את מיקום המשתנה בזיכרון, וכיו"ב.
24
24 הודעות שגיאה חלק חשוב של תהליך הקומפילציה כל שלב מגלה שגיאות ברמת הניתוח שלו של התוכנית. –מודיע על השגיאה –ומנסה כמיטב יכולתו להמשיך בקומפילציה
25
25 יתרון חשוב של מודולריות שפה א שפה ב... analysis 1 analysis n analysis 2 machine independent optimization machine dependent optimization code generation machine dependent optimization code generation מכונה 1מכונה m …
26
26 שפת ביניים שפה קלה לייצור, שקל לייצר ממנה קוד אמיתי, ונוחה לעבודה לאופטימיזציה. אנו נשתמש בצורה הנקראת three-address code שבה כל תא בזיכרון יכול לשמש פרמטר לכל פעולה. temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3
27
27 שלב האופטימיזציה יצירת קוד הביניים נעשית בצורה אוטומטית. הקוד ניתן לשיפור temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 temp1 := id3 * 60.0 id1 := id2 + temp1
28
28 שלב האופטימיזציה Decorated Syntax Tree machine independent optimization דוגמאות –constant propogation –common subexpressions –dead code elimination
29
29 אופטימיזציה לא ניתן לייצר קוד אופטימלי (NP-שלם, לא ניתן להכרעה, תלוי מה מנסים לעשות...). לכן משתמשים בהיוריסטיקות. חובה לשמור על נכונות; צריך לשפר (כמעט תמיד); חישוב האופטימיזציה צריך להיות יעיל. שיפורים: מהירות, מקום, אנרגיה, וכו'. החלק שתופס זמן מירבי בתהליך הקומפילציה. השאלה העיקרית: כמה זמן שווה להשקיע באופטימיזציה עבור ייעול תוכנית המטרה. –התשובה מאוד משתנה עבור JIT.
30
30 אופטימיזציה מודרנית האתגר העיקרי הוא לנצל פלטפורמות מודרניות –Multicores –פקודות ווקטוריות –היררכית זיכרונות –האם הקוד מועבר ברשת (Java Bytecode)?
31
31 שלב הסינתזה ((back-end decorated syntax tree decorated syntax tree target program address assignmet code generation machine dependent optimization peephole optimizer
32
32 ייצור קוד (Code Generation) שלב אחרון: ייצור קוד של שפת המטרה. משימה חשובה: החלטה על מיקום המשתנים בזיכרון. האתגר העיקרי: לאיזה משתנים יוקצו רגיסטרים באיזה שלב של התוכנית? –פעולות על רגיסטרים מהירות משמעותית מפעולות על הזיכרון. השמה אופטימלית למקרה הגרוע ביותר היא קשה (NP- קשה), היוריסטיקות מאד טובות קיימות.
33
33 ה- back-end, דוגמא a = 2 temp1 = a*2 b = temp1 + 1 address assignment machine indep. optimization machine-dependent optimization a 0 temp1 1 b 2 a = 2 temp1 = a << 1 b = temp1 + 1 SET R1,2 STORE #0,R1 LOAD R1,#0 SHIFT R1,1 STORE #1,R1 LOAD R1,#1 ADD R1,1 STORE #2,R1 int a, b; a = 2; b = a*2 + 1; SET R1,2 STORE #0,R1 SHIFT R1,1 STORE #1,R1 ADD R1,1 STORE #2,R1 (front end) code generation
34
34 כלים חלק משמעותי מהמאמץ בכתיבת קומפיילרים חוזר על עצמו בין קומפיילקים שונים. כלים מיועדים לחסוך את החלק החוזר. –Parser generators: חלקם מתבססים על אלגוריתמים מורכבים. –Scanner generator (עבור ניתוח לקסיקאלי) –Syntax-directed translation engines מעבר על העץ האבסטרקטי ויצירת קוד ביניים ממנו ע"י ביצוע פעולה על כל צומת. –Data Flow Engines עבור אופטימיזציה.
35
35 לסיכום קומפיילר מתרגם משפת מקור לשפת יעד (ובדרך מספק בדיקת שגיאות חשובה). על מנת להקטין את הסיבוכיות התירגום מחולק למודולים ברורים ונפרדים. שלב ה-front-end מביא את התוכנית לייצוג ביניים שנוח לעבוד איתו באופן אוטומטי. שלב ה-back-end מבצע אופטימיזציות ומייצר קוד של שפת המטרה. בהמשך – נתחיל בהבנת ה-front-end.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.