1 / 80

תורת הקומפילציה 236360 הרצאה 1 מבוא; ניתוח לקסיקלי

תורת הקומפילציה 236360 הרצאה 1 מבוא; ניתוח לקסיקלי. תורת הקומפילציה 236360. מרצה: פרופ"ח ארז פטרנק erez@cs שעת קבלה – יום חמישי 13:30-14:30 טאוב 528 מתרגלים קירה רדינסקי , מתרגלת אחראית גלעד קותיאל. אדמיניסטרציה. אתר: http://webcourse.cs.technion.ac.il/236360 25% - תרגילי בית

Download Presentation

תורת הקומפילציה 236360 הרצאה 1 מבוא; ניתוח לקסיקלי

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תורת הקומפילציה 236360 הרצאה 1 מבוא; ניתוח לקסיקלי

  2. תורת הקומפילציה 236360 • מרצה: פרופ"ח ארז פטרנק • erez@cs • שעת קבלה – יום חמישי 13:30-14:30 טאוב 528 • מתרגלים • קירה רדינסקי, מתרגלת אחראית • גלעד קותיאל

  3. אדמיניסטרציה • אתר: http://webcourse.cs.technion.ac.il/236360 • 25% - תרגילי בית • 5% תרגילים "יבשים", רשות (מגן) • 20% תרגילים "רטובים", חובה • 75% - מבחן סוף הקורס • ציון נכשל במבחן גורר כשלון בקורס, ללא קשר לציון התרגילים. • קדם:אוטומטים ושפות פורמליות 236353 • מועד ג' למילואימניקים (בלבד). • העתקות...

  4. ספרות • ספר עיקרי 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

  5. ספרות-המשך • ספר נוסף K.D.Cooper and L.Torczon “Engineering A Compiler”, Morgan Kaufmann, 2004

  6. פרס טיורינג 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.

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

  8. קומפילציה (הידור) – מושגי יסוד • זמן קומפילציה • זמן ריצה compiler source program target program target program input output

  9. אינטרפרטציה )= פרשנות( source program interpreter output input • שימושים: • שפות סקריפט שבהם כל שורה קוראת לביצוע של משהו מורכב (אין טעם ליעל) • שפות מאד גבוהות (APL, Mathlab) שבהן הנתונים מורכבים ואינם ידועים בעת הקומפילציה

  10. דוגמא למבנה מודרני חשוב - Java source program Bytecode is standard, machine-independent Translator (javac) Intermediate program (bytecode) Java Virtual Machine output input Virtual machine- תלוי מכונה. מבצע טוב כפי יכולתו על המכונה הנתונה. Just In Time -- תוך כדי פרשנות התכנית, ה-interpreter מבצע קומפילציה של חלקי תוכנית על מנת שהמשך הביצוע יהיה מהיר יותר.

  11. הידור / אינטרפרטציה – הכללות • Source to Source • Virtual Machine • Pre-processors translator C program C ++ program compiler Java program Java bytecode program with embedded pre-pocessing statements (e.g., #include, macros) preprocessor “pure” program

  12. יעד קוד מכונה: 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) שפות בקרה שימושים של קופיילרים

  13. כלים נוספים לעיבוד שפה – דוגמא 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:

  14. קומפילציה – חשיבות התחום • לפיתוח שמושים מתקדמים • ניצול של כלים לפיתוח קומפיילרים להקלת מאמץ הפיתוח • קריאה (ו"הבנה")אוטומטית של קבצי קלט • למפתחי תוכנה • הבנה של האבחנה בין זמן קומפילציה לזמן ריצה • הבנה של מה יעשה קומפיילר עם התוכנה שלכם(שיפור זמן ריצה, התראות של שגיאות) • שימוש נכון במבנים שונים של שפות התכנות • ניצול נכון של ארכיטקטורת המחשב

  15. קומפילציה – חשיבות התחום • לאנשי שפות תכנות • תמיכה יעילה בשפה חדשה • לאנשי ארכיטקטורה של מחשבים • הבנה טובה של האיזון העדין שבין חומרה לתכנה • הבנה מעמיקה מה יעשה קומפיילר (כלומר:מה תעשה כל תוכנה) עם החומרה שלכם

  16. תורת הקומפילציה – תוכן הקורס • מבוא • מבנה הקומפיילר • ניתוח מילוני (lexical analysis) • ניתוח תחבירי (parsing) • ניתוח סמנטי • יצירת קוד • סביבת זמן הריצה (טיפול ברוטינות, ניהול זיכרון, וכו') • נושאים מתקדמים: • אופטימיזציות, ניתוח סטטי, Data-flow analysis, • לא נדבר על:קומפיילרים Just-In-Time ו-Virtual Machines,

  17. מבנה הקומפיילר – תמונה כללית Wilhelm and Maurer – Chapter 6 Aho, Sethi, and Ullman – Chapter 1 Cooper and Torczon – Chapter 1

  18. קומפיילר – כקופסא שחורה int a, b; a = 2; b =a*2+ 1; • מתרגם משפת המקור לשפת היעד • תוכנית זהה סמנטית(עושה אותו דבר) • כיוון שהתירגום מסובך, חילקו אותו לשלבים מודולריים סטנדרטיים. source code target code SET R1,2 STORE #0,R1 SHIFT R1,1 STORE #1,R1 ADD R1,1 STORE #2,R1

  19. קומפיילר – חלוקה גסה תוכנית מקור תוכנית מטרה analysis Front End יצוג ביניים code optimization ייצוג ביניים Back End code generation

  20. מרכיבי הקומפיילר – חלוקה עדינה Character Stream Intermediate Representation Lexical Analyzer Machine-Independent Code Optimization Token Stream Syntax Analyzer Intermediate Representation Syntax Tree Code Generator Semantic Analyzer Target Machine Code Decorated Syntax Tree Machine-Dependent Code Optimization Intermediate Code Generator Target Machine Code

  21. מרכיבי הקומפיילר – Front End Character Stream קל, טיפול בביטויים רגולריים Lexical Analyzer Token Stream יותר מסובך, רקורסיבי, עבודה עם דקדוק חסר הקשר. Syntax Analyzer Syntax Tree יותר מסובך, רקורסיבי, דורש עליה וירידה בעץ של הגזירה. Semantic Analyzer Decorated Syntax Tree השטחת העץ. חלק האופטימיזציות נח לעשות על עץ, וחלק על קוד Intermediate Code Generator

  22. דוגמה לתפקידי החלקים

  23. דוגמה לתפקידי החלקים

  24. טבלת הסמלים • מבנה נתונים לכל identifier. שומר את התכונות שלו (attributes) ומאפשר גישה מהירה. • לדוגמא: מיקום בזיכרון, טיפוס, scope. • הטבלה נבנית במהלך הניתוח. למשל:הניתוח הלקסיקלי לא מגלה מה הטיפוס. רק השלב של ייצור הקוד יודע את מיקום המשתנה בזיכרון, וכיו"ב.

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

  26. machine dependent optimization machine dependent optimization code generation code generation יתרון חשוב של מודולריות שפה ב ... שפה א analysis 2 analysis n analysis 1 machine independent optimization … מכונה m מכונה 1

  27. שפת ביניים • שפה קלה לייצור, שקל לייצר ממנה קוד אמיתי, ונוחה לעבודה לאופטימיזציה. • אנו נשתמש בצורה הנקראת three-address code שבה כל תא בזיכרון יכול לשמש פרמטר לכל פעולה. temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3

  28. שלב האופטימיזציה • יצירת קוד הביניים נעשית בצורה אוטומטית. • הקוד ניתן לשיפור temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 temp1 := id3 * 60.0 id1 := id2 + temp1

  29. שלב האופטימיזציה • דוגמאות • constant propogation • common subexpressions • dead code elimination Decorated Syntax Tree Decorated Syntax Tree machine independent optimization

  30. אופטימיזציה • לא ניתן לייצר קוד אופטימלי (NP-שלם או לא ניתן להכרעה, תלוי מה מנסים לעשות...). לכן משתמשים בהיוריסטיקות. • חובה לשמור על נכונות; צריך לשפר (כמעט תמיד); חישוב האופטימיזציה צריך להיות יעיל. • שיפורים:מהירות, מקום, אנרגיה, וכו'. • החלק שתופס זמן מירבי בתהליך הקומפילציה. • השאלה העיקרית:כמה זמן שווה להשקיע באופטימיזציה עבור ייעול תוכנית המטרה. • התשובה מאוד משתנה עבור JIT.

  31. אופטימיזציה מודרנית • האתגר העיקרי הוא לנצל פלטפורמות מודרניות • Multicores • פקודות ווקטוריות • היררכית זיכרונות • האם הקוד מועבר ברשת (Java Bytecode)?

  32. שלב הסינתזה ((back-end decorated syntax tree decorated syntax tree target program target program address assignmet code generation machine dependent optimization peephole optimizer

  33. ייצור קוד (Code Generation) • שלב אחרון:ייצור קוד של שפת המטרה. • משימה חשובה:החלטה על מיקום המשתנים בזיכרון. • האתגר העיקרי:לאיזה משתנים יוקצו רגיסטרים באיזה שלב של התוכנית? • פעולות על רגיסטרים מהירות משמעותית מפעולות על הזיכרון. • השמה אופטימלית למקרה הגרוע ביותר היא קשה (NP-קשה), היוריסטיקות מאד טובות קיימות.

  34. ה- back-end, דוגמא int a, b; a = 2; b =a*2+ 1; (front end) a = 2 temp1 = a*2 b = temp1 + 1 address assignment a0 temp1 1 b2 code generation a = 2 temp1 = a << 1 b = temp1 + 1 machine indep. optimization SET R1,2 STORE #0,R1 LOAD R1,#0 SHIFT R1,1 STORE #1,R1 LOAD R1,#1 ADD R1,1 STORE #2,R1 SET R1,2 STORE #0,R1 SHIFT R1,1 STORE #1,R1 ADD R1,1 STORE #2,R1 machine-dependent optimization

  35. כלים • חלק משמעותי מהמאמץ בכתיבת קומפיילרים חוזר על עצמו בין קומפיילקים שונים. • כלים מיועדים לחסוך את החלק החוזר. • Parser generators: חלקם מתבססים על אלגוריתמים מורכבים. • Lexical generator(עבור ניתוח לקסיקאלי) • Syntax-directed translation engines מעבר על העץ האבסטרקטי ויצירת קוד ביניים ממנו ע"י ביצוע פעולה על כל צומת. • Data Flow Engines עבור אופטימיזציה.

  36. לסיכום • קומפיילר מתרגם משפת מקור לשפת יעד (ובדרך מספק בדיקת שגיאות חשובה). • על מנת להקטין את הסיבוכיות התירגום מחולק למודולים ברורים ונפרדים. • שלב ה-front-end מביא את התוכנית לייצוג ביניים שנוח לעבוד איתו באופן אוטומטי. • שלב ה-back-end מבצע אופטימיזציות ומייצר קוד של שפת המטרה. • בהמשך – נתחיל בהבנת ה-front-end.

  37. ניתוח לקסיקלי Wilhelm, and Maurer – Chapter 7 Aho, Sethi, and Ullman – Chapter 3 Cooper and Torczon – Chapter 2

  38. front-end שלב הניתוח תוכנית מקור Back end • בקומפיילרים רבים כל השלבים של ה-front-end משולבים זה בזה • בקומפיילרים רבים ייצוג הביניים הוא decorated syntax tree Lexical analysis token string symbol table error messages syntax analysis syntax tree semantic analysis decorated syntax tree

  39. מנתח לקסיקלי – אינטרקציה עם ה-parser תוכנית מקור Lexical Analyzer error message manager get next token token parser

  40. מדוע מפרידים ניתוח לקסיקלי? • פישוט הניתוח הלקסיקלי (והגדרת השפה) ופישוט הניתוח הסינטקטי • מודולריות • שימוש חוזר • יעילות – ההפרדה מקלה לממש אלגוריתמים יעודיים יעילים.

  41. מושגים בסיסיים • lexeme = לקסמה (לפעמים נקרא גם symbol): סדרת אותיות המופרדת משאר התוכנית באופן מוסכם (למשל ע"י רווח או נקודה). לדוגמא:counter . • Pattern: כלל המגדיר אוסף של מחרוזות. (לדוגמא:כל המחרוזות שמתחילות באות וממשיכות באות או מספר). • token = אסימון: זוג של שם ותכונות. למשל: (identifier, {name=“counter”,code_location=3}). שם ה-token נקבע עפ"י ה-pattern שהלקסמה מקיימת.

  42. תפקידי ה- lexical analyzer • קריאת הקלט, והפרדתו ליחידות לקסיקליות (לקסמות) • דוגמאות: integer, real, boolean, string , שמות משתנים, הערות, סימנים מיוחדים (למשל =<). • זיהוי ה-patterns, מיונם ויצירת tokens עם שמות ותכונות. • טיפול ב- keywords -- מילות מפתח שאינן שמורות, • זיהוי reserved words, • לפעמים מממש גם preprocessing, (include files ו- macros). • ספירת מספר שורות (למה?) • דיווח על שגיאות: symbols לא חוקיים. • הדפסת פלט (התוכנית בשילוב הודעות שגיאה), עשוי לכלול pretty printing. • (יש לעקוב אחרי מספרי השורות והעמודות בהם מופיעים ה- tokens)

  43. Typical Tokens (Patterns) • Token אחד לכל מילה שמורה בשפה (למשל if, else, וכיו"ב) • Token אחד לכל אופרטור. לפעמים הם ארוזים במשפחות. למשל משפחת ההשוואות:comparisons = < or > or <= or >= or == or != . • Token אחד המייצג את כל שמות המשתנים (identifier). למשל: counter, score, employee. • Token אחד או יותר המייצגים קבועים (בד"כ מספרים ומחרוזות). למשל: 35, 27.34, 23e5, “Billie Holiday” . • Token אחד לכל סימן פיסוק. למשל: ( ) , ; { } .

  44. משפחות של סמלים (Patterns)

  45. טיפול מיוחד במחרוזות שאינן סמלים

  46. תכונות • תכונות של token ישמשו לשלבים הבאים של הקומפילציה או להודעות שגיאה. • token נפוץ לדוגמא הוא שם משתנה (identifier). תכונות סטנדרטיות שנרצה לשמור עבורו יכללו: • שם המשתנה (הלקסמה) • מיקום המשתנה בתוכנית (עבור הודעות שגיאה) • טיפוס המשתנה • התכונות האלו נשמרות בד"כ בטבלת הסמלים, ולכן ב-token מספיק לרשום את מספר הכניסה בטבלה.

  47. מעבר מלקסמות ל-tokens

  48. דוגמא • עבור הביטוי e = m * c ** 2 :, נעביר את ה-tokens הבאים: < id , pointer to symbol table entry for e > < assignment > < id , pointer to symbol table entry for m> < multiplication > < id , pointer to symbol table entry for c> < exponentiation > < number , integer value 2 >

  49. הקושי ב-lexical analysis – דוגמאות • בשפת פסקלקל: Const pi = 3.1416 ; • ב-Fortran הרווחים אינם נחשבים. לכן ההחלטה על סיום לקסמה יותר מורכבת. למשל, do 5 I = 1.2 • אבל: do 5 I = 1 , 2 כאן מודגש הצורך ב- lookahead (שפות מודרניות מתוכננות כך שלא תיווצרנה בעיות כאלו.) • ב-Pascal ו-Ada1. ו- 10. אינם נחשבים שברים, כי זה מקשה את הזיהוי של1..10.

  50. ניסוח הtokens- המותרים בשפה • נרצה דרך סטנדרטית להכריז מהם הסימבולים החוקיים בשפה. • לשם כך נשתמש בביטויים רגולריים. • אוטומטים המבטאים את הביטויים הרגולריים ישימשו לסריקת הקלט וזיהוי ה-tokens. • תזכורת לתיאוריה...

More Related