שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2017 - מודל הסביבה
שאלה 1 (25 נקודות)
שאלה זו עוסקת בשפת "יוטורג" (שפה PROC תיאורטית) המוצגת בעמודים 81-74 בפרק 3 של הליימון בעטלן. זכור, שפת "יוטורג" מאפשרת הגדרות פונקציות בעלויות פרוצדורליות יחיד.
להדגמה, זוהי דוגמה:
בדוגמה זו, משתנה מופיע בגוף הפונקציות וגם וגם מופיעים במשתנה חופשי של הפונקציות.
האם שיוקי שם של הפונקציות בשפה PROC (לכשהוא) של פרוצדורות המשתנים החופשיים בפרוצדורות, צעיד לקבלת רצף שונה שנתון?
אם תקבע שונה היא לא, הסבר מדוע!
אם תקבע שונה היא כן, הסבר זוהנה בשנונה לקבלת רצף שונה שנתון!
שאלה זו עוסקת בשפת "יוטורג" (שפה PROC תיאורטית) המוצגת בעמודים 81-74 בפרק 3 של הליימון בעטלן. זכור, שפת "יוטורג" מאפשרת הגדרות פונקציות בעלויות פרוצדורליות יחיד.
להדגמה, זוהי דוגמה:
בדוגמה זו, משתנה מופיע בגוף הפונקציות וגם וגם מופיעים במשתנה חופשי של הפונקציות.
האם שיוקי שם של הפונקציות בשפה PROC (לכשהוא) של פרוצדורות המשתנים החופשיים בפרוצדורות, צעיד לקבלת רצף שונה שנתון?
אם תקבע שונה היא לא, הסבר מדוע!
אם תקבע שונה היא כן, הסבר זוהנה בשנונה לקבלת רצף שונה שנתון!
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמבחן 2017 סמסטר ב · 2017 · סמסטר ב
★★★★★
מודל הסביבהסגוריםתחום לקסיקלימשתנים חופשייםהוכח או הפרך
חשוב על ההבדל בין הסביבה שבה פרוצדורה נוצרת לבין הסביבה שממנה היא נקראת, וכיצד כל אחת מהן יכולה להשפיע על הערך של משתנים חופשיים בגוף הפרוצדורה.
כן. האופן שבו שפה מקשרת (קושרת) שמות של משתנים חופשיים בפרוצדורות הוא החלטה מהותית בעיצוב השפה, והוא יכול לשנות באופן דרמטי את התנהגות התוכנית ואת תוצאתה. נסביר זאת על ידי השוואה בין שתי שיטות קישור עיקריות: תחום לקסיקלי ותחום דינאמי.
משתנה חופשי בפרוצדורה הוא משתנה שנעשה בו שימוש בגוף הפרוצדורה, אך הוא אינו מוגדר כפרמטר שלה ואינו קשור באמצעות הגדרה מקומית (כמו
1. תחום לקסיקלי (Lexical Scope): בשיטה זו, הידועה גם כקישור סטטי, ערכו של משתנה חופשי נקבע על פי סביבת ההגדרה של הפרוצדורה. כלומר, מסתכלים על הסביבה שהייתה קיימת בזמן שהפרוצדורה נוצרה. כדי לממש זאת, פרוצדורה מיוצגת כמבנה נתונים הנקרא סגור (Closure), אשר מכיל את קוד הפרוצדורה יחד עם מצביע לסביבת ההגדרה שלה. רוב שפות התכנות המודרניות (כולל Scheme, Python, JavaScript) משתמשות בשיטה זו.
2. תחום דינאמי (Dynamic Scope): בשיטה זו, ערכו של משתנה חופשי נקבע על פי סביבת הקריאה של הפרוצדורה. כלומר, כדי למצוא את ערך המשתנה, אנו בודקים את שרשרת הקריאות שהובילה להפעלת הפרוצדורה הנוכחית, ומחפשים את הקישור האחרון שנוצר עבור שם המשתנה. שיטה זו הייתה נפוצה בניבים מוקדמים של Lisp.
כדי להדגים את ההבדל, נבחן את קטע הקוד הבא:
כעת ננתח את התוצאה תחת כל אחת משיטות הקישור:
ניתוח תחת תחום לקסיקלי:
ניתוח תחת תחום דינאמי:
כפי שהודגם, התוצאה שונה לחלוטין (
משתנה חופשי בפרוצדורה הוא משתנה שנעשה בו שימוש בגוף הפרוצדורה, אך הוא אינו מוגדר כפרמטר שלה ואינו קשור באמצעות הגדרה מקומית (כמו
let) בתוכה. ערכו של משתנה כזה חייב להיקבע על פי הסביבה שבה הפרוצדורה מופעלת.1. תחום לקסיקלי (Lexical Scope): בשיטה זו, הידועה גם כקישור סטטי, ערכו של משתנה חופשי נקבע על פי סביבת ההגדרה של הפרוצדורה. כלומר, מסתכלים על הסביבה שהייתה קיימת בזמן שהפרוצדורה נוצרה. כדי לממש זאת, פרוצדורה מיוצגת כמבנה נתונים הנקרא סגור (Closure), אשר מכיל את קוד הפרוצדורה יחד עם מצביע לסביבת ההגדרה שלה. רוב שפות התכנות המודרניות (כולל Scheme, Python, JavaScript) משתמשות בשיטה זו.
2. תחום דינאמי (Dynamic Scope): בשיטה זו, ערכו של משתנה חופשי נקבע על פי סביבת הקריאה של הפרוצדורה. כלומר, כדי למצוא את ערך המשתנה, אנו בודקים את שרשרת הקריאות שהובילה להפעלת הפרוצדורה הנוכחית, ומחפשים את הקישור האחרון שנוצר עבור שם המשתנה. שיטה זו הייתה נפוצה בניבים מוקדמים של Lisp.
כדי להדגים את ההבדל, נבחן את קטע הקוד הבא:
כעת ננתח את התוצאה תחת כל אחת משיטות הקישור:
ניתוח תחת תחום לקסיקלי:
- הפרוצדורה
fנוצרת בסביבה הגלובלית שבהxקשור לערך10. לכן, הסגור שלf"זוכר" שערכו שלxהוא10. - הקריאה
(g 5)מפעילה את הפרוצדורהgעםz=5. - בתוך גוף הפרוצדורה
g, נוצר קישור חדש ופנימי למשתנהxעם הערך1. - בשלב הבא,
fנקראת עם הפרמטרz(שערכו5). לכן,yמקבל את הערך5. - כאשר הביטוי
-(x, y)בגוף שלfמחושב, יש למצוא את ערכו של המשתנה החופשיx. בקישור לקסיקלי, אנו פונים לסביבת ההגדרה שלf(זו שנשמרה בסגור), ושםx=10. - לכן, התוצאה הסופית היא .
ניתוח תחת תחום דינאמי:
- הפרוצדורה
fנוצרת. - הקריאה
(g 5)מפעילה אתg, ובתוכה נוצרת סביבה חדשה שבהz=5ו-x=1. סביבה זו היא סביבת הקריאה שממנה נקראת הפרוצדורהf. - כאשר
fנקראת עםy=5, יש למצוא את ערכו של המשתנה החופשיx. בקישור דינאמי, החיפוש מתבצע בסביבת הקריאה. - בסביבת הקריאה (הסביבה של
g), הקישור האחרון והזמין ביותר עבורxהוא1. - לכן, התוצאה הסופית היא .
כפי שהודגם, התוצאה שונה לחלוטין (
5 לעומת -4) תחת שתי שיטות הקישור. מכאן שהתשובה לשאלה היא חיובית: האופן בו נקשרים משתנים חופשיים בפרוצדורות הוא קריטי ומשפיע ישירות על תוצאת הריצה.