top of page
k6maC_thick%20(1)_edited.png

שפת מכונה | טור 04

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

על תוכנה בקערת ספגטי ועל סיבות להפליל מרצים לתכנות

לפני עשרים שנה ועוד יום, באחד בינואר 2000, פקחו תושבי כדור הארץ את עיניהם לבוקר של אימה. נבואות הזעם על באג 2000 מילאו במשך חודשים את הדיווחים באמצעי התקשורת, אבל ביום הדין עצמו לא השתבש כמעט דבר. האפוקליפסה הייתה בעיקרה פיננסית – מחיר הניסיונות לסכל את הבאג ברחבי העולם, עמד לפי ההערכות על יותר מ-300 מיליארד דולר; הבאג היקר בהיסטוריה, ובהפרש ניכר. מדוע נדרש כל כך הרבה כסף, לא רחוק מהתמ"ג של מדינה כישראל, כדי להתמודד עם באג, שמקורו הידוע מראש הוא בסך הכול האופן שבו נכתבת השנה בתוכנות מחשב? הסיבות רבות, אבל החשובה בהן, אולי, קשורה לכך שאת מרבית התוכנות המועדות לפורענות כתבו עשורים קודם לכן, בשפת תכנות עתיקה בשם קובול. למעשה, כבר ב-1974 אבחנה אותה ד"ר ברברה ליסקוב כשפה הרת אסון, גם מבלי שחזתה כלל את הבאג העתידי.

ברברה ליסקוב נולדה ב-1939, בלוס אנג'לס, לאם עקרת בית ואב עורך דין. בגיל צעיר עברה המשפחה צפונה, לעיר שעל המפרץ – לא רחוק מעמק הסיליקון שעוד יקום. ליסקוב נמשכה תמיד למתמטיקה ומדעים; בעידן שבו נשים לא בדיוק נותבו למקצועות מדעיים, לא קל היה לבחור בדרך זו ולהתמיד. הוריה מעולם לא מנעו זאת ממנה, אם כי אביה המליץ לה שתלמד גם קלדנות, כדי שיהיה לה ממה להתפרנס אם תתאלמן, או אם חס וחלילה לא תצליח למצוא לה בעל. היא הייתה הסטודנטית היחידה, או אחת משתיים, בכיתות של מאה סטודנטים שבהן למדה מתמטיקה ופיזיקה בברקלי, ורק בסיום התואר הראשון, כשהתחילה לעבוד בחברה מחשוב פרטית, למדה תכנות והתאהבה בתחום. לאחר שקיבלה את הדוקטורט שלה במדעי המחשב – היא בין הנשים הראשונות בארה"ב שהשיגו זאת, ולפי הערכות מסוימות הראשונה ממש – הגיעה ל-MIT, וב-1974 התחילה לעבוד על הבעיה שהעסיקה אותה באמת: מוגבלותן של שפות התכנות.

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

קל להבין מה GoTo עושה; אם מתקיים תנאי מסוים, שולחת GoTo את המחשב שמריץ את הקוד, לבצע פקודה בחלק אחר של התוכנית. פקודת GoTo שתופיע במתכון לכיסונים ממולאים בגבינת ריקוטה (טוב לפעמים לחשוב על תוכניות מחשב כעל מתכונים) תיראה בערך כך: "אם אין ריקוטה, לֵך (כלומר, GoTo) לשורה 60". בשורה 60 תמתין סדרת הוראות עבור ביקור אצל השכנים, שעשויות לכלול פקודות GoTo נוספות. למשל: "אם השכנים לא בבית, לך לשורה 140". בשורה 140 יחכו, אולי, הוראות קפיצה אל המעדנייה הסמוכה, ואם גם שם אין ריקוטה, יועבר המחשב למקום אחר שבו רצף הוראות המתאר החלפת הריקוטה בגבינה אחרת. במקרה שאין אף גבינה בשום מקום – תפקוד על המחשב הוראת GoTo לזנק אל סדרת שורות המתארת אלגוריתם לכרובית בפיתה, וכן הלאה, ללא הגבלה.

אלא שהוראות ההליכה לשכנים, בתוכנית הכתובה בקובול, יכולות בקלות להיות מתוארת באינספור מקומות שונים לאורך הקוד, לאו דווקא רק בשורה 60. אין שום סיבה עקרונית שלא להוסיף, מסיבות מגוונות, הוראות הליכה לשכנים גם בשורה 240, שורה 350, ושוב בשורה 515 (כדי לבקש מהם הפעם מנגו למתכון טירמיסו מנגו). כל רצף הוראות נפרד כזה יכיל בתורו הוראות GoTo פנימיות, שישלחו לעוד ועוד מקומות; שפת תכנות כמו קובול מאפשרת את הבלגן הזה, מעודדת אותו בעצם, וזאת במקום לתמוך בדרך עקבית, אחידה, לתיאור הליכה לשכנים עבור כל מטרה שהיא.

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

ליסקוב לא הייתה הראשונה לזהות את הבעיה. אֶדְסְחֶר דֶיְיקְסְטְרָה ההולנדי, מחלוצי העוסקים במדעי המחשב, פרופסור אקסצנטרי ורב השפעה שפיתח גם טינה אישית כנגד שפת הקובול (ציטוט: "השימוש בקובול פוגע במוח. מכאן שיש להתייחס אל הוראת השפה כאל עבירה פלילית"), כתב ב-1968 מכתב לירחון ידוע בתחום, שכותרתו "פקודת GoTo נחשבת למזיקה". המכתב הפך לאבן דרך במסע הצלב כנגד הפקודה ההרסנית. "הפקודה GoTo, במצבה כיום, היא פשוט פרימיטיבית מדיי", טען דייקסטרה, "היא מפתה את המתכנת להפוך את תוכנית המחשב שלו לאנדרלמוסיה". כמו קביעות אחרות של דייקסטרה, גם זו עוררה ויכוח עז, אבל בסופו של דבר ניצח ההולנדי. שש שנים אחר כך, לקחה ליסקוב את קריאתו צעד נוסף, ותרגמה אותה לפרויקט מעשי. יחד עם כמה מהסטודנטים שלה ב-MIT, היא פיתחה שפת תכנות חדשה, CLU, שאין בה פקודת GoTo כלל.

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

שפתה של ליסקוב לא הפכה לשפה נפוצה, אך היא השפיעה על שפות תכנות מרכזיות שנולדו אחריה, ביניהן ג'אווה, ++C, פייתון ואחרות, והרעיונות שגלומים בה עומדים ביסוד הגישה בת-זמננו לתכנות. אבל כיוון שנדרש, לפחות בעבר, בין עשור לשניים עבור שפות תכנות כדי להוכיח עצמן ולהפוך פופולריות, באחד בינואר 2000 היה עדיין חלק ניכר מן המערכות הממוחשבות מבוסס על קוד שנכתב עשורים קודם. וגם אם החשש לבאג עצמו לא נבע ישירות משימוש ב-GoTo, אלא מן האופן שבו יוצגה השנה במאגרי נתונים – לו היו כל התוכנות המיושנות בשפת קובול נכתבות בשפות מודרניות יותר, היה בהן רכיב אחד בלבד שאחראי על התאריך, וששמו מן הסתם הוא "תאריך"; זאת במקום שיפוזרו בהן התייחסויות ייחודיות לתאריכים באינסוף מקומות בלתי צפויים, לפי מיטב המסורת של קוד הספגטי, ושאת כולן צריך לאתר ולתקן, במאמץ של מיליוני שעות עבודה. אבל כל זה הם מים מתחת לגולדן גייט.

ליסקוב עברה לעסוק בנושאים אחרים, וב-2008 זכתה בפרס טיורינג, הפרס החשוב ביותר בתחום מדעי המחשב. בגיל 80 היא עדיין משמשת כפרופסור ב-MIT, וממשיכה לחשוב על תוכניות מחשב ועל דרכי הבנייה שלהן. חרדת באג 2000 כבר נשכחה, אבל באופק זורח לו כבר באג 2038. גם זהו באג תאריך, שנובע מכך שמערכות דיגיטליות רבות מחשבות את התאריך רק מאז האחד בינואר 1970, ומסיבות של חסכון במקום ואופני ייצוג ממוחשבים, לא מסוגלות לייצג תאריך מאוחר יותר מה-19 בינואר 2038, מבלי שיתאפס. ההשלכות של באג 2038 קטנות מאלו של 2000 – הוא עתיד לפגוע, אם בכלל, במנגנוני בקרת תנועה למשל, והשקיה. אפוקליפסת הממטרות, אפשר לקרוא לזה. ההתמודדות אתה לא תגיע למאות מיליארדי דולרים, בין השאר גם הודות לרעיונותיה של המתכנתת מסאן פרנסיסקו – שהבינה שכדי לפתור בעיות גדולות, צריך קודם כל להיות מסוגלים לפתור בעיות קטנות. וגם שעדיף לא לכתוב שום דבר בקובול.

פורסם במקור ב-02.01.2020

בועז לביא הוא תסריטאי, יוצר קומיקס ומרצה על אלגוריתמים כותבים.

    כתבות נוספות

bottom of page