Download presentation
Presentation is loading. Please wait.
1
236360 תורת הקומפילציה * * הידור, מהדיר, למהדרין. שקפי הקורס מבוססים על שקפים מאת פרופ' מיכאל רודה.
2
תורת הקומפילציה מרצה –דר' איל זקס zaks@il.ibm.com לכלול את מספר הקורס בכותרת ההודעה שעת קבלה – מיד בתום ההרצאה מתרגלים –דני גז, מתרגל אחראי –רותם אושמן אתר הקורס http://webcourse.cs.technion.ac.il/236360
3
בסיס לציונים 10% - שלושה תרגילים על יבש (מגן) 30% - מספר תרגילי הרצה 60% - מבחן סוף הקורס
4
ספרות ספר עיקרי 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
5
ספרות-המשך ספר נוסף K.D.Cooper and L.Torczon “Engineering A Compiler”, Morgan Kaufmann, 2004
6
הידור – נושא מורכב קומפילציה שפות תכנות הנדסת תכנה מבנה מחשבים מערכות הפעלה שפות פורמליות אלגוריתמים מבני נתונים
7
הידור – מושגי יסוד זמן קומפילציה זמן ריצה compiler source programtarget program target program outputinput
8
שיטות הידור – שימושים יעד קוד מכונה: 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) שפות בקרה
9
ההקשר הרחב – שרשרת כלים (tool chain), לרוב: Skeletal source program Preprocessor Source program Target assembly program Assembler Relocateable machine code Loader/Link-editor Absolute machine code compiler Library, releasable, object files
10
אינטרפרטציה = פרשנות interpreter source program input output
11
הידור / אינטרפרטציה – הכללות Just In Time -- תוך כדי פרשנות התכנית, ה- interpreter מבצע קומפילציה של חלקי תוכנית על מנת שהמשך הביצוע יהיה מהיר יותר. דוגמא: Java Source to Source Virtual Machine Pre-processors Eiffel program C program translator Java bytecodeJava program compiler “pure” program program with embedded pre-pocessing statements (e.g., #include in C, macros) preprocessor
12
קומפילציה – חשיבות התחום למפתחי תוכנה –הבנה מעמיקה מה יעשה קומפיילר עם התוכנה שלכם (שיפור ריצתה, התראת שגיאותיה) –שימוש יעיל בשפת תכנות, ובארכיטקטורת המחשב –ניצול כלים קיימים, כגון לקריאת קבצי קלט (קבצי קונפיגורציה ואילך) לאנשי שפות תכנות –תמיכה יעילה בשפה חדשה לאנשי ארכיטקטורה של מחשבים –הבנה מעמיקה מה יעשה קומפיילר/תוכנה עם החומרה שלכם לסטודנטים בפקולטה למדעי המחשב –חובה להשלמת התואר
13
תורת הקומפילציה – תכנים עיקריים עקרונות מבנה הקומפיילר ניתוח מילוני (lexical analysis) ניתוח תחבירי (parsing) ניתוח סמנטי יצירת קוד נושאים מתקדמים: –אופטימיזציה –ניתוח סטטי –Data-flow analysis –קומפיילרים Just-In-Time ו-Virtual Machines
14
קומפיילר של... סקירה זריזה של שפות תכנות עיקריות
15
שיקולים בבחירת שפה למימוש תחום השימוש – הכלי הנכון למשימה המתאימה – אין " השפה הכי טובה " יעילות התוכנה משך הפיתוח –כתיבת התכנית –הידור, בדיקה, וניפוי טעויות –(לימוד, אימון) תחזוקה –קריאות התכנית זמינות מימושים קודמים
16
FORTRAN, 1954-58, John Backus (IBM) תחום : חישוב מדעי אפיונים –ביטויים אריתמטיים –מערכים חסומים –פרוצדורות –common blocks – call by reference –קלט / פלט מודל מימוש –דרישות שטח קבועות מראש –דגש על אופטימיזציה של חישובים נומריים עדיין בשימוש
17
ALGOL 60, 57-60 Committee (Backus, McCathy, Naur, …) תחום : חישוב נומרי אפיונים –הוגדר בקפידה – התחביר הוגדר ע"י BNF –מבנה בלוקים –פרוצדורות רקורסיביות –הגדרה מפורשת של טיפוסים –חוקי scoping –העברת פרמטרים by value & ו-by name –dynamic array bounds שימושים –מעט, בעיקר באירופה השפעה רבה על התחום ( על שפות מאוחרות יותר )
18
Pascal etc., 1971 (Niklaus Wirth) תחום : חישובים כללים, חינוך אפיונים –פשטות במימוש ובשפה –הגדרות של טיפוסים רבים –מתודולוגיה של תכנות מובנה –מתאים להוכחת נכונות של תכניות דיאלקטים שונים –Modula-2 1970-81 –Oberon, Oberon-2 1988-90, 1992 –Modula-3 1988-89
19
COBOL 1959-61 DOD-led committee תחום : עבוד נתונים אפיונים –תיאור ניפרד לנתונים –מבנה נתונים של records –תיאור קבצים ופעולות עליהם –תחביר דמוי אנגלית עדיין בשימוש נרחב
20
C, 1972-1974, Dennis Ritchie (Bell Labs) תחום : תכנות מערכות ( תכנות ה - Unix kernel והשירותים הנלווים ) אפיונים –כר נרחב של פעולות –תחביר תמציתי –תמיכה בגישה למשאבי המכונה בשימוש נרחב בכל תחום כמעט שפה פופולרית מאוד
21
C++, 1980-, Bjarne Stroustrup תחום : תכנות מערכות אבל גם פיתוח שימושים אפיונים –הרחבה של C –תמיכה עבור טיפוסים אבסטרקטיים (abstract data types) –מונחת עצמים –שפה עשירה ומסובכת בשימוש נרחב יותר נזק מתועלת ?
22
Java, 1995-, Arnold & Gosling (Sun) תחום : מגוון רחב של שימושים, עם דגש על ניצול תשתיות תקשורת אפיונים –ניהול אוטומטי של הזכרון (garbage collection) –אי-תלות בחומרה (JVM) בשימוש נרחב
23
LISP, 1959-60, John McCarthy (MIT) תחום : בינה מלאכותית וחישובים סימבוליים אפיונים –עיבוד רשימות (list processing) –תחביר פשוט –תכניות יכולות בקלות לנתח תכניות אחרות –טיפוסים דינאמיים וריאציות רבות (Common Lisp, Scheme )
24
Prolog, 1972, Colmerauer and Kowalski שפת תכנות "לוגית" היוותה בסיס למחקר נרחב –פרוייקט "הדור החמישי" ביפן –מסדי נתונים רלציוניים, SQL בשימוש מועט הובילה לשפות לוגיות אחרות – כגון Datalog
25
מבנה הקומפיילר – תמונה כללית Wilhelm and Maurer – Chapter 6 Aho, Sethi, and Ullman – Chapter 1 Cooper and Torczon – Chapter 1
26
קומפיילר – כקופסא שחורה 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
27
קומפילר – מבנה סכמתי תוכנית מקור תוכנית מטרה analysis code optimization code generation החלק הקשה בעולם האמיתי ייצוג ביניים + טבלת סמלים ייצוג ביניים החלק ה"קשה" לסטודנטים בקורס
28
Intermediate Representation - ייצוג ביניים הניתוח מייצר קוד בשפה נמוכה מאוד –מכילה בד"כ רק השמה, אריתמטיקה (פעולה אחת בשורה!), קפיצה (goto) וקפיצה מותנית משמשת כבסיס לייצור קוד מכונה כל שורה מכילה פקודה אחת אין ביטויים מורכבים
29
טבלת הסמלים כוללת שורה עבור כל סמל בתוכנית –שמות משתנים, מחלקות, פונקציות, פרוצדורות, מתודות, ועוד – תלוי בשפת התכנות מידע רלוונטי לכל סמל –טיפוס (עבור משתנים, פונקציות) –ערך (עבור קבועים) –פרמטרים וטיפוסיהם (עבור פונקציות, פרוצדורות, מתודות) –וכדומה קיים בעיקר בזמן הקומפילצייה –קיים בזמן ריצה רק למטרות de-bugging, או –בשפות עם מנגנוני Reflection (כגון Java, C#, Eiffel) יש חלק מהמידע גם בזמן ריצה "רגילה"
30
למשל... a = 2 temp1 = a*2 b = temp1 + 1 int a, b; a = 2; b = a*2 + 1; inta temp1 intb
31
שימוש חוזר במרכיבי הקומפיילר שפה א שפה ב שפה n analysis 1 analysis n analysis 2 machine independent optimization machine dependent optimization code generation machine dependent optimization code generation מכונה 1מכונה m …
32
שימוש חוזר במרכיבי הקומפיילר – לדוגמא בקומפיילר GCC C front end C++ front end Fortran front end Java front end Ada front end... i386 back end s390 back end rs6000 back end sparc back end arm back end... Optimizer ('middle end')
33
שימוש חוזר ברכיבים של מישהו אחר כיום, שפות רבות "חוסכות" את הצורך לכתוב optimizers טובים במיוחד לפלטפורמות שונות. פשוט מתרגמים את הקוד ל-C, ומניחים שלכל פלטפורמה יש קומפיילר C ראוי לשמו. –"cross-platform assembly" גם תרגום לשפת C הוא תהליך קומפילציה... גם כאן יש מקום לאופטימיזציות.
34
קומפילר – מבנה סכמתי תוכנית מקור תוכנית מטרה analysis machine independent optimization machine dependent optimization code generation front end back end
35
front end – שלב הניתוח תוכנית מקור Back end lexical analysis syntax analysis semantic analysis token stream syntax tree decorated syntax tree scanner parser
37
אנליזה של ביטוי
38
Abstract Syntax Tree – AST
39
Decorated/Annotated AST
40
כפל משמעות איך נראה ה-AST של הביטוי: 9-5+2 ?
41
כפל משמעות: 9-5+2 + - 2 95 - 9 + 25
42
דקדוקים ומשמעויות המשמעות ה"נכונה" נבחרת בהתאם לדקדוק פעמים רבות ניתן לכתוב את אותם הכללים בעזרת דקדוקים חד-משמעיים או דו-משמעיים –נחשו מה עדיף. לשפות מורכבות מאוד (קרי: מציאותיות) בדרך- כלל אין דקדוק חד-משמעי –או שהוא מורכב להחריד. –יש פתרונות אחרים לדו-משמעויות...
43
שלב האופטימיזציה Decorated Syntax Tree machine independent optimization דוגמאות –constant propogation –common subexpression elimination –dead code elimination איזון בין זמן קומפילציה לזמן ריצה
44
שלב הסינתזה ((back-end decorated syntax tree decorated syntax tree target program address assignment code generation machine dependent optimization peephole optimizer
45
ה- 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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.