פרק 6 בדיקת טיפוסים

31
רררר רררררר רררר רררררררררר1

Upload: kyrie

Post on 10-Jan-2016

64 views

Category:

Documents


8 download

DESCRIPTION

פרק 6 בדיקת טיפוסים. ניתוח ( analysis ). מנתח לקסיקאלי lexical analyser. מנתח תחביר syntax analyser. מנתח משמעות semantic analyser. מייצר קוד ביניים intermediate code generator. מייעל קוד code optimizer. חיבור ( synthesis ). מייצר קוד code generator. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: פרק 6 בדיקת טיפוסים

1תורת הקומפילציהאיתן אביאור

Page 2: פרק 6 בדיקת טיפוסים

2תורת הקומפילציהאיתן אביאור

ניתוח(analysis)

חיבור(synthesis)

syntax analyserמנתח תחביר

semantic analyserמנתח משמעות

מייצר קוד ביניים intermediate code generator

code optimizerמייעל קוד

code generatorמייצר קוד

lexical analyserמנתח לקסיקאלי

טיפוסים – ניתוח המשמעות

semantic analyserמנתח משמעות

Page 3: פרק 6 בדיקת טיפוסים

3תורת הקומפילציהאיתן אביאור

סוגי בדיקות (static checksבדיקות סטטיות )

בדיקות הנערכות ע"י המהדר בזמן התרגום

(dynamic checksבדיקות דינמיות )

בדיקות הנערכות ע"י התוכנית עצמה תוך כדי ריצה

Page 4: פרק 6 בדיקת טיפוסים

4תורת הקומפילציהאיתן אביאור

בדיקות סטטיות(Static Checks)

(type checksבדיקות טיפוסים )1.התאמת טיפוסי ביטויים ע"פ חוקי השפה

(flow-of-control checksבדיקות הזרימה )2.בדיקת מבני בקרת הזרימה

שלא נמצא בתוך הלולאה breakלמשל

(uniqueness checksבדיקות יחידּות )3.בדיקה שעצם לא מוגדר יותר מפעם אחת בניגוד לחוקי

השפה

(name related checksבדיקות הקשורות לשמות )4.וידוא ששם שמופיע פעמיים זהה בשני המופעים

שם הלולאה בתחילתה ובסופה זההלמשל בשפת עדה להלן נתמקד בבדיקות טיפוסים

Page 5: פרק 6 בדיקת טיפוסים

5תורת הקומפילציהאיתן אביאור

מיקום בודק הטיפוסים בתוך המהדר

המידע הנאסף ע"י מערכת בדיקות הטיפוסים עשוי לשמש בהמשך,

למשללצורך יצירת קוד הביניים •(overloadingאו לצורך תרגום פעולות שיש להן העמסת יתר )•

פורסזרם

התמניותבודק

טיפוסיםעץ

תחבירמייצר

קוד בינייםעץ

תחבירייצוג

ביניים

Page 6: פרק 6 בדיקת טיפוסים

6תורת הקומפילציהאיתן אביאור

דרישות להתאמת טיפוסים

(Pascal reportמתוך הגדרת פסקל )

“If both operands of the arithmetic operators of addition, subtraction and multiplication are of type integer, then the result is of type integer.”

)C )C reference manualמתוך הגדרת

“The result of the unary & operator is a pointer to the object referred to by the operand. If the type of the operand is ‘…’, the type of the result is ‘pointer to …’ .”

ע"מ שנוכל להשוות טיפוסים של ביטויים שונים מסקנה: "ביטויי טיפוסים"עלינו להגדיר

Page 7: פרק 6 בדיקת טיפוסים

7תורת הקומפילציהאיתן אביאור

ביטוי טיפוסים(Type Expressions)

boolean, char, integer, real, voidטיפוסים בסיסיים כגון:1.type-err וכן טיפוס שגיאה מיוחד:

שם שניתן לעיל לטיפוס כלשהו2.

(:type constructorבנאי טיפוסים )3. הינה T הינה קבוצת אינדקסים ו-I אם (arrayמערך )א.

טיפוס"T של I הינו טיפוס "מערך )array)I, Tאזי הינם טיפוסיםT2 ו-T1אם (productמכפלה )ב.

הינו טיפוס מכפלהT1 T2אזי אסוציאטיביות שמאלית()לאופרטור

Page 8: פרק 6 בדיקת טיפוסים

8תורת הקומפילציהאיתן אביאור

2ביטוי טיפוסים ההבדל בין רשומה למכפלה היא (recordרשומה )ג.

שלשדות של רשומה ישנם שמות

למשל:type row = record

address: integer;lexeme: array [1..15] of

char end;

var table: array [1..101] of row; הינו:rowואז הטיפוס

record ((address integer) (lexeme array(1..15, char)))

Page 9: פרק 6 בדיקת טיפוסים

9תורת הקומפילציהאיתן אביאור

3ביטוים טיפוסיים הינו טיפוסT אם (pointerמצביע )ד.

"T הינו טיפוס "מצביע ל-Tאזי

הינו טיפוס הערך שהפונקציה מקבלתT1 אם (functionפונקציה )ה.

הינו טיפוס הערך שהיא מחזירהT2ו-

“T2 ומחזירה T1 הינו טיפוס "פונקציה המקבלת T1 T2אזי

( אסוציאטיביות ימנית, ועדיפות נמוכה מאשר )לאופרטור

כאשר פונקציה מקבלת מספר פרמטרים נשתמש באופרטור הערה:המכפלה ע"מ להגדיר את טיפוס הערך שהיא מקבלת

Page 10: פרק 6 בדיקת טיפוסים

10תורת הקומפילציהאיתן אביאור

הצגת ביטויי טיפוסים דוגמה:

integer ומחזירה מצביע ל-charפונקציה המקבלת שני

char char pointer( integer )ניתן לייצג את הטיפוס בתור גרף בשני אופנים:

pointer

integercharchar

pointer

integerchar

DAGעץ

Page 11: פרק 6 בדיקת טיפוסים

11תורת הקומפילציהאיתן אביאור

מערכת טיפוסים(Type System)

אוסף חוקים הקובעים עד כמה יש לבדוק התאמת טיפוסים

למשל:האם להשוות אינדקסים של מערך המועבר כפרמטר?•האם להשוות את טיפוסי הפרמטרים של פונקציה המועברת •

כפרמטר?האם לבדוק התאמה של טיפוסי עצמים המועברים ע"י כתובת ?•

יכולים להיות כל מיני חוקי בדיקה ובודק טיפוסים מיישם מערכת טיפוסים מסוימת

יישומים שונים עשויים להוביל לתוצאות שונות

Page 12: פרק 6 בדיקת טיפוסים

12תורת הקומפילציהאיתן אביאור

עוד הגדרות (soundמערכת בטוחה )

מערכת טיפוסים שבה ניתן לוודא את כל ההתאמות הנחוצות

ע"פ חוקי השפה בבדיקות סטטיות בלבד

כאשר המהדר יכול להבטיח שתוכנית strongly typed שפה

שהוא מקבל לא תיכשל בעת הביצוע בשל שגיאות טיפוס

כלומר – שפה שעבורה ניתן לבנות מערכת טיפוסים בטוחה.

באופן מעשי ישנן בדיקות שניתן לבצע רק בזמן ריצה

למשל – בדיקה לוידוא אי-חריגה מגבולות מערך

Page 13: פרק 6 בדיקת טיפוסים

13תורת הקומפילציהאיתן אביאור

בודק טיפוסים פשוטדקדוק

P D ; E

D D ; D id : T

T char integer array [ num ] of T T

E literal num id E mod E E [ E ] E

תוכנית לדוגמה

key : integer;

key mod 1999

Page 14: פרק 6 בדיקת טיפוסים

14תורת הקומפילציהאיתן אביאור

2בודק טיפוסים פשוט סכמת התרגום לפסוקי הגדרה

P D ; E

D D ; D

D id : T { addtype )id.entry, T.type( }

T char { T.type := char }

T integer { T.type := integer }

T T1 { T.type := pointer)T1.type( }

T array [ num ] of T1

{ T.type := array)1..num.val, T1.type( }

Page 15: פרק 6 בדיקת טיפוסים

15תורת הקומפילציהאיתן אביאור

3בודק טיפוסים פשוט סכמת תרגום לביטויים

E literal { E.type := char }

E num { E.type := integer }

E id { E.type := lookup )id.entry( }

E E1 mod E2 { E.type := ) E1.type = integer &&

E2.type = integer ? integer : type_err( }

E E1 [ E2 ] { E.type := ) E2.type = integer &&

E1.type = array)s, t( ? t : type_err ( }

E E1 { E.type := ) E1.type = pointer) t ( ?

t : type_err ( }

Page 16: פרק 6 בדיקת טיפוסים

16תורת הקומפילציהאיתן אביאור

הרחבת השפהboolean, realהוספת טיפוסים נוספים כגון •

הוספת אופרטורים נוספים:•

/ + אריתמטיים–

> >= = >< < <=השוואה–

and not orבוליאנים–

מעבר מביטויים לפסוקים•

Page 17: פרק 6 בדיקת טיפוסים

17תורת הקומפילציהאיתן אביאור

בדיקת טיפוסים פשוטה לפסוקים

הסכמה לפסוקים

S id := E { S.type := ) id.type = E.type ?

void : type_err ( }

S if E then S1 { S.type := ) E.type = boolean ?

S1.type : type_err ( }

S while E do S1 { S.type := ) E.type = boolean ?

S1.type : type_err ( }

S S1 ; S2 { S.type := ) S1.type = void &&

S2.type = void ? void : type_err ( }

Page 18: פרק 6 בדיקת טיפוסים

18תורת הקומפילציהאיתן אביאור

בדיקת טיפוסים פשוטה לפונקציות

סכמה להגדרת טיפוסי פונקציות

T T1 -< T2 { T.type := T1.type T2.type }

סכמה להגדרת קריאה לפונקציות

E E1 ( E2 ) { E.type := ) E2.type = S &&

E1.type = S t ? t :

type_err ( }

Page 19: פרק 6 בדיקת טיפוסים

19תורת הקומפילציהאיתן אביאור

טיפוסיםקילותש(Type Equivalence)

לצורך בדיקת נכונות התוכנית יש להשוות ביטויי טיפוסים,

זהים y ושל x צריך לבדוק שהטיפוס של x := yלמשל בפסוק )או שקולים(

קיימים שני סוגי שקילות

(structural equivalenceשקילות מבנה )•

(name equivalenceשקילות שם )•

Page 20: פרק 6 בדיקת טיפוסים

20תורת הקומפילציהאיתן אביאור

שקילות מבנהשני טיפוסים יהיו שקולים אם הם בעלי אותו מבנה

דוגמה

typedef cell link ;link next ;link last ;cell p ;cell q, r ;

הם מטיפוס מאותו מבנה r ,q ,p ,last ,nextכל חמשת המשתנים ועל כך הם שקולי מבנה

משמעות הדבר שהם טיפוסים זהיםCבשפת

Page 21: פרק 6 בדיקת טיפוסים

21תורת הקומפילציהאיתן אביאור

אלגוריתם לבדיקת שקילות מבנה

boolean sequiv)type s, type t( {

if ( s and t are the same basic type )

return true ;

elseif ( s = array)s1, s2( && t = array)t1, t2( )

return sequiv)s1, t1( && sequiv)s2, t2( ;

elseif ( s = s1 s2 && t = t1 t2 )

return sequiv)s1, t1( && sequiv)s2, t2( ;

elseif ( s = pointer)s1( && t = pointer)t1( )

return sequiv)s1, t1( ;

elseif ( s = s1 s2 && t = t1 t2 )

return sequiv)s1, t1( && sequiv)s2, t2( ;

else

return false ;

}

Page 22: פרק 6 בדיקת טיפוסים

22תורת הקומפילציהאיתן אביאור

בדיקת שקילות מבנה ראשונית

לכל ביטוי טיפוס נתאים מספר שלם•

שני ביטויים יהיו בלתי שקולים אם המספר שלהם שונה•

מאחר וההתאמה איננה חד-חד ערכית ומזניחה חלק •

מהפרטים לביטויי טיפוסים קרובים יהיה אותו מספר,

ואזי יש להפעיל את האלגוריתם הנ"ל ע"מ לוודא סופית

Page 23: פרק 6 בדיקת טיפוסים

23תורת הקומפילציהאיתן אביאור

שיטה להתאמת מספריםלביטויי טיפוס

D. M. Ritchie שכתב Cע"פ השיטה של מהדר

הטיפוסים היסודים

boolean ,char ,integer ,real

הבנאים

) t pointer ) tמצביע ל-

) tfreturns ) tפונקציה שמקבלת פרמטרים כלשהם ומחזירה

) tarray ) tמערך של גודל כלשהו שאיבריו מטיפוס

Page 24: פרק 6 בדיקת טיפוסים

24תורת הקומפילציהאיתן אביאור

שיטה להתאמת מספרים המשךלביטויי טיפוס

נתאים את הקודים הבאיםboolean 0000pointer 01char 0001array 10integer 0010freturns 11real 0011

מקבלת קוד של טיפוס בסיסי חדש (struct) רשומהדוגמאות000000 0001 char000011 0001freturns)char( 000111 0001pointer)freturns)char(( 100111 0001array)pointer)freturns)char(((

Page 25: פרק 6 בדיקת טיפוסים

25תורת הקומפילציהאיתן אביאור

שקילות שמותבפסקל זהות מבנה איננה מספיקה, •

ויש צורך בזהות שמות. הם מאותו טיפוס, last ו- next על כן, •

r ו-qוכן הם מטיפוס שונהp ו-next אולם• הם מטיפוס שונהq ו-pיתר על כן, •

כאילו ההגדרה היתה:

type link = cell;var next : link;

last : link;p : cell;q, r : cell;

type link = cell;np = cell;nqr = cell;

var next : link;last : link;p : np;q : nqr;r : nqr;

Page 26: פרק 6 בדיקת טיפוסים

26תורת הקומפילציהאיתן אביאור

ייצוג הטיפוסיםלשקילות שמות

נייצג את הטיפוסים ע"י גרף• נייצר צומת עלהכל פעם שטיפוס בסיסי חדש נראה • נייצר צומת חדש המקושר לעץכל פעם שבנאי טיפוסים נראה • נייצר צומת עלה עם מצביע מיוחד כל פעם שמוגדר שם חדש •

לביטוי המגדיר אותושני טיפוסים יהיו זהים אם"ם הם מיוצגים ע"י אותו צומת בגרף•

nextדוגמה last q rp

pointer pointerlink

cell

pointer

Page 27: פרק 6 בדיקת טיפוסים

27תורת הקומפילציהאיתן אביאור

מעגליות בייצוג טיפוסיםנתבונן בקטע הבא:

type link = cell;cell = record

info : integer;next : link

end;מעגליות cell הינו רשומה המכילה שדה שהינו מצביע ל-cellהטיפוס

ייצוג רקורסיביייצוג מעגלי

integerinfo

pointernext

cell = record

cell

integerinfo

pointernext

cell = record

Page 28: פרק 6 בדיקת טיפוסים

28תורת הקומפילציהאיתן אביאור

פתרון המעגליות שקילות טיפוסים נעשית ע"פ שקילות מבנה,Cבשפת •

class )או struct, unionלמעט כאשר מדובר במבנים

++(Cב-

מבנים אלה יהיו שקולים ע"פ שם•

חייבים כל השמות להיות מוגדרים לפני שמשתמשים בהם,Cב-•

למעט תגים של מבנים בהם מותר להשתמש רק לצורך מצביעים

אפשרית אם כן, רק במצביעים למבנים שבהם Cהמעגליות ב-•

כאמור מוגדרת שקילות שם

Page 29: פרק 6 בדיקת טיפוסים

29תורת הקומפילציהאיתן אביאור

המרת טיפוסים(Type Conversions)

שפה יכולה לספק שיטות שונות להמרת טיפוסים•

סוגיםC++ 4ב-–

לעיתים יש צורך בהמרה אוטומטית ע"י המהדר הנקראת •(coercionsהמרה בכפיה )

כאשר האופרנדים של פעולה אינם תואמים–

כאשר ערך מטיפוס אחד מוצב למשתנה מטיפוס אחר–

Page 30: פרק 6 בדיקת טיפוסים

30תורת הקומפילציהאיתן אביאור

המרה בכפיה של טיפוסים

סכמות להמרה בכפיה

E num E.type := integer

E num . num E.type := real

E id E.type := lookup) id.entry ( E E1 op E2

E.type := )E1.type = integer && E2.type = integer ( ? integer :

(E1.type = integer && E2.type = real ) ?real:

(E1.type = real && E2.type = integer ) ?real:

(E1.type = real && E2.type = real ) ?real : type_err

Page 31: פרק 6 בדיקת טיפוסים

31תורת הקומפילציהאיתן אביאור

6תום פרק