פקודת goto

פקודת goto ("go to", בעברית: "לך אל" או "עבור ל-") היא פקודה בסיסית בשפות תכנות. הפקודה שייכת לקבוצת הפקודות העוסקות בבקרת זרימה של תוכנית המחשב. פקודות בקרת זרימה מאפשרות להורות למחשב לשנות את סדר קריאת שורות הפקודה: ברירת המחדל של המחשב היא לבצע את הפקודות באופן סדרתי לפי סדר הופעתן, ופקודות בקרת זרימה מאפשרות למתכנת להתנות ביצוע של חלק מהתוכנית, לבצע לולאות, לדלג וכו'. משמעות הפקודה goto למחשב: עבור לפקודה הנמצאת במקום אחר בתוכנית.

זיהוי המקום שאליו תתבצע הקפיצה נעשה בדרך כלל באמצעות מתן תגית (label) למקום זה. בשפת BASIC ניתן מספר (בסדר עולה) לכל שורת פקודה, והקפיצה נעשית באמצעות ציון מספר השורה בפקודת ה־goto. בשפת פסקל יש להגדיר את התווית באמצעות פקודת label לפני שניתן להשתמש בה.

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

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

ברוב השפות שתומכות בתכנות פרוצדורלי ומאפשרות שימוש בפקודת goto לא ניתן לקפוץ מחוץ לשגרה הנוכחית. בשפת C ישנו צמד פונקציות (setjmp ו־longjmp) שנועד לביצוע goto שאינו מקומי על ידי שמירת מצב המחסנית לפני הקפיצה ושחזורה לאחריה.

בשפות חדשות יותר כמו Java לא ניתן להשתמש בפקודה זו - ב־Java, למשל, ישנה מילת מפתח בשם goto שכל מטרתה היא "נעילת" מילת המפתח, כדי למנוע חזרה לשימוש בה.

דוגמאות שימוש

בשפת C, שימוש בפקודה יראה כך:
 .
 .
 goto LABEL;
 .
 .
 .
 LABEL:
 .
 .

ראו גם
 בקרת זרימה
 קוד ספגטי

הערות שוליים

תכנות