אופטימיזציה של תוכנה

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

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

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

1.3 נוכחות שלב האופטימיזציה בארכיטקטורת המהדרים

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

2. טכניקות אופטימיזציה

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

2.1 טכניקות אופטימיזציה קלאסיות

ניתן לסווג את הטכניקות הקלאסיות לאופטימיזציית קוד כ:

1. אופטימיזציה מקומית

2. אופטימיזציה גלובלית

3. אופטימיזציה בין הליכים

2.1.1 אופטימיזציה מקומית

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

ניתן לבצע אופטימיזציה מקומית באמצעות הטכניקות הבאות-

(א) ביטול ביטויי משנה נפוצים מקומיים,

(ii) חיסול קוד מת

(iii) השימוש בזהויות אלגבריות-

(א) שימוש בזהויות אריתמטיות

(ב) הפחתה חוזרת מקומית, כלומר החלפת מפעיל יקר יותר במפעיל זול יותר.

(ג) קיפול מתמיד

(iv) סידור מחדש של אמירות שאינן תלויות זו בזו.

2.1.2 אופטימיזציה גלובלית (שיטות תוך פרוצדורליות)

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

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

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *