לדלג לתוכן

קוד ספגטי

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

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

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

מאפיין טיפוסי של קוד הספגטי הוא שימוש נרחב בפקודת goto (לפני שתכנות מובנה הפך לנורמה מקובלת), המורה למעבד המחשב "לקפוץ" לפקודה הנמצאת בשורה מסוימת, שלא לפי סדר השורות בקוד. ה"קפיצה" הזו עשויה ליצור לולאות תכנותיות - לרוב מותנות, על ידי פקודת if - או שגרות (רוטינות) מלאכותיות, באופן שייקשה לזהותן. אם ממשיכים לעשות שימוש בשיטה הזו לאורך זמן, במהלך תחזוקת אותו קוד, הולכים ונוצרים בו טלאים רבים של פקודות goto, ה"מקפיצים" את המעבד הלוך ושוב ברחבי הקוד, אשר נעשה מסובך ומפותל. בשנת 1968, פרסם אדסחר דייקסטרה את מאמרו המפורסם Structured Programming with go to Statements, בו שלל את השימוש בפקודה זו, ובעקבותיו המושג תכנות מובנה הלך ותפס מאז תאוצה. כיום, השימוש בפקודת goto נחשב לבעייתי בהנדסת התוכנה, ומשתמשים בה רק במקרים חריגים (כגון יציאה מלולאה מקוננת).

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

הקשר שבו מקובל ואף יעיל להשתמש בקוד ספגטי, הוא במקרה שבו הבלגן הוא חלק מהמטרה: קוד המכונה של וירוסים נפוצים רווי בדרך כלל בפקודות קפיצה אקראיות למראה, או אפילו אקראיות ממש. טכניקה זו מקשה על איתור הווירוס ועל הניתוח של דרך פעולתו. בנוסף, ישנן תחרויות כתיבת קוד בלתי קריא (למשל Obfuscated C Code); גם כאן, פקודות goto מעלות את מידת האי-קריאות של הקוד.

דוגמה לקוד ספגטי

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

דוגמה למקטע קוד ספגטי "קלאסי" בשפת פורטרן[1]:

10 IF (X.GT. 0.000001) GO TO 20
X = -X
11 Y = X*X - SIN(Y)/(X+1)
IF (X .LT. 0.000001) GO TO 50
20 IF (X*Y .LT. 0.000001) GO TO 30
X = X-Y-Y
30 X = X+Y
...
50 CONTINUE
X = A
Y = B-A + C*C
GO TO 11
...

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

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

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

הערות שוליים

[עריכת קוד מקור | עריכה]
  1. ^ מתוך הספר Concepts In Programming Lanuages מאת John C. Mitchell
ערך זה הוא קצרמר בנושא תוכנה. אתם מוזמנים לתרום לוויקיפדיה ולהרחיב אותו.