בקרת זרימה

פקודות בקרת זרימה הן פקודות בסיסיות בשפות תכנות, המודיעות למחשב מהי הפקודה הבאה שצריך לבצע. ברירת המחדל של המחשב היא לבצע את הפקודות באופן סדרתי. פקודות בקרת זרימה מאפשרות למתכנת להתנות ביצוע של חלק מהתוכנית, לגרום לחלקים מהתוכנית להתבצע שוב ושוב, ולדלג על קטעי קוד.

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

בשפות התכנות הראשונות, כגון COBOL ו־FORTRAN, נעשה שימוש נרחב בפקודת GOTO, תוך ביצוע קפיצות מכל מקום לכל מקום, לפי שיקולי המתכנת. בדרך זו ניתן לחסוך שכפול קוד, ולהגיע לביצועים אופטימליים מבחינת סיבוכיות זמן ומקום. עם זאת, שימוש חסר עכבות ב-GOTO יוצר תוכנית חסרת מבנה ברור, מה שנקרא קוד ספגטי (בשל הקושי לעקוב אחר מסלול הבקרה), שכמעט בלתי אפשרי לתחזק או להרחיב אותו, ומקשה על כתיבת קוד נטול באגים.

בשנת 1968 פרסם אדסחר דייקסטרה מאמר ובו שלל את השימוש בפקודת GOTO. לטענת דייקסטרה ורבים אחרים, ניתן לכתוב כל תוכנית מחשב ללא שימוש בפקודת GOTO מפורשת בשפה עילית. בעקבות מכתב זה התפתח התכנות המובנה, המאפשר כתיבת תוכניות נטולות GOTO.

מבני בקרת זרימה

[עריכת קוד מקור | עריכה]

מבני הבקרה החלופיים בשפות עיליות, המאפשרים כתיבת תוכניות נטולות GOTO, הם:

  • פקודת IFפקודת תנאי: "אם מתקיים תנאי A, בצע סדרת פקודות X, אחרת בצע סדרת פקודות Y."
  • לולאות
    • DO WHILE: "כל עוד מתקיים תנאי A, בצע סדרת פקודות X." או REPEAT UNTIL: "בצע סדרת פקודות X עד שמתקיים תנאי A." כאשר X תתבצע לפחות פעם אחת. מקרה פרטי של מבנים אלה הוא מבנה לולאת for בשפות ממשפחת C: "אתחל משתנה איטרציה i, כל עוד מתקיים תנאי A בצע סדרת הפקודות X, ולאחריה בצע פעולת עדכון למשתנה i." תנאי A בדרך כלל קשור למשתנה i – למשל התנאי i < 10.
    • For Each: "לכל אחד מאיברי המשתנה הסדרתי L, בצע אוסף פעולות X". לולאה זו מאפשרת, למשל לעבור על רשימה ללא התעסקות במבנה הפנימי שלה. לולאת for שהוזכרה קודם משמשת במקרים רבים לדמות לולאת for each.
    • שבירת לולאה – פקודת break משמשת לסיום לולאה בכל נקודה בתוכה, והמשך מסוף הלולאה, או מסימנייה מוגדרת לאחריה. פקודה זו היא בעלת סמנטיקה שעשויה להזכיר את GOTO, אך הקפיצה מתבצעת תמיד קדימה, להמשך הקוד, ולא אחורה. כך נמנעת יצירת "קוד ספגטי". פקודת continue קופצת אל האיטרציה הבאה של הלולאה – או למעשה אל התנאי שלפניה, ואם הוא עדיין מתקיים הלולאה תמשיך להתבצע.
  • CASE: "בדוק התאמה של המשתנה X לאחת מהתבניות t1, t2, ...tn, ובצע את סדרת הפעולות המתאימה לתבנית זו".
  • קריאה לשגרה או לפונקציה, ופקודת חזרה משגרה או פונקציה (return או yield). למעשה, ניתן לדמות כל לולאה בעזרת קריאות רקורסיביות לפונקציה. טכניקה זו משמשת בתכנות פונקציונלי.
  • זריקת חריגות. שיטה המאפשרת קפיצה אל נקודה מוגדרת מראש כאשר מגלים שהקוד הנוכחי איננו יכול להמשיך בפעולה המוגדרת שלו. מבנה זה בעל מאפיינים שונים מאוד משאר מבני הבקרה, בין היתר בשל העובדה שיעד הקפיצה מוגדר על פי היררכיית הקריאות לפונקציה, כלומר באופן דינמי ולא סטטי.

על אף שהשימוש בGOTO לא מומלץ, איסור מוחלט על שימוש כזה נחשב על פי רוב למוגזם, למעט בשפות שאינן נותנות כלל את האפשרות הזאת, כגון שפת ג'אווה.

קישורים חיצוניים

[עריכת קוד מקור | עריכה]
ויקישיתוף מדיה וקבצים בנושא בקרת זרימה בוויקישיתוף