440 likes | 818 Views
236360 תורת הקומפילציה *. * הידור, למהדרין. שקפי הקורס מבוססים על שקפים מאת פרופ' מיכאל רודה. תורת הקומפילציה. מרצה מר טל כהן ctal@cs.technion.ac.il לכלול את מספר הקורס בכותרת ההודעה אחרת אין לכם סיכוי לעבור את מסנני הזבל שלי. שעת קבלה – מיד בתום ההרצאה, בחדר 507 מתרגלים
E N D
236360תורת הקומפילציה* * הידור, למהדרין. שקפי הקורס מבוססים על שקפים מאת פרופ' מיכאל רודה.
תורת הקומפילציה • מרצה • מר טל כהן • ctal@cs.technion.ac.il • לכלול את מספר הקורס בכותרת ההודעה • אחרת אין לכם סיכוי לעבור את מסנני הזבל שלי. • שעת קבלה – מיד בתום ההרצאה, בחדר 507 • מתרגלים • רותם אושמן, מתרגלת אחראית • דני גז
חג שמח! Photograph by Toby Ord
לוגיסטיקה • 30% - תרגילי בית • 10% תרגילים "יבשים", רשות (מגן) • 20% תרגילים "רטובים", חובה • 70% -- מבחן סוף הקורס • ציון נכשל בתרגילים הרטובים גורר כשלון בקורס, ללא קשר לציון המבחן. • ציון נכשל במבחן גורר כשלון בקורס, ללא קשר לציון התרגילים.
ספרות • ספר עיקרי A.V. Aho, R. Sethi, and J.D. Ullman – “Compilers – Principles, Techniques, and Tools”, Addison-Wesley, 1985 • ספר משני R. Wilhelm, and D. Maurer – “Compiler Design”, Addison-Wesley, 1995
שפות תכנות מבני נתונים הנדסת תכנה קומפילציה אלגוריתמים מבנה מחשבים שפות פורמליות מערכות הפעלה הידור – נושא מורכב
הידור – מושגי יסוד • זמן קומפילציה • זמן ריצה compiler source program target program target program input output
יעד קוד מכונה: 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) שפות בקרה שיטות הידור – שימושים
ההקשר הרחב – דוגמא Skeletal source program Preprocessor Source program Target assembly program Assembler Relocateable machine code Loader/Link-editor Absolute machine code compiler Library, releasable, object files
אינטרפרטציה = פרשנות source program interpreter output input
הידור / אינטרפרטציה – הכללות • Just In Time -- תוך כדי פרשנות התכנית, ה-interpreter מבצע קומפילציה של חלקי תוכנית על מנת שהמשך הביצוע יהיה מהיר יותר. דוגמא: Java • Source to Source • Virtual Machine • Pre-processors translator C program Eiffel program compiler Java program Java bytecode program with embedded pre-pocessing statements (e.g., C’s #include, macros) preprocessor “pure” program
קומפילציה – חשיבות התחום • לפיתוח שמושים מתקדמים • ניצול של כלים לפיתוח קומפיילרים להקלת מאמץ הפיתוח • כל מה שצריך לקרוא קובץ קלט (קבצי קונפיגורציה ואילך) • למפתחי תוכנה • הבנה מעמיקה של האבחנה בין זמן קומפילציה לזמן ריצה • שימוש נכון במבנים שונים של שפות התכנות • ניצול נכון של ארכיטקטורת המחשב • לאנשי ארכיטקטורה של מחשבים • הבנה טובה של האיזון העדין שבין חומרה לתכנה • לסטודנטים בפקולטה למדעי המחשב • חובה להשלמת התואר
תורת הקומפילציה – תכנים עיקריים • עקרונות • מבנה הקומפיילר • ניתוח מילוני (lexical analysis) • ניתוח תחבירי (parsing) • ניתוח סמנטי • יצירת קוד • נושאים מתקדמים: • אופטימיזציה • ניתוח סטטי • Data-flow analysis • קומפיילרים Just-In-Time ו-Virtual Machines
קומפיילר של... סקירה זריזה של שפות תכנות עיקריות
שיקולים בבחירת שפה למימוש • תחום השימוש • הכלי הנכון למשימה המתאימה • אין "השפה הכי טובה" • יעילות התוכנה • משך הפיתוח • כתיבת התכנית • הידור, בדיקה, וניפוי טעויות • (לימוד, אימון) • תחזוקה • קריאות התכנית • זמינות מימושים קודמים • אינרציה (עצלות?)
FORTRAN, 1954-58, John Backus (IBM) • תחום: חישוב מדעי • אפיונים • ביטויים אריתמטיים • מערכים חסומים • פרוצדורות • common blocks • call by reference • קלט / פלט • מודל מימוש • דרישות שטח קבועות מראש • דגש על אופטימיזציה של חישובים נומריים • עדיין בשימוש
ALGOL 60, 57-60 Committee (Backus, McCathy, Naur, …) • תחום: חישוב נומרי • אפיונים • הוגדר בקפידה – התחביר הוגדר ע"י BNF • מבנה בלוקים • פרוצדורות רקורסיביות • הגדרה מפורשת של טיפוסים • חוקי scoping • העברת פרמטרים by value & ו-by name • dynamic array bounds • שימושים • מעט, בעיקר באירופה • השפעה רבה על התחום (על שפות מאוחרות יותר)
Pascal etc., 1971 (Niklaus Wirth) • תחום: חישובים כללים, חינוך • אפיונים • פשטות במימוש ובשפה • הגדרות של טיפוסים רבים • מתודולוגיה של תכנות מובנה • מתאים להוכחת נכונות של תכניות • דיאלקטים שונים • Modula-2 1970-81 • Oberon, Oberon-2 1988-90, 1992 • Modula-3 1988-89
COBOL 1959-61 DOD-led committee • תחום: עבוד נתונים • אפיונים • תיאור ניפרד לנתונים • מבנה נתונים של records • תיאור קבצים ופעולות עליהם • תחביר דמוי אנגלית • עדיין בשימוש נרחב
C, 1972-1974, Dennis Ritchie (Bell Labs) • תחום: תכנות מערכות (תכנות ה- Unix kernel והשירותים הנלווים) • אפיונים • כר נרחב של פעולות • תחביר תמציתי • תמיכה בגישה למשאבי המכונה • בשימוש נרחב בכל תחום כמעט • שפה פופולרית מאוד
C++, 1980-, Bjarne Stroustrup • תחום: תכנות מערכות אבל גם פיתוח שימושים • אפיונים • הרחבה של C • תמיכה עבור טיפוסים אבסטרקטיים (abstract data types) • מונחת עצמים • שפה עשירה ומסובכת • בשימוש נרחב • יותר נזק מתועלת?
Java, 1995-, Arnold & Gosling (Sun) • תחום: מגוון רחב של שימושים, עם דגש על ניצול תשתיות תקשורת • אפיונים • ניהול אוטומטי של הזכרון (garbage collection) • אי-תלות בחומרה (JVM) • בשימוש נרחב
LISP, 1959-60, John McCarthy (MIT) • תחום: בינה מלאכותית וחישובים סימבוליים • אפיונים • עיבוד רשימות (list processing) • תחביר פשוט • תכניות יכולות בקלות לנתח תכניות אחרות • טיפוסים דינאמיים • וריאציות רבות (Common Lisp, Scheme )
Prolog, 1972, Colmerauer and Kowalski • שפת תכנות "לוגית" • היוותה בסיס למחקר נרחב • פרוייקט "הדור החמישי"ביפן • מסדי נתונים רלציוניים, SQL • בשימוש מועט • הובילה לשפות לוגיות אחרות – כגון Datalog
מבנה הקומפיילר – תמונה כללית Wilhelm and Maurer – Chapter 6 Aho, Sethi, and Ullman – Chapter 1
קומפילר – מבנה סכמתי תוכנית מקור תוכנית מטרה החלק ה"קשה" לסטודנטים בקורס analysis ייצוג ביניים +טבלת סמלים code optimization החלק הקשה בעולם האמיתי ייצוג ביניים code generation
ייצוג ביניים • הניתוח מייצר קוד בשפה נמוכה מאוד • מכילה בד"כ רק השמה, אריתמטיקה (פעולה אחת בשורה!), קפיצה (goto) וקפיצה מותנית • משמשת כבסיס לייצור קוד מכונה • כל שורה מכילה פקודה אחת • אין ביטויים מורכבים
טבלת הסמלים • כוללת שורה עבור כל סמל בתוכנית • שמות משתנים, מחלקות, פונקציות, פרוצדורות, מתודות, וכו' – תלוי בשפת התכנות • מידע רלוונטי לכל סמל • טיפוס (עבור משתנים, פונקציות) • ערך (עבור קבועים) • פרמטרים וטיפוסיהם (עבור פונקציות, פרוצדורות, מתודות) • וכו' • קיים בעיקר בזמן הקומפילצייה • קיים בזמן ריצה רק למטרות de-bugging, או • בשפות עם מנגנוני Reflection (כגון Java, C#, Eiffel) יש חלק מהמידע גם בזמן ריצה "רגילה"
למשל... int a, b; a = 2; b =a*2+ 1; a = 2 temp1 = a*2 b = temp1 + 1
machine dependent optimization machine dependent optimization code generation code generation שימוש חוזר במרכיבי הקומפיילר שפה ב ... שפה א analysis 2 analysis n analysis 1 machine independent optimization … מכונה m מכונה 1
שימוש חוזר ברכיבים של מישהו אחר • כיום, שפות רבות "חוסכות" את הצורך לכתוב optimizers טובים במיוחד לפלטפורמות שונות. • פשוט מתרגמים את הקוד ל-C, ומניחים שלכל פלטפורמה יש קומפיילר C ראוי לשמו. • "cross-platform assembly" • גם תרגום לשפת C הוא תהליך קומפילציה... • גם כאן יש מקום לאופטימיזציות.
קומפילר – מבנה סכמתי תוכנית מקור תוכנית מטרה front end analysis back end machine independent optimization machine dependent optimization code generation
front end – שלב הניתוח תוכנית מקור תוכנית מטרה scanner lexical analysis token stream parser syntax analysis syntax tree semantic analysis decorated syntax tree
כפל משמעות • איך נראה ה-AST של הביטוי: 9-5+2 ?
כפל משמעות + - ?? 2 - + 9 9 5 5 2
דקדוקים ומשמעויות • המשמעות ה"נכונה" נבחרת בהתאם לדקדוק • פעמים רבות ניתן לכתוב את אותם הכללים בעזרת דקדוקים חד-משמעיים או דו-משמעיים • נחשו מה עדיף. • לשפות מורכבות מאוד (קרי:מציאותיות) בדרך-כלל אין דקדוק חד-משמעי • או שהוא מורכב להחריד. • יש פתרונות אחרים לדו-משמעויות...
שלב האופטימיזציה Decorated Syntax Tree Decorated Syntax Tree • דוגמאות • constant propogation • common subexpressions • dead code elimination • איזון בין זמן קומפילצייה לזמן ריצה machine independent optimization
שלב הסינתזה ((back-end decorated syntax tree decorated syntax tree target program target program address assignment code generation machine dependent optimization peephole optimizer
ה- back-end, דוגמא int a, b; a = 2; b =a*2+ 1; (front end) a = 2 temp1 = a*2 b = temp1 + 1 address assignment a0 temp1 1 b2 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