הסיפור על מל
פורסם בידי מחברו, אד ניית׳ר <nather@astro.as.utexas.edu>, ברשת Usenet, ב-21 במאי 1983:
מאמר מן הזמן האחרון על צד מצ'ואיסטי בתכנותיצא בהכרזה נועזת וחסרת בסיס:
אולי כיום,בתקופה דקדנטית זו שלבירה לייט, מחשבוני כיס, ותוכנה "ידידותית-למשתמש"אך בימים ההם,כשהמונח "תוכנה" עוד היה נשמע מצחיק,ומחשבים אמיתיים נבנו בתופים ובשפופרות,מתכנתים אמיתיים כתבו בשפת מכונה.לא פוֹרְטְרַן. לא ראטפוֹר. אפילו לא שפת סף.שפת מכונה.מספרים גולמיים ויפים בבסיס הקסדצימלי.ישירות.
לבל יגדל דור מתכנתים חדשבּוּר במורשת מפוארת זואני חש כי מחובתי לתארכמיטב יכולתי מבעד לפער הדורותאיך מתכנת אמיתי כתב קוד.אקרא לו מֵל,כי זה היה שמו.
את מל פגשתי כשעבדתי בחברת המחשבים רוֹיאל-מֶק'בִּי,כיום ישות רפאים עסקית המייצרת מכונת כתיבה.החברה ייצרה אז את ה-30-LGP,מחשב קטן וזול (בסטנדרטים של היום)בעל זיכרון תוף,ובדיוק החלה בייצורה-4000-RPC, מחשב מתקדם יותר,גדול יותר, טוב יותר, מהיר יותר – בעל זיכרון תוף.ליבּוֹת זיכרון היו יקרות מדי,ובכל אופן, עמדו להעלם.(זו הסיבה שלא שמעת על החברה,או על המחשב.)
נשׂכרתי לכתוב מְהַדֵּר פוֹרְטְרַןעבור הפֶּלא החדש הזה ומל היה המדריך שלי לכל נפלאותיו.מל תיעב מהדרים.
"אם תוכנה לא יודעת לשכתב את הקוד של עצמה,"שאל, "למה היא טובה?"
מל כתב,במספרים הקסדצימליים,את תוכנת הדגל של החברה.היא רצה על ה-30-LGPושיחקה בלאק ג'ק בתערוכות מחשביםעם לקוחות פוטנציאליים.התגובות שעוררה תמיד היו דרמטיות.בכל תערוכה היה ביתן ה-30-LGP עמוס,סביב התגודדו אנשי המכירות של IBMודיברו ביניהם.אם כל זה מכר מחשבים או לאזו היתה שאלה שמעולם לא שאלנו.
העבודה של מל היתה לשכתבאת תוכנת הבלאק ג'ק עבור ה-4000-RPC.(מי בכלל ידע אז מה זה פּוֹרְט?)מִיעוּן הכְּתוֹבוֹת במחשב החדשהיה מסוג אחד-ועוד-אחדכך שבכל הוראה למכונה,בנוסף לקוד-הפעולהולכתובת האוֹפֵּרַנְדּ,היתה כתובת נוספת שציינה היכן, על התוף המסתובב,ממוקמת ההוראה הבאה.
בהשאלה לימינו,כל פעולה הסתיימה בפקודה GO TO!פַּטְמוּ בַּזֶּה את מיקטרתו של פסקל ועשנו.
מל אהב את ה-4000-RPCמשום שידע לכתוב עבורו קוד אופטימלי:כלומר, למקם הוראות על התוףכך, כאשר הוראה נשלמה,הבאה כבר הגיעה אל "הראש הקורא"נגישה ליישום מיידי.הייתה תוכנה שנועדה לעשות את הדבר הזה בדיוק,"אָסֶמְבְּלֶר מייעל",אך מל סירב להשתמש בה.
"לך תדע איפה זה יניח את הדברים",הסביר, "כך שתיאלץ להשתמש בקבועים נפרדים."
רק לאחר זמן רב הבנתי את ההערה הזו באמת.מאחר ומל הכיר את הערך המספרישל כל הוראהוהִקצה בעצמו את הכתובות על התוףכל הוראה שכתב יכולה הייתה להחשבלקבוע מספרי.כך יכול היה לקחת הוראת "חיבור", למשל,ואם ערכה המספרי התאים,להשתמש בה כּכוֹפֵל.עריכת הקוד שלו הייתה מסובכת לכולם, זולתו.
השוויתי את האופטימיזציה הידנית של מלעם קוד זהה שעבר עיסוי באָסֶמְבְּלֶר המייעל,הקוד של מל תמיד רץ מהר יותר.זה היה משום שעיצוב המעלה-מטהעוד לא הומצא אזומל ממילא לא היה משתמש בזה.הדבר הראשון שכתב היו הלולאות הפנימיות של התוכנה שלוכדי להעניק להן יתרוןבבחירת כתובות הזיכרון הראשונות בתוף.האָסֶמְבְּלֶר המייעל לא היה מספיק מתוחכם כדי לעשות את זה.
מל מעולם גם לא כתב לולאות השהיה,אפילו כשהפְלֵקסוֹרַייטֵר העיקשהזדקק להשהיה קלה בפלט האותיות כדי לעבוד כראוי.הוא פשוט מיקם הוראות על התוףכך שהבאה בתור היתה בדיוק מאחורי הראש הקוראכשהגיע תורה;נדרש התוף לסיבוב שלםכדי להגיע אליה.הוא טבע שם בלתי נשכח לתהליך הזה.על אף ש"אופטימום" הוא מושג אבסולוטי,כמו "ייחודי", הוא הפך למושג יחסישגור בדיבור:"לא לגמרי אופטימום" או "פחות אופטימום"או "לא ממש אופטימום".מל כינה את אזורי ההשהיה המקסימלית"פסימום קיצוני".
לאחר שסיים את תוכנת הבלאק ג'קבגרסה יציבה("אפילו המאתחל אופטימלי",אמר בגאווה)קיבל דרישת תיקון ממחלקת המכירות.התוכנה השתמשה במנגנון אלגנטי (אופטימלי)להגרלת מספרים כדי לטרוף את "הקלפים" ולחלק את ה"חפיסה",וכמה אנשי מכירות סברו כי המשחק הוגן מדי,משום שמדי פעם הלקוחות הפסידו.הם רצו שמל ישנה את התוכנהכך שבאמצעות מתג במכונהיוכלו להטות את המספרים לטובת הלקוח.
מל נרתע.לתחושתו היה זה לא ישר בעלילמה שנכון,לכן סירב.מנהל מחלקת המכירות דיבר עם מל,כך גם הבוס הגדול, ואל הלחץ של הבוסהצטרפו גם כמה מתכנתים.לבסוף מל נכנע וכתב את הקוד,אבל הוא הפך את התנאי,וכשלחצו על המתג,התוכנה רימתה, וניצחה בכל פעם.מל היה מאושרוטען שהוא אתי ברמת התת-מודעובשום אופן לא הסכים לתקן זאת.
לאחר שמל עזב את החברה למקום ע₪יר יותרהבוס הגדול ביקש שאציץ בקודואראה אם אוכל לתקן אותו.בחוסר רצון נעתרתי לבקשתו.לעקוב אחרי הקוד של מל היתה הרפתקה אמיתית.
תמיד הרגשתי שתכנות הוא אמנותשערכה האמיתי יכול להיבחן רק בידיאמן הבָּקִי בצפונותיהַ;אורים ותומים נפלאיםחבויים מן העין האנושית, לעיתים לעד,בשל עצם טבעו של התהליך.אפשר ללמוד הרבה על אישיותו של אדםרק מדפדוף בקוד שכתבאפילו במספרים הקסדצימליים.מל היה, אני מאמין, גאון שהקדים את זמנו.
ההלם הכי גדול שלי, כנראה, היה בגילוילולאה תמימה ללא תנאי עצירה.שום תנאי. כלום.על פי ההיגיון הבריא זוהי לולאה אינסופיתבה התוכנה תרוץ במעגל, לעד, ללא הרף.התוכנה הזו, לעומת זאת, חלפה בתוכהויצאה מצדה השני בבטחה.נדרשו לי שבועיים כדי להבין איך.
מחשב ה-4000-RPC היה מצויד במתקן מאוד מודרניבשם אוֹגֵר-מוֹנֶהשאיפשר לתכנת לולאותשעושות שימוש בהוראות עם היסטבכל ריצה של הלולאההמספר באוֹגֵר-מונההתווסף לכתובת האופרנד בהוראהכדי להצביע עלפיסת המידע הבאה בסדרה.המתכנת היה צריך רק להוסיף 1 לערך השמור באוֹגֵרבכל מעבר דרך הלולאה.מל מעולם לא השתמש בו.
תחת זאת, הוא העתיק את ההוראה אל אוֹגֵר אחר במכונההוסיף 1 לרכיב הכתובתושמר את התוצאה במקומה המקורי בזכרון.אז הריץ את ההוראה העדכניתישר מן האוֹגֵר.הלולאה נכתבה כך שזמן הריצה הנוסףנלקח בחשבון –מייד כשביצוע ההוראה הסתיים,הבאה בתור הייתה כבר מונחת מתחת לראש הקריאה של התוףמוכנה לריצה.אבל בלולאה לא היה תנאי עצירה.
הרמז החיוני הגיע כאשר שמתי לבשהביט של האוֹגֵר-מונה,הביט שבין הכתובת לבין קוד-הפעולה בהוראה,היה דלוק –אך מל לא השתמש באוֹגֵר-מונה,והשאיר אותו מאופס תמיד.כשראיתי את האור כמעט הסתנוורתי.
הוא מיקם את המידע שעליו עבדסמוך לראש הזיכרון –בכתובות הגדולות ביותר אליהן יכלה הוראה לפנות -כך שלאחר שפריט המידע האחרונה טופל,פעולת חיבור על כתובת ההוראההייתה גורמת לגלישתה.העברת השארית הוסיפה 1לקוד-הפעולה ושינתה אותו לקוד-הפעולה הבא ברשימת ההוראות:הוראת דילוג.מן הסתם, ההוראה הבאה כבר הייתהבכתובת אפס,והתוכנה המשיכה קדימה באושר בדרכה.
לא שמרתי על קשר עם מלאז איני יודע אם אי פעם נכנע ללחץהשינויים ששטף את שיטות התכנותמאז אותם ימים נשכחים.אני מעדיף לחשוב שלא.כך או כך,התרשמתי מספיק כדי להפסיק לחפשאת הקוד הסורר,ואמרתי לבוס שלא מצאתי כלום.הוא לא היה מופתע.
כשעזבתי את החברה,תוכנת הבלאק ג'ק עדיין רימתהאם הפעלת את המתג הנכון,וטוב שכך.לא הרגשתי בנוחלהתעס-האק בקוד של מתכנת אמיתי.