'המלצה חמה: From NAND to Tetris'
22 במרץ, 2006

בסימסטר האחרון לקחתי קורס בחוג למדעי־המחשב, בשם Workshop in Computer Construction - From NAND to Tetris (או בקיצור: nand2tetris ,nand או nand2tet). כל־כך נהנתי ממנו, וכל־כך למדתי ממנו הרבה, כך שאני רוצה להמליץ על הקורס, לטובת מי שזה יכול לעניין אותו.

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

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

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

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

באופן חכם, בין המודולים, הכניסו שני תרגילים שבהם צריך לתכנת משהו בכלים שיבנו במודולים הבאים. הראשון הוא תכנות באסמבלי לפי מפרט נתון והשני הוא תכנות חופשי של משחק כלשהו או תוכנה אינטראקטיבית כלשהי. ההתנסות הזו בכלים שיהיה צריך לבנות, עוזרת מאוד להבין איך הם פועלים: קודם להכיר את התחביר שלהם ואופן הפעולה שלהם, על־ידי שימוש בהם, ורק אז באמת לבנות אותם. כדי שיהיה אפשר לעשות את זה, להשתמש במשהו שעדיין לא כתבתם, וכחלק מהמבנה של המערכת, כל המודולים של המערכת כבר בנויים ושמישים, אם כי כתובים באופן כזה שאי־אפשר לקרוא אותו באופן ישיר (הכל "מקומפל"). כמובן שאפשר לעשות RE או דקומפילציה, אבל בגדול זו דרך שלומדים דרכה פחות, ושהיא לא תמיד הכי נוחה והכי קלה. אז יש לנו מערכת שבנויה מראש: זה אומר שבעצם אפשר לבנות את המודולים השונים בכל סדר שרוצים, אפילו הפוך, כשמשתמשים בכל המערכת הבנויה מלבד בחלק שעליו אתם עובדים (כמובן שהסדר הטבעי הוא להתחיל מלמטה, מבניה של שערים בסיסיים בחומרה, על אמולטור־חומרה מצורף, ולעלות עד שמגיעים אל מערכת־ההפעלה). נניח שאתם רוצים להתחיל מהקומפיילר; תוכלו לבדוק את ה־VM code שהוא מפיק אל מול ה־VM emulator שיש בחבילת־התוכנות של הקורס או להמיר את הקוד שהוא מפיק לאסמבלי ומשם להריץ במכונה, על־ידי הכלים שמסופקים, החלקים שכבר בנויים. דרך אחרת לבנות את הקומפיילר היא ב־RE ל־output של הקומפיילר שכבר קיים.

אז אפשר לבנות מודול מודול בנפרד. אבל הבנה מלאה של המערכת לא מגיעה רק מהבנה של כל מודול בנפרד, אלא מהבנה של ה־whole, ואת זה אפשר להשיג רק אחרי שבונים את המערכת כולה. אם להיות בומבסטי, אפשר לצטט את פנגולוד, שאמר בדנגוות פנגולוד: "a man may read a great book, and when it is full-read it is rounded and complete in his mind, according to his measure. Then at last he perceives that some fair thing that long endured".

מבחינת החומר שדרוש כדי לעשות את הקורס, הכל נמצא ברשת, פחות או יותר. מה זה פחות או יותר? יש לקורס ספר. זה הכרחי לקרוא את הספר, או לפחות חלקים ממנו, כדי לבנות את המערכת: הוא נותן את הרקע הדרוש, ומספק spec־ים ו־אינטרפייסים. עכשיו, טיוטה של הספר כולו נמצאת ברשת, אבל מהגרסה הסופית יש רק חלקים, והסדר קצת שונה. מנסיון, זה מספיק בהחלט: לקרוא את הפרקים שאפשר מהגרסה הסופית, ואת אלה שלא - מהטיוטה. חבילת התוכנות שצריך, ופירוט של איך לבנות את המודולים השונים, שמחולקים ל־12 "פרוייקטים", נמצאים באתר של הקורס.
מזה נובע שאפשר לבנות את המערכת וללמוד את כל מה שצריך גם בלי להרשם לקורס או בכלל לא להיות סטודנט באוניבריסטה העברית. לשיעורים בטח שלא צריך להגיע: למעשה, אין לי שמץ של מושג מה קורה שם. יכול להיות שמה שכן יש שם זה הרחבה וסתם מידע נוסף, אולי קצת היסטוריה וקוריוזים; לא יודע. ה־TAs, אגב, ממש הוגנים.

תגים