35
1 הההה הההההההההה236360 הההה הההה"ה ההה הההההerez@cs ההה הההה – ההה ההה13:30-14:30 הההה528 ההההההה הההה ההההההה , הההההה הההההה ההה הההההה

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

  • 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

4

ספרות-המשךספר נוסף•

K.D.Cooper and L.Torczon

“Engineering A Compiler”, Morgan Kaufmann, 2004

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

קל, טיפול בביטויים רגולריים

יותר מסובך, רקורסיבי, עבודהעם דקדוק חסר הקשר.

יותר מסובך, רקורסיבי, דורש עליה וירידה בעץ של הגזירה.

השטחת העץ. חלק האופטימיזציות נח לעשות על עץ, וחלק על קוד

21

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

22

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

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בהמשך – נתחיל בהבנת ה-•