פרק 6 בדיקת טיפוסים
DESCRIPTION
פרק 6 בדיקת טיפוסים. ניתוח ( analysis ). מנתח לקסיקאלי lexical analyser. מנתח תחביר syntax analyser. מנתח משמעות semantic analyser. מייצר קוד ביניים intermediate code generator. מייעל קוד code optimizer. חיבור ( synthesis ). מייצר קוד code generator. - PowerPoint PPT PresentationTRANSCRIPT
1תורת הקומפילציהאיתן אביאור
2תורת הקומפילציהאיתן אביאור
ניתוח(analysis)
חיבור(synthesis)
syntax analyserמנתח תחביר
semantic analyserמנתח משמעות
מייצר קוד ביניים intermediate code generator
code optimizerמייעל קוד
code generatorמייצר קוד
lexical analyserמנתח לקסיקאלי
טיפוסים – ניתוח המשמעות
semantic analyserמנתח משמעות
3תורת הקומפילציהאיתן אביאור
סוגי בדיקות (static checksבדיקות סטטיות )
בדיקות הנערכות ע"י המהדר בזמן התרגום
(dynamic checksבדיקות דינמיות )
בדיקות הנערכות ע"י התוכנית עצמה תוך כדי ריצה
4תורת הקומפילציהאיתן אביאור
בדיקות סטטיות(Static Checks)
(type checksבדיקות טיפוסים )1.התאמת טיפוסי ביטויים ע"פ חוקי השפה
(flow-of-control checksבדיקות הזרימה )2.בדיקת מבני בקרת הזרימה
שלא נמצא בתוך הלולאה breakלמשל
(uniqueness checksבדיקות יחידּות )3.בדיקה שעצם לא מוגדר יותר מפעם אחת בניגוד לחוקי
השפה
(name related checksבדיקות הקשורות לשמות )4.וידוא ששם שמופיע פעמיים זהה בשני המופעים
שם הלולאה בתחילתה ובסופה זההלמשל בשפת עדה להלן נתמקד בבדיקות טיפוסים
5תורת הקומפילציהאיתן אביאור
מיקום בודק הטיפוסים בתוך המהדר
המידע הנאסף ע"י מערכת בדיקות הטיפוסים עשוי לשמש בהמשך,
למשללצורך יצירת קוד הביניים •(overloadingאו לצורך תרגום פעולות שיש להן העמסת יתר )•
פורסזרם
התמניותבודק
טיפוסיםעץ
תחבירמייצר
קוד בינייםעץ
תחבירייצוג
ביניים
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 …’ .”
ע"מ שנוכל להשוות טיפוסים של ביטויים שונים מסקנה: "ביטויי טיפוסים"עלינו להגדיר
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אזי אסוציאטיביות שמאלית()לאופרטור
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)))
9תורת הקומפילציהאיתן אביאור
3ביטוים טיפוסיים הינו טיפוסT אם (pointerמצביע )ד.
"T הינו טיפוס "מצביע ל-Tאזי
הינו טיפוס הערך שהפונקציה מקבלתT1 אם (functionפונקציה )ה.
הינו טיפוס הערך שהיא מחזירהT2ו-
“T2 ומחזירה T1 הינו טיפוס "פונקציה המקבלת T1 T2אזי
( אסוציאטיביות ימנית, ועדיפות נמוכה מאשר )לאופרטור
כאשר פונקציה מקבלת מספר פרמטרים נשתמש באופרטור הערה:המכפלה ע"מ להגדיר את טיפוס הערך שהיא מקבלת
10תורת הקומפילציהאיתן אביאור
הצגת ביטויי טיפוסים דוגמה:
integer ומחזירה מצביע ל-charפונקציה המקבלת שני
char char pointer( integer )ניתן לייצג את הטיפוס בתור גרף בשני אופנים:
pointer
integercharchar
pointer
integerchar
DAGעץ
11תורת הקומפילציהאיתן אביאור
מערכת טיפוסים(Type System)
אוסף חוקים הקובעים עד כמה יש לבדוק התאמת טיפוסים
למשל:האם להשוות אינדקסים של מערך המועבר כפרמטר?•האם להשוות את טיפוסי הפרמטרים של פונקציה המועברת •
כפרמטר?האם לבדוק התאמה של טיפוסי עצמים המועברים ע"י כתובת ?•
יכולים להיות כל מיני חוקי בדיקה ובודק טיפוסים מיישם מערכת טיפוסים מסוימת
יישומים שונים עשויים להוביל לתוצאות שונות
12תורת הקומפילציהאיתן אביאור
עוד הגדרות (soundמערכת בטוחה )
מערכת טיפוסים שבה ניתן לוודא את כל ההתאמות הנחוצות
ע"פ חוקי השפה בבדיקות סטטיות בלבד
כאשר המהדר יכול להבטיח שתוכנית strongly typed שפה
שהוא מקבל לא תיכשל בעת הביצוע בשל שגיאות טיפוס
כלומר – שפה שעבורה ניתן לבנות מערכת טיפוסים בטוחה.
באופן מעשי ישנן בדיקות שניתן לבצע רק בזמן ריצה
למשל – בדיקה לוידוא אי-חריגה מגבולות מערך
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
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( }
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 ( }
16תורת הקומפילציהאיתן אביאור
הרחבת השפהboolean, realהוספת טיפוסים נוספים כגון •
הוספת אופרטורים נוספים:•
/ + אריתמטיים–
> >= = >< < <=השוואה–
and not orבוליאנים–
מעבר מביטויים לפסוקים•
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 ( }
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 ( }
19תורת הקומפילציהאיתן אביאור
טיפוסיםקילותש(Type Equivalence)
לצורך בדיקת נכונות התוכנית יש להשוות ביטויי טיפוסים,
זהים y ושל x צריך לבדוק שהטיפוס של x := yלמשל בפסוק )או שקולים(
קיימים שני סוגי שקילות
(structural equivalenceשקילות מבנה )•
(name equivalenceשקילות שם )•
20תורת הקומפילציהאיתן אביאור
שקילות מבנהשני טיפוסים יהיו שקולים אם הם בעלי אותו מבנה
דוגמה
typedef cell link ;link next ;link last ;cell p ;cell q, r ;
הם מטיפוס מאותו מבנה r ,q ,p ,last ,nextכל חמשת המשתנים ועל כך הם שקולי מבנה
משמעות הדבר שהם טיפוסים זהיםCבשפת
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 ;
}
22תורת הקומפילציהאיתן אביאור
בדיקת שקילות מבנה ראשונית
לכל ביטוי טיפוס נתאים מספר שלם•
שני ביטויים יהיו בלתי שקולים אם המספר שלהם שונה•
מאחר וההתאמה איננה חד-חד ערכית ומזניחה חלק •
מהפרטים לביטויי טיפוסים קרובים יהיה אותו מספר,
ואזי יש להפעיל את האלגוריתם הנ"ל ע"מ לוודא סופית
23תורת הקומפילציהאיתן אביאור
שיטה להתאמת מספריםלביטויי טיפוס
D. M. Ritchie שכתב Cע"פ השיטה של מהדר
הטיפוסים היסודים
boolean ,char ,integer ,real
הבנאים
) t pointer ) tמצביע ל-
) tfreturns ) tפונקציה שמקבלת פרמטרים כלשהם ומחזירה
) tarray ) tמערך של גודל כלשהו שאיבריו מטיפוס
24תורת הקומפילציהאיתן אביאור
שיטה להתאמת מספרים המשךלביטויי טיפוס
נתאים את הקודים הבאיםboolean 0000pointer 01char 0001array 10integer 0010freturns 11real 0011
מקבלת קוד של טיפוס בסיסי חדש (struct) רשומהדוגמאות000000 0001 char000011 0001freturns)char( 000111 0001pointer)freturns)char(( 100111 0001array)pointer)freturns)char(((
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;
26תורת הקומפילציהאיתן אביאור
ייצוג הטיפוסיםלשקילות שמות
נייצג את הטיפוסים ע"י גרף• נייצר צומת עלהכל פעם שטיפוס בסיסי חדש נראה • נייצר צומת חדש המקושר לעץכל פעם שבנאי טיפוסים נראה • נייצר צומת עלה עם מצביע מיוחד כל פעם שמוגדר שם חדש •
לביטוי המגדיר אותושני טיפוסים יהיו זהים אם"ם הם מיוצגים ע"י אותו צומת בגרף•
nextדוגמה last q rp
pointer pointerlink
cell
pointer
27תורת הקומפילציהאיתן אביאור
מעגליות בייצוג טיפוסיםנתבונן בקטע הבא:
type link = cell;cell = record
info : integer;next : link
end;מעגליות cell הינו רשומה המכילה שדה שהינו מצביע ל-cellהטיפוס
ייצוג רקורסיביייצוג מעגלי
integerinfo
pointernext
cell = record
cell
integerinfo
pointernext
cell = record
28תורת הקומפילציהאיתן אביאור
פתרון המעגליות שקילות טיפוסים נעשית ע"פ שקילות מבנה,Cבשפת •
class )או struct, unionלמעט כאשר מדובר במבנים
++(Cב-
מבנים אלה יהיו שקולים ע"פ שם•
חייבים כל השמות להיות מוגדרים לפני שמשתמשים בהם,Cב-•
למעט תגים של מבנים בהם מותר להשתמש רק לצורך מצביעים
אפשרית אם כן, רק במצביעים למבנים שבהם Cהמעגליות ב-•
כאמור מוגדרת שקילות שם
29תורת הקומפילציהאיתן אביאור
המרת טיפוסים(Type Conversions)
שפה יכולה לספק שיטות שונות להמרת טיפוסים•
סוגיםC++ 4ב-–
לעיתים יש צורך בהמרה אוטומטית ע"י המהדר הנקראת •(coercionsהמרה בכפיה )
כאשר האופרנדים של פעולה אינם תואמים–
כאשר ערך מטיפוס אחד מוצב למשתנה מטיפוס אחר–
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
31תורת הקומפילציהאיתן אביאור
6תום פרק