View
246
Download
0
Embed Size (px)
Citation preview
1
236360תורת הקומפילציה
מרצה•פרופ"ח ארז פטרנק–
•erez@cs528 טאוב 13:30-14:30שעת קבלה – יום שני •
מתרגלים•, מתרגלת אחראיתקירה רדינסקי–חגי טולדנו–
2
אדמיניסטרציה
http://webcourse.cs.technion.ac.il/236360 אתר:• - תרגילי בית25%•
תרגילים "יבשים", רשות )מגן(5%– תרגילים "רטובים", חובה20%–
- מבחן סוף הקורס75%•ציון נכשל במבחן גורר כשלון בקורס, ללא קשר לציון •
התרגילים. 236353אוטומטים ושפות פורמליות קדם:•מועד ג' למילואימניקים )בלבד(.•העתקות...•
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
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
מורכבות
קומפילציה
שפות תכנות
הנדסת תכנה
מבנה מחשבים
מערכות הפעלהשפות פורמליות
אלגוריתמים
מבני נתונים
משלב תחומים רבים ממדעי המחשב•משלב מחקר תיאורטי ומעשי•
7
קומפילציה )הידור( – מושגי יסוד
זמן קומפילציה•
זמן ריצה•
compilersource program target program
target program
outputinput
8
)= פרשנות(אינטרפרטציה
interpreter
source program
input
output
שימושים:שפות סקריפט שבהם כל שורה קוראת לביצוע של משהו מורכב )אין טעם ליעל(-( שבהן הנתונים מורכבים ואינם ידועים בעת הקומפילציהAPLשפות מאד גבוהות )-
9
דוגמא למבנה מודרני חשוב - Java
source program
inputoutput
Translator )javac(
Intermediate program)bytecode(
Bytecode is standard,machine-independent
Just In Time ,תוך כדי פרשנות התכנית -- מבצע קומפילציה של חלקי interpreterה-
תוכנית על מנת שהמשך הביצוע יהיה מהיר . יותר
Java Virtual Machine
Virtual machine תלוי מכונה. מבצע טוב כפי -יכולתו על המכונה הנתונה.
10
הידור / אינטרפרטציה – הכללות
•Source to Source
•Virtual Machine
•Pre-processors
C ++ program C programtranslator
Java bytecodeJava program compiler
“pure” programprogram with embeddedpre-pocessing statements(e.g., #include, macros)
preprocessor
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
כלים נוספים לעיבוד שפה – דוגמא
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
קומפילציה – חשיבות התחום
לפיתוח שמושים מתקדמים•ניצול של כלים לפיתוח קומפיילרים להקלת מאמץ –
הפיתוחאוטומטית של קבצי קלט קריאה )ו"הבנה"(–
למפתחי תוכנה•הבנה של האבחנה בין זמן קומפילציה לזמן ריצה–הבנה של מה יעשה קומפיילר עם התוכנה שלכם–
)שיפור זמן ריצה, התראות של שגיאות(שימוש נכון במבנים שונים של שפות התכנות–ניצול נכון של ארכיטקטורת המחשב–
14
קומפילציה – חשיבות התחום
לאנשי שפות תכנות•תמיכה יעילה בשפה חדשה–
לאנשי ארכיטקטורה של מחשבים•הבנה טובה של האיזון העדין שבין חומרה –
לתכנהמה הבנה מעמיקה מה יעשה קומפיילר )כלומר:–
תעשה כל תוכנה( עם החומרה שלכם
15
תורת הקומפילציה – תוכן הקורסמבוא•מבנה הקומפיילר•(lexical analysisניתוח מילוני )•(parsingניתוח תחבירי )•ניתוח סמנטי•יצירת קוד•נושאים מתקדמים:•
, ניהול Data-flow analysisאופטימיזציות, ניתוח סטטי, –, Virtual Machines ו-Just-In-Timeזיכרון, קומפיילרים
קומפיילרים "פתוחים"
16
מבנה הקומפיילר – תמונה כללית
Wilhelm and Maurer – Chapter 6
Aho, Sethi, and Ullman – Chapter 1
Cooper and Torczon – Chapter 1
17
קומפיילר – כקופסא שחורה
target code
int a, b;a = 2;b = a*2 + 1;
SET R1,2STORE #0,R1SHIFT R1,1STORE #1,R1ADD R1,1STORE #2,R1
source code
מתרגם משפת המקור לשפת היעד•)עושה אותו תוכנית זהה סמנטית•
דבר(כיוון שהתירגום מסובך, חילקו אותו •
לשלבים מודולריים סטנדרטיים.
18
קומפיילר – חלוקה גסה
תוכנית מקור
תוכנית מטרה
analysis
code optimization
code generation
יצוג ביניים
ייצוג ביניים
Front End
Back End
19
מרכיבי הקומפיילר – חלוקה עדינהCharacter Stream
Lexical Analyzer
Token Stream
Syntax Analyzer
Syntax Tree
Semantic Analyzer
Decorated Syntax Tree
Machine-IndependentCode Optimization
Intermediate Representation
Code Generator
Target Machine Code
Machine-Dependent Code Optimization
Intermediate Code Generator
Intermediate Representation
Target Machine Code
20
Front Endמרכיבי הקומפיילר – Character Stream
Lexical Analyzer
Token Stream
Syntax Analyzer
Syntax Tree
Semantic Analyzer
Decorated Syntax Tree
Intermediate Code Generator
קל, טיפול בביטויים רגולריים
יותר מסובך, רקורסיבי, עבודהעם דקדוק חסר הקשר.
יותר מסובך, רקורסיבי, דורש עליה וירידה בעץ של הגזירה.
השטחת העץ. חלק האופטימיזציות נח לעשות על עץ, וחלק על קוד
23
טבלת הסמלים
. שומר את identifierמבנה נתונים לכל •( ומאפשר גישה attributesהתכונות שלו )
מהירה..scope מיקום בזיכרון, טיפוס, לדוגמא:–הניתוח הטבלה נבנית במהלך הניתוח. למשל:–
הלקסיקלי לא מגלה מה הטיפוס. רק השלב של ייצור הקוד יודע את מיקום המשתנה בזיכרון,
וכיו"ב.
24
הודעות שגיאה
חלק חשוב של תהליך הקומפילציה•
כל שלב מגלה שגיאות ברמת הניתוח שלו של •התוכנית.
מודיע על השגיאה–ומנסה כמיטב יכולתו להמשיך בקומפילציה–
25
יתרון חשוב של מודולריות ...שפה בשפה א
analysis 1 analysis n analysis 2
machine independent optimization
machine dependent optimization
code generation
machine dependent optimization
code generation
mמכונה 1מכונה
…
26
שפת ביניים
שפה קלה לייצור, שקל לייצר ממנה קוד אמיתי, •ונוחה לעבודה לאופטימיזציה.
three-addressאנו נשתמש בצורה הנקראת •code שבה כל תא בזיכרון יכול לשמש פרמטר
לכל פעולה.
temp1 := inttoreal)60(temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3
27
שלב האופטימיזציה
יצירת קוד הביניים נעשית בצורה אוטומטית. •
הקוד ניתן לשיפור•
temp1 := inttoreal)60(temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3
temp1 := id3 * 60.0id1 := id2 + temp1
28
שלב האופטימיזציה
Decorated Syntax Tree
Decorated Syntax Tree
machine independent optimization
דוגמאות•–constant propogation–common subexpressions–dead code elimination
29
אופטימיזציה
-שלם, לא ניתן NPלא ניתן לייצר קוד אופטימלי )•להכרעה, תלוי מה מנסים לעשות...(. לכן משתמשים
בהיוריסטיקות.חובה לשמור על נכונות; צריך לשפר )כמעט תמיד(; •
חישוב האופטימיזציה צריך להיות יעיל.מהירות, מקום, אנרגיה, וכו'. שיפורים:•החלק שתופס זמן מירבי בתהליך הקומפילציה.•כמה זמן שווה להשקיע השאלה העיקרית:•
באופטימיזציה עבור ייעול תוכנית המטרה..JITהתשובה מאוד משתנה עבור –
30
אופטימיזציה מודרנית
האתגר העיקרי הוא לנצל פלטפורמות מודרניות•–Multicores פקודות ווקטוריות–היררכית זיכרונות–(?Java Bytecodeהאם הקוד מועבר ברשת )–
31
back-end)שלב הסינתזה )
decorated syntax tree
decorated syntax tree
target program
target program
address assignmet
code generation
machine dependent optimizationpeephole optimizer
32
(Code Generation)ייצור קוד
ייצור קוד של שפת המטרה. שלב אחרון:•החלטה על מיקום המשתנים בזיכרון. משימה חשובה:•לאיזה משתנים יוקצו רגיסטרים האתגר העיקרי:•
באיזה שלב של התוכנית?פעולות על רגיסטרים מהירות משמעותית מפעולות על –
הזיכרון.
השמה אופטימלית למקרה הגרוע ביותר היא קשה •(NP.היוריסטיקות מאד טובות קיימות ,)קשה-
33
, דוגמאback-endה- a = 2temp1 = a*2b = temp1 + 1
addressassignment
machine indep.optimization
machine-dependent
optimization
a0temp1 1
b2a = 2temp1 = a << 1b = temp1 + 1
SET R1,2STORE #0,R1LOAD R1,#0SHIFT R1,1STORE #1,R1LOAD R1,#1ADD R1,1STORE #2,R1
int a, b;a = 2;b = a*2 + 1;
SET R1,2STORE #0,R1SHIFT R1,1STORE #1,R1ADD R1,1STORE #2,R1
)front end(
codegeneration
34
כלים
חלק משמעותי מהמאמץ בכתיבת קומפיילרים חוזר •על עצמו בין קומפיילקים שונים.
כלים מיועדים לחסוך את החלק החוזר.•–Parser generators חלקם מתבססים על אלגוריתמים :
מורכבים.–Scanner generator)עבור ניתוח לקסיקאלי( –Syntax-directed translation engines מעבר על העץ
האבסטרקטי ויצירת קוד ביניים ממנו ע"י ביצוע פעולה על כל צומת.
–Data Flow Engines.עבור אופטימיזציה
35
לסיכום
קומפיילר מתרגם משפת מקור לשפת יעד )ובדרך •מספק בדיקת שגיאות חשובה(.
על מנת להקטין את הסיבוכיות התירגום מחולק •למודולים ברורים ונפרדים.
מביא את התוכנית לייצוג ביניים front-endשלב ה-•שנוח לעבוד איתו באופן אוטומטי.
מבצע אופטימיזציות ומייצר קוד של back-endשלב ה-•שפת המטרה.
.front-endבהמשך – נתחיל בהבנת ה-•