השוואה בין שפות תכנות תכנות ועוד מטה (
Transcription
השוואה בין שפות תכנות תכנות ועוד מטה (
השוואה בין שפות תכנות )ועוד מטה-תכנות( בספר :פרק 4 1 השוואה בין שפות תכנות הגדרה :פונקציה fניתנת לחישוב )חשיבה (computableבשפת תכנות L אם קיימת תכנית pב L-כך ש .〚p〛L = f הגדרה :שפת תכנות L1חזקה לפחות כמו שפת תכנות L2אם כל פונקציה הניתנת לחישוב ב L2-ניתנת לחישוב גם ב.L1- סימוןL1 f L2 : =< ניתן לחשוב על הסימן fכמציין הכלה בין קבוצות! טענה :אם L1,L2,L3מקיימות L2 f L1ו L3 f L2-אזי .L3 f L1 הגדרה :השפות L1ו L2-שקולות אם L1 f L2וגם .L2 f L1 סימון.L1≡ L2 : 2 • את הטענה L1 f L2 :ניתן להביע באופן ששם דגש על תוכניות )יותר מאשר פונקציות(. • התוכלו להשלים את הניסוח? ______________________ ∀p∈L2-prog ∃q∈L1-prog : • יש מקרים שהניסוח המקורי נוח יותר לשימוש ,ויש מקרים שהנ"ל עדיף. בדרך כלל: – הניסוח עם תוכניות עדיף להוכחות קונסטרוקטיביות שהיחס מתקיים. – הניסוח עם פונקציות עדיף להוכחות שליליות )שהיחס אינו מתקיים(. 3 דוגמה 1 תהי L1שפה שיש בה תוכנית אחת בלבד p1והסמנטיקה שלה היא ∀d∈D : 〚p1〛L1 d = d ותהי L2שפה שיש בה תוכנית אחת בלבד p2השקולה לתוכנית ה- WHILEהבאה: read X ; Y := tl X ; write Y טענה :אף אחד מהיחסים L1pL2, L1fL2אינו מתקיים. הוכחה: 4 דוגמה 2 • תהי NOLOOPשפה שזהה ל WHILE-בתחביר ובסמנטיקה למעט זה שאין פקודת לולאה. • טענה WHILE f NOLOOP :1 – טריוויאלי! • תרגיל :האם ? WHILE p NOLOOP 5 קומפילציה ויחסי-כוחות • נניח שקיים קומפיילר מ S-ל) T-לא חשוב איך ממומש!(. אזי . S p T • הערות: – לא תמיד יתקיים .S ≡ T – המשפט ההפוך :אם S p Tאז קיים קומפיילר מ S-ל - T-אינו נכון. נכון או לא נכון? אם הקומפיילר ממומש בשפה Iאז בהכרח S p I • מה אם ידוע שיש מפרש ל S-הממומש ב? I- 6 • תהי L1שפה שיש בה תוכנית אחת בלבד p1והסמנטיקה שלה היא ∀d∈D : 〚p1〛L1 d = d • ותהי L2שפה שיש בה תוכנית אחת בלבד p2השקולה לתוכנית ה- WHILEהבאה: read X ; Y := tl X ; write Y • טענה :1אף אחד מהיחסים L1fL2, L2fL1אינו מתקיים. • טענה :2התוכנית p2מהווה מפרש לשפת המקור .L1 • הוכחה: ∀p∈L1-prog ∀d∈D : 〚p2〛L2 (p.d) = d =〚p〛L1 d • מסקנה :יש מפרש ל S-הממומש ב - I-לא מוכיח . S p I • אבל זהו מצב פתולוגי .לדוגמה עבור WHILEושפות שקולות לה היחס ה"צפוי" מתקיים. 7 משפט: אם קיים מפרש לשפה Mבשפה ,WHILEאזי . M p WHILE הוכחה :לפי ההנחה קיים מפרש .intהוא מקיים: ∀p∈M-prog ∀d∈D : 〚int〛WHILE (p.d) = 〚p〛M d תהי pתוכנית כלשהי ב M-ותהי: )q =〚spec〛(int . p נזכיר את התכונה של :spec )〚〚spec〛(p.s) 〛L d =〚p〛L (s.d מכאן _________________ = 〚q〛d = 〚〚spec〛(int.p) 〛d מסקנה :לכל תוכנית ב M-יש תוכנית שקולה ב .WHILE-מש"ל 8 משפט: תהי Lשפה שקולה ל.WHILE- אם קיים מפרש לשפה Mבשפה Lאז .MpL הוכחה: נניח כי קיים מפרש intLל M-כתוב ב .L-מהנתון L ≡ WHILE נובע ,כי קיימת תוכנית WHILEהשקולה ל ,intL-נאמר .int אזי intהיא מפרש ל M-ב .WHILE-לפי הטענה הקודמת ,נובע . M p WHILEאבל , L ≡ WHILEלכן . M p L • זוהי מסקנה מהמשפט הקודם .מסקנה אחרת בשקופית הבאה 9 הטלות פוּטמוּרה • שלוש דרכים מעניינות להשתמש ב...spec- • משפט )הטלת פוטמורה :(Iתהי Lשפה שקיים עבורה מצמצם .אם ישנו מפרש לשפה Mב L -אזי .M p L • הוכחה :כבר ראינו )כאשר Lהייתה .(WHILE תקציר :לכל p∈M-progניתן ליצור תוכנית שקולה בL- )q = 〚spec〛(int . p • זוהי "קומפילציה ללא קומפיילר" 10 משפט )הטלת פוטומורה :(IIתהי Lשפה שקיים עבורה מצמצם )המיושם ב .(L-אם ישנו מפרש לשפה Mב L -אזי ישנו קומפיילר מ M-ל.L- הוכחה :נייצר את התוכנית הבאה .comp )comp =〚spec〛L (spec . int )(!self-application נוכיח שקיבלנו קומפיילר :לכל ,p∈M-prog = 〚 comp〛L p = 〚〚spec〛(spec .int) 〛p )〚spec〛(int . p זוהי תוכנית ב L-השקולה ל) p-הטלה (Iולכן compמקיים את הנדרש מקומפיילר! 11 הטלת פוטומורה :III נייצר את התוכנית הבאה .gen )gen =〚spec〛L (spec . spec יהי intמפרש לשפה כלשהי ,Sהכתוב ב.L- מה הסמנטיקה של התוכנית הנוצרת מהפעלת genעל ?int 12 אלגוריתמי קומפילציה בספר :פרק 5 - 4 13 חשוב לזכור • • • • 14 אלגוריתם קומפילציה מטפל בתוכנית ברמה תחבירית – אינו אמור לבצע )אם כי השיקולים בתכנון האלגוריתם הם כמובן סמנטיים(. הקומפיילר מקבל תוכנית בתחביר קונקרטי ומחזיר תוכנית יעד בתחביר קונקרטי. אולם ברמת האלגוריתם חשוב יותר להתייחס לתחביר המופשט. אנו נשתמש להצגת האלגוריתם בתחביר הלא-פורמלי. דוגמה :1שפת DOWHILE השפה DOWHILEהיא הרחבה של ,WHILEבעלת מבנה זהה למעט תוספת אחת – פקודת לולאה שבה התנאי נבדק אחרי ביצוע גוף הלולאה ולא קודם לכן. פקודה חדשה 15 C, D ∈ Command ::= X := E |C;D | while E do C | if E then C else D | do C while E קומפילציה של DOWHILEלWHILE- .1רעיון הקומפילציה :איך נתגבר על ההבדל בין השפות? .2בניית טבלת המרה המאפשרת לטפל בכל תוכנית מקור באופן אוטומטי. 16 טבלת המרה = אלגוריתם קומפילציה הקלט Program: read x; C; write y הפלט read x; C; write y המרה של Commands: X:=E C;D while E do C if E then C else D do C while E X:=E C;D while E do C if E then C else D C ; while E do C 17 סיכום תיאורטי • הקומפילציה מוכיחה כי DOWHILE p WHILE • כיוון הפוך – DOWHILE f WHILE :טריוויאלי • לכן DOWHILE ≡ WHILE 18 WHILE1OP שפת:2 דוגמה E, F ∈ Expression ::= X |d | hd X | tl X | cons X Y C, D ∈ Command ::= X := E | C;D | while X do C | if X then C else D Program ::= read X ; C; write Y X, Y ∈ Variable d∈D 19 קומפילציה של WHILEלWHILE1OP- .1רעיון הקומפילציה :איך נתגבר על ההבדל בין השפות? דוגמה: )Y := cons (hd X) (tl X .2בניית טבלת המרה המאפשרת לטפל בכל תוכנית מקור באופן אוטומטי. 20 Program: read X; C; write Y read X; C; write Y Commands: C;D C;D Y := X Y := X Y := d Y := d Y := hd E Y := tl E Z := E ; Y := hd Z Z’s are fresh variables Z := E ; Y := tl Z Y := cons E1 E2 Z1 := E1 ; Z2 := E2 ; Y := cons Z1 Z2 if E then C else D Z := E ; if Z then C else D while E do C Z := E ; while Z do { C ; Z := E } 21 דיון ביעילות של קומפילציה • שתי שאלות עשויות לעניין אותנו: .1מה יעילות הקומפיילר? .2מה יעילותה של תוכנית היעד? • • • 22 ניתוח שאלה מס' – 1כמו כל אלגוריתם. ניתוח שאלה מס' – 2ע"י השוואת קוד היעד לקוד המקור. אם תוכנית המקור היא pותוכנית היעד ,qרוצים לחסום את ) timeq(dע"י ).timep(d תרגיל :ניתוח היעילות של הקומפילציה שראינו )ונתחיל בשאלה היותר חשובה(. שפת GOTO • • • • 23 שפת WHILEהיא דוגמה לשפה מבנית. השפה הבאה GOTOהיא שפה לא מבנית. בשתיהן טיפוס נתונים אחד D - בשפה לא מבנית ,תוכנית היא רשימת הוראות .instructionsכל הוראה מבצעת פעולה פשוטה אחת .הביצוע ממשיך מהוראה להוראה הבאה אחריה או מדלג עפ"י הוראת "הסתעפות" .branch GOTO תחביר שפת Program ::= read X ; I1; I2; … Im; write Y I ∈ Instruction ::= | | | | | X := d X := Y X := hd Y X := tl Y X := cons Y Z if X then L1 else L2 X, Y, Z ∈ Variable d ∈D L1, L2 ∈ {1,…,m+1} 24 תוכנית לדוגמה read X 1: if X then 2 else 6 2: Z := hd X 3: Y := cons Z Y 4: X := tl X ממתיק תחבירי 5: goto 1 write Y 25 הערות .1שימו לב שהתחביר אינו כולל את אותן מחלקות כמו ב – WHILE-אל תערבבו בין השפות! .2לחישובי זמן ריצה – כל הוראה = צעד אחד )יחידת זמן(. זמן הריצה של התוכנית שהוצגה על קלט dהוא ____ 26 תחביר קונקרטי read Vi ; I1 I2 ... Im ; write Vj = ( i ( I1 I2 ... Im ) j ) Vi := d = (setq i d) Vi := Vk = (setv i k) Vi := hd Vk = (sethd i k) Vi := tl Vk = (settl i k) Vi := cons Vk Vl = (setcons i k l) if Vi then L1 else L2 = (if i L1 L2) 27 קומפילציה מ WHILE-לGOTO- • WHILEהיא שפה מבנית – יש בה פקודות מקננות וביטויים מקננים .את כל אלה צריך "לפרק" בתרגום ל.GOTO- • התרגום ל WHILE1OP-כבר פירק את הביטויים המורכבים .לכן נציג קומפילציה מWHILE1OP- ל.GOTO- 28 קלט פלט WHILE1OP יחידה תחבירית בשפת הוראה או קבוצת הוראות Program: read X; C; write Y read X; C; write Y Commands: C;D C;D X := Y X := Y X := d X := d X := hd Y X := hd Y X := tl Y X := tl Y X := cons Y Z X := cons Y Z 29 if X then C else D i: if X then i+1 else i+2+|C| i+1: C i+1+|C|: goto i+2+|C|+|D| i+2+|C|: D while X do C i: if X then i+1 else i+2+|C| i+1: C i+1+|C|: goto i ההוראות ממוספרות ע"י הקומפיילר 30 קשרים בין WHILEלGOTO- משפטWHILE p GOTO : הוכחה :הראינו כעת כי _________________ ומוקדם יותר הראינו כי _____________ ולכן .WHILE p GOTO • האם - WHILE f GOTOהאם ניתן לחקות ”) “gotoדילוגים בין הוראות( בשפה מבנית טהורה )כמו ?(WHILE 31 WHILE- לGOTO-קומפילציה מ reverse • נדגים את הרעיון על התוכנית read X PC := 1 ; while PC do case PC of 1 => 2 => 3 => 4 => 5 => 6 => write Y if X then PC := 2 else PC := 6 ; Z := hd X ; PC := 3 ; Y := cons Z Y ; PC := 4 ; X := tl X ; PC := 5 ; if X then PC := 1 else PC := 1 ; PC := 0 32 אלגוריתם הקומפילציה = כללי המרה GOTO :קלט read X C1; C2; 1: 2: ..... n: Cn; n+1: writeY WHILE :פלט read X PC := 1; while PC do case PC of 1 => PC:=2; C1; 2 => PC:=3; C2; .... n => PC:=n+1; Cn; n+1=> PC:=0 write Y ()התרגום זהה למקור X := SE X := SE if X then l else l’ if X then PC:=l else PC:=l’ 33 שפת:דוגמה מתקדמת לקומפילציה WHILE1VAR E, F ∈ Expression ::= X |d | hd X | tl X | cons X Y C, D ∈ Command ::= X := E | C;D | while X do C | if X then C else D Program ::= read X ; C; write Y X, Y ∈ Variable d∈D 34 דוגמה מתקדמת לקומפילציה :שפת WHILE1VAR השפה WHILE1VARמוגדרת בדיוק כמו ,WHILEאבל מותר להשתמש במשתנה אחד בלבד. דוגמה :התוכנית הבאה אינה חוקית בשפה זו read X Y := cons X X write Y 35 .1רעיון הקומפילציה :איך נתגבר על ההבדל בין השפות? אם בתוכנית המקור pמספר משתנים ... ,X2 ,X1 המשתנה )היחיד( של תוכנית היעד ) qנקרא לו (A יכיל את ערכי כל המשתנים של ,pכרשימה. .2בניית טבלת המרה המאפשרת לטפל בכל תוכנית מקור באופן אוטומטי. 36 Program: read X; C; write Y read A; A := list T1 … Tn C; A := hd tl j–1 A write A TTi i==AA Tj Tj==nil nil (j(j≠≠i)i) Commands: C;D C;D if E then C else D if E then C else D while E do C while E do C Xi := E A := list T1 … Tn Ti = E Tj = Xj (j ≠ i) 37 Expressions: Xi d cons E1 E2 hd E tl E hd tl i–1 A d cons E1 E2 hd E tl E 38