שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2017 - מודל הסביבה

שאלה 1 (25 נקודות)

שאלה זו עוסקת בשפת "יוטורג" (שפה PROC תיאורטית) המוצגת בעמודים 81-74 בפרק 3 של הליימון בעטלן. זכור, שפת "יוטורג" מאפשרת הגדרות פונקציות בעלויות פרוצדורליות יחיד.

להדגמה, זוהי דוגמה:



בדוגמה זו, משתנה מופיע בגוף הפונקציות וגם וגם מופיעים במשתנה חופשי של הפונקציות.

האם שיוקי שם של הפונקציות בשפה PROC (לכשהוא) של פרוצדורות המשתנים החופשיים בפרוצדורות, צעיד לקבלת רצף שונה שנתון?

אם תקבע שונה היא לא, הסבר מדוע!

אם תקבע שונה היא כן, הסבר זוהנה בשנונה לקבלת רצף שונה שנתון!
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמבחן 2017 סמסטר ב · 2017 · סמסטר ב
מודל הסביבהסגוריםתחום לקסיקלימשתנים חופשייםהוכח או הפרך
חשוב על ההבדל בין הסביבה שבה פרוצדורה נוצרת לבין הסביבה שממנה היא נקראת, וכיצד כל אחת מהן יכולה להשפיע על הערך של משתנים חופשיים בגוף הפרוצדורה.
כן. האופן שבו שפה מקשרת (קושרת) שמות של משתנים חופשיים בפרוצדורות הוא החלטה מהותית בעיצוב השפה, והוא יכול לשנות באופן דרמטי את התנהגות התוכנית ואת תוצאתה. נסביר זאת על ידי השוואה בין שתי שיטות קישור עיקריות: תחום לקסיקלי ותחום דינאמי.

משתנה חופשי בפרוצדורה הוא משתנה שנעשה בו שימוש בגוף הפרוצדורה, אך הוא אינו מוגדר כפרמטר שלה ואינו קשור באמצעות הגדרה מקומית (כמו 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) תחת שתי שיטות הקישור. מכאן שהתשובה לשאלה היא חיובית: האופן בו נקשרים משתנים חופשיים בפרוצדורות הוא קריטי ומשפיע ישירות על תוצאת הריצה.