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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. אופטימיזציה בין פרוצדורלית

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

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

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

(I) ביטול תתי-ביטויים מקומיים נפוצים,

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

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

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

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

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

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

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

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

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



Source by Kumar Kishan Chandra

You may also like...

כתיבת תגובה

האימייל לא יוצג באתר.