פקודת goto

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

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

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

ירידת קרנה של פקודת goto[עריכת קוד מקור | עריכה]

בשנת 1968 פרסם אדסחר דייקסטרה מאמר מפורסם בשם Go To Statement Considered Harmful, ובו שלל את השימוש בפקודת goto. לטענת דייקסטרה ורבים אחרים, ניתן לכתוב כל תוכנית מחשב ללא שימוש בפקודת goto. גישתו של דייקסטרה הפכה למקובלת ביותר בעולם התכנות, אך אל מול שלילה מוחלטת של הפקודה הציב דונלד קאנות' גישה המתירה שימוש בפקודה במקרים מסוימים, במאמרו Structured Programming with go to Statements.

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

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

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

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

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

 .
 .
 goto LABEL;
 .
 .
 .
 LABEL:
 .
 .

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