Page 57 - 4761
P. 57

Способи оптимізації
                         Розрізняють  дві  категорії  оптимізуючих  перетворень:  перетворення  вихідної
                  програми в її внутрішній формі, яка не залежить від об'єктного коду (машинно-незалежні)
                  і перетворення, які здійснюються  на рівні об'єктної програми (машинно-орієнтовані).
                         На  практиці  використовують  досить  широкий  набір  машинно-незалежних
                  оптимізуючих перетворень. До них відносяться:
                         1.  Розвантаження ділянок, що  повторюються.
                         2.  Спрощення дій.
                         3.  Реалізація дій.
                         4.  Чистка програми.
                         5.  Економія пам'яті.
                         6.  Скорочення програми.

                         Розвантаження ділянок, що  повторюються.
                         Таку  назву  отримав  спосіб  оптимізації,  що  складається  у  винесенні  обчислень  з
                  багаторазово виконуваних ділянок програми на ділянки програми, рідко прохідні.
                         До  цього  виду  перетворень  відносяться  різні  чистки  зон,  тіл  циклів  і  тіл
                  рекурсивних  процедур,  коли  інваріантні  (за  результатом  виконання)  у  відповідних
                  ділянках повторення вирази, лінійні компоненти виносяться з них і розміщуються перед
                  входом до ділянки, яка  повторюється - чистка вгору, або коли знищують свої попередні
                  результати лінійні компоненти або групи лінійних компонент,   ділянки повторюваності
                  виносяться з нього і розміщаються за межами ділянки повторюваності - чистка вниз.
                         Зазвичай  виносяться  тільки  такі  вирази  і  лінійні  фрагменти  програми,  які
                  обов'язково виконуються при кожному проходженні ділянки повторюваності.
                         Скорочення глибини операції.
                         Скорочення  глибини  операції  -  процедура  виносу  за  межі  циклу  операторів,
                  аргументи яких є функціями рекурсивних змінних, і заміна їх всередині циклу простими
                  рекурсивними  операторами  присвоювання,  аргументи  яких  не  залежить  від  інших
                  змінних.
                         Сенс цієї операції в тому, що вона дозволяє виносити з циклу навіть ті оператори,
                  операнди  яких  залежать  від  керуючої  змінної  циклу.  На  відміну  від  зсуву  інваріантних
                  операторів при скороченні глибини операцій,  оператори зсуву заміняють більш простими
                  і швидше виконуваними операторами
                         Видалення індуктивних змінних і виразів.
                         Ряд перетворень цього типу пов'язаний з так званими індуктивними обчисленнями
                  в  ділянці  повторюваності  програми.  Такими  перетвореннями  є  видалення  індуктивних
                  змінних,  яке  означає  заміну  кількох  індуктивних  змінних  циклу  однією  індуктивною
                  змінною, а також видалення індуктивних виразів з циклу.
                         Заміна складних операцій на більш прості.
                         Дуже  важливим перетворенням  з  цієї  групи  є  заміна  в  індуктивних  обчисленнях
                  складних  операцій  на  більш  прості.  Наприклад,  зведення  до  степеня  або  ділення
                  замінюється множенням (наприклад, вираз Х / 4 можна замінюється на вираз Х * О.25), а
                  множення – додаванням.
                         Заміна  складних  операцій  на  більш  прості  не  завжди  призводить  до  оптимізації,
                  насправді це може навіть призвести до сповільнення, наприклад для програм з циклами,
                  що складаються з декількох частин.
                         Виключення надлишкових виразів.
                         До  групи  перетворень  щодо  спрощення  дій  входять  виключення  надлишкових
                  (зайвих) виразів. Воно полягає в знаходженні і видаленні з об’єктного коду операцій, які
                  повторно обробляють одні і ті ж операнди.





                                                                55
   52   53   54   55   56   57   58   59   60