אבולוציה ככלי בתוכנה
החלטתי לפתוח שרשור חדש, גם מכיוון שהשרשור בו הנושא עלה הפך לשרשורפלצת אימתני, וגם מכיוון שאני מתכוון לתת פה הסבר די מקיף. נתחיל ממש ממש ממש ממש בבסיס, כדי שגם מי שלא יודע מה זה תוכנה יוכל להבין. כל בוגרי מדעי המחשב יכולים לדלג קצת קדימה עד הסמיילי הבא...
הערה (דיסקליימר): המידע שאני מביא בנושא התפתחות המחשב מאד כללי, ומבוסס כולו על הזכרון שלי ברגע זה. מכאן שיתכן ועשיתי טעויות קטנות. מכיוון שנכתבו מספיק מאמרים מקיפים בנושא, אני לא חש צורך לתת פה הרצאה מדוייקת. מה שכן, זוהי בודאי רוח הדברים. אז יאללה. מכונות חישוב שונות ומשונות נבנו כבר מזמן, אבל מה ששינה לחלוטין את פני המתמטיקה, הוא המחשב המודרני, שפריצת הדרך העיקרית (שנעשתה בזמן מלחמת העולם השניה) שהוא מקנה היא היותו All purpose, כלומר - לכל מטרה. אם פעם בנו מכונה שיכולה לחבר, או שיכולה לחסר, הקונספט החדש הגדיר מכונת חישוב בעלת שני חלקים אינטגרלים: מעבד המסוגל לבצע חישובים בסיסיים ומכיל מספר תאי זכרון ע"מ לבצע זאת, וזכרון משני. מה שהשיטה אפשרה הוא איחסון של מידע שחושב, ושימוש בו ע"מ לבצע חישובים חדשים. מעבדים היותר ותיקים היו מסוגלים לבצע רק פעולות כגון חיבור, חיסור, העברת מידע מהזכרון שעל המעבד לתא בזכרון המשני, והוצאת מידע מתא בזכרון המעבד. המעבדים הקיימים היום לא שונים בהרבה, אלא שהוספו להם עוד פעולות בסיסיות (כפל וחילוק, הזזת ביטים ועוד), יכולת לזהות שאריות מחישוב ובעיקר מהירות מטורפת (מחשב של 2000Mhz מבצע 2,000,000,000 פעולות בסיסיות בשניה, מספר מטורף לכל הדעות). בעקבות הקפיצה הזאת, התחיל מדע חדש (מדע המחשב), שעסק בדרכים לפתור בעיות מתמטיות (ואח"כ גם יותר ראליות) ע"י תוכנה. תוכנה היא אוסף הפקודות שמועברות למעבד ואותן הוא מבצע אחת אחת, עד לקבלת מטרה מסויימת. במדעי המחשב, תוכנה נועדת בד"כ לפתרון של בעיה מתמטית או בעיה שקשורה בארגון מידע. מכיוון שתוכנה דורשת משאבים של זמן ומקום (זמן לבצע את הפקודות ומקום לאחסן את המידע), אלו הפרמטרים העיקריים הנבדקים ע"מ לקבוע את "יעילות" התוכנה. אם למשל קיימת תוכנה אשר ממיינת מסד נתונים גדול בשניה, היא תהיה עדיפה על תוכנה שממיינת את אותו מדס נתונים בעשר שניות. כאשר מדובר במחשבים גדולים, בד"כ נושא הזמן יותר בעייתי מנושא המקום. לדוגמא, קיימת תוכנת מחשב אשר מסוגל לחזות את מזג האויר בדיוק אדיר לשבוע קדימה (כאשר רוב התוכנות הקיימות היום חוזות בדיוק רק יום-יומיים, ובכלליות לעוד יום-יומיים). למה לא משתמשים בה אתם שואלים? כנראה מכיוון שהזמן שלוקח לה לבצע את החישוב הוא כחמישה ימים. בשפה של מדעי המחשב, התוכנה אינה יעילה די הצורך. ע"מ לתת מענה לבעיות, פותחו שיטות לפתרון בעיות נפוצות ביעילויות מקסימליות, ומכיוון שרוב הבעיות הגדולות מורכבות מהרבה בעיות מוכרות ועוד כמה לא מוכרות, כך משיגים יעילות גבוהה בתוצר. עד לכאן ההקדמה. עכשיו להצגה העיקרית
הכל התחיל כאשר דוקטורנט לאקולוגיה החליט ליצור הדמיה של אבולוציה. לצורך העניין יצר וירוס מחשב - תוכנה שכל מטרתה היא לשכפל את עצמה לקבוצת תאי זכרון פנוייה. הבחור כתב את התוכנה הכי פשוטה שיכל כך שתשכפל את עצמה, ולצורך העניין השתמש ב80 פקודות בסיסיות. ע"מ לדמות את המוטציות הגנטיות, נתן לסביבה בה רצו הוירוסים (תוכנה המדמה מחשב פשוט המריץ תוכנות), טעויות מקריות בשכפול - בממוצע טעות בפקודה אחת לכל 10 שכפולים. יצירת הסביבה והתוכנה לקחו לו מספר חודשים, תוך שהמתכנתים מהם ביקש עזרה צחקו עליו - מה הסיכוי שתוכנית עובדת שתשנה לה פקודה אחת בכלל תמשיך לעבוד? ומה הסיכוי שהיא בכלל תשכפל את עצמה? ואחרי כל זה, נראה לך שנשאר סיכוי שהיא תהיה יותר טובה מהקודמת? לאחר שנתן לתוכנה לרוץ קצת, הוא נדהם. היצורים בני 80 הפקודות שכתב כמעט נכחדו, והוחלפו ע"י יצורים בני 79 פקודות, יצורים בני 81, ואפילו יצורים יותר קטנים בני 45 ו51 פקודות, אשר התנהגו כפרזיטים - לא היה להם קוד שדואג לשכפולם, אלא קוד שמוצא יצור 80 או 79 (בהתאם) אחר, ומשתמש בקוד ההעתקה שלו ע"מ ליצור יצור 51 או 49 חדש. בנוסף, היצור 51 נוצר בקפיצה גנטית ישירה מהיצור 45 - 7 פקודות חדשות החליפו פקודה יחידה בלי צעדי ביניים! אחד מהדברים המוזרים שנתקל בהם הוא יצור בן 22 פקודות. לא פרזיט, אלא יצור משכפל עצמי שלם ב22 פקודות, וזאת לאחר שהמתכנת השקיע חודשים בכתיבת תוכנה משכפת עצמית קטנה ככל האפשר ב80 פקודות! אפילו לאחר בדיקה של הקוד, סטודנט למדעי המחשב בMIT שהתעניין בנושא לא הצליח לשחזר את ההצלחה. הקוד היה כ"כ מסובך וכ"כ גאוני, שהקרוב הכי טוב שהסטודנט הצליח להגיע אליו היה 31 פקודות. בעקבות הניסוי המוצלח, התפתח ענף שלם במדעי המחשב שנקרא אבולוציית תוכנה. מכיוון שהגיעו למסקנה שבד"כ יתכן ותוכנה מסויימת ניתנת ליישום בצורה יותר יעילה מאשר זו שהמתכנת שלה הגה, נותנים לתוכנה לרוץ בסביבה וירטואלית המודדת את יעילותה, יוצרת ממנה אלפי עותקים עם שגיאות (מוטציות), בוחרת את היעילות מבין המוטציות וממשיכה הלאה על כל אחת מאלו שנבחרו. לאחר אלפי דורות, מקבלים תוכנה זהה למקורית בפעולתה, אך יעילה הרבה יותר ממה שאדם יכל להגות. אלו היו 60 שניות על אבולוציה ככלי בעיצוב תוכנה.
החלטתי לפתוח שרשור חדש, גם מכיוון שהשרשור בו הנושא עלה הפך לשרשורפלצת אימתני, וגם מכיוון שאני מתכוון לתת פה הסבר די מקיף. נתחיל ממש ממש ממש ממש בבסיס, כדי שגם מי שלא יודע מה זה תוכנה יוכל להבין. כל בוגרי מדעי המחשב יכולים לדלג קצת קדימה עד הסמיילי הבא...

