Спец часть (часть 2) (3 поток) (2015) (by Кибитова) (1161602), страница 32
Текст из файла (страница 32)
Эквивалентные преобразования сохраняютсемантику исходной программы;• “стоимость” преобразования должна быть сопоставима с затрачиваемымии полученнымиэффектами.тоВремяот включения• усилиямиМашинно-независимаяоптимизация,есть компиляциипроведение преобразованийоптимизирующих преобразований всегда растет, но иногда это не оченьисходной программы (в форме некоторого внутреннего представления), неважно. Важнее, чтобы при оптимизации не вносились дополнительныезависящих от выходного языка компилятора (без учета конкретных свойствошибки, на исправление которых затрачиваются дополнительные усилия;объектной машины). Эта оптимизация обычно выполняется на специально• в результате преобразований программы в среднем должны “улучшаться”выделенной фазе компиляции (пометка II на рисунке),(почти для всех допустимых данных), лишь на каких-то (редко• Машинно-зависимая оптимизация, то есть преобразование программы навстречающихся) комбинациях данных допускается обратный эффектвыходном языке компилятора.
Этот вид оптимизации обычно проводится(ухудшение характеристик).одновременно с генерацией объектной программы или уже после этой генерациина дополнительнойстадии(пометкаIII на рисунке).• Машинно-независимаяоптимизация,тоудовлетворяющимиесть проведениепреобразованийНекоторыепреобразованиясчитаютсяэтим критериям иисходной программы(в формевнутреннегопредставления),нерекомендуютсядля включенияв некотороголюбой компилятор.Другиепреобразования,Машинно-независимая оптимизация получила такое название потому, чтозависящихот выходногоязыкакомпилятора(безиучетаконкретныхоснованныена сложноманализепотокауправленияпотокаданных, асвойствтакже напроводимые в рамках этого процесса преобразования не зависят от архитектурыобъектной результатовмашины). Этаоптимизацияобычновыполняетсяпрограмм,на специальноиспользованииэтогоанализа примодификациитребуютвычислительной системы, для которой предназначена объектная программа.
Длядополнительногоанализапредставительногонаборареальныхпрограммнаданномвыделенной фазе компиляции (пометка II на рисунке),проведения таких преобразований разработан целый ряд формальных математическихязыкепрограммирования. Различаютсядватоосновныхвида оптимизации:• Машинно-зависимаяоптимизация,есть преобразованиепрограммы наметодов. При проведении преобразований машинно-зависимой оптимизации можетвыходном языке компилятора. Этот вид оптимизации обычно проводитсяоказаться необходимым учитывать аппаратные особенности вычислительных систем –одновременно с генерацией объектной программы или уже после этойчисло и способ организации взаимодействия центральных процессоров, иерархиюгенерации на дополнительной стадии (пометка III на рисунке).устройств памяти, количество и размеры регистров,а также многое другое.
42ОбычнооптимизирующимпреобразованиямподвергаетсявнутреннееМашинно-независимая оптимизация получила такое название потому, чтопредставлениепрограммы,а не текстна исходномоперации,проводимыев рамкахэтого процессапреобразованияне языке.зависятВо-первых,от архитектурынеобходимыесистемы,для реализациивысокоуровневыхязыкахвычислительнойдля которойпредназначена операцийобъектнаястановятсяпрограмма.наДлявнутреннегоболееявными,что облегчаетих обнаружение ипроведениятаких представленияпреобразованийпрограммразработанцелыйряд формальныхматематическихоптимизацию.Например,исходныйоператорs=s+a[i]*b[i]скрывает,методов. При проведении преобразований машинно-зависимой оптимизацииможет чтовычислениеадресовучитыватьдля элементовa[i]особенностии b[i] содержитобщие подвыраженияоказатьсянеобходимымаппаратныевычислительныхсистем –Во-вторых,внутреннеепредставлениеможетоказатьсячислоsizeof(тип)*i.и способ организациивзаимодействияцентральныхпроцессоров,иерархиюотносительнонезависимымот объектноймашины,чтомногоеделает другое.оптимизатор достаточноустройствпамяти, количествои размерырегистров,а такжеустойчивымкизменениямприпереносенадругуюмашину.Обычно оптимизирующим преобразованиям подвергается внутреннее представление программы, а не текст на исходном языке.
Во-первых, операции,3.3.4.1. Машинно-независимая оптимизациянеобходимые для реализации высокоуровневых операций становятся на языкахОсновные преобразования машинно-зависимой оптимизации выполняются длявнутреннего представления программ более явными, что облегчает их обнаружение иотдельных выражений, линейных участков программ, циклов, вызовов процедур иоптимизацию. Например, исходный оператор s=s+a[i]*b[i] скрывает, чтофункций.вычисление адресов для элементов a[i] и b[i] содержит общие подвыраженияОптимизация однократно выполняемых участков программы практически неsizeof(тип)*i. Во-вторых, внутреннее представление может оказатьсяоказывает влияния на быстродействие программы и может сказываться только наотносительно независимым от объектной машины, что делает оптимизатор достаточнообъеме занимаемой программой памяти, поэтому наиболее тщательно всегдаустойчивым к изменениям при переносе на другую машину.оптимизируется самый внутренний цикл программы.
Для проведения оптимизациипрограммыделят на линейныеучастки, то есть на выполняемые по порядку3.3.4.1.Машинно-независимаяоптимизацияпоследовательностиопераций.Линейные участкиимеют одинвыполняютсявход и одиндлявыход.Основные преобразованиямашинно-зависимойоптимизацииЛинейныеучасткиимеютсявлюбойпрограммеичащевсегосодержатотдельных выражений, линейных участков программ, циклов, вызовов процедур ипоследовательности вычислений, состоящие из арифметических выражений ифункций.операторовприсваиванияпеременнымНи одна операцияОптимизацияоднократно значенийвыполняемыхучастков программы.программы практическинелинейногоучасткане может быть выполненачислораз, чем смежныеоказываетвлиянияна быстродействиепрограммыбольшееи можетсказыватьсятолько нас неюоперации.Длялинейныхучастковпроводятсяследующиепреобразования:объеме занимаемой программой памяти, поэтому наиболее тщательно всегдаоптимизируется самый внутренний цикл программы.
Для проведения оптимизации• вычисление выражений из констант на стадии компиляции,программы делят на линейные участки, то есть на выполняемые по порядку• арифметические преобразования,последовательности операций. Линейные участки имеют один вход и один выход.• устранение общих подвыражений (избыточных вычислений),вычислениеадресовдля элементови b[i]содержитобщиеподвыражениявычислениеадресовдля элементовa[i]a[i]и b[i]содержитобщиеподвыраженияsizeof(тип)*i.Во-вторых,внутреннеепредставлениеоказатьсяsizeof(тип)*i.Во-вторых,внутреннеепредставлениеможетможетоказатьсяотносительнонезависимымотобъектноймашины,чтоделаетоптимизатордостаточноотносительнонезависимымот объектноймашины, чтоделает операций,оптимизатордостаточно• удалениененужныхприсваиванийи другихраспространениеустойчивымк изменениямпри переносена другуюмашину.устойчивымк копийизменениямпри переносена другуюмашину.значений,• перестановка независимых смежных участков программ,3.3.4.1.Машинно-независимаяоптимизация3.3.4.1.Машинно-независимаяоптимизация• удаление недостижимых фрагментов программы,Основныепреобразованиямашинно-зависимойоптимизациивыполняютсяОсновныепреобразованиямашинно-зависимойоптимизациивыполняютсядля для• оптимизация вычисления логических выражений.отдельныхвыражений,линейныхучастковпрограмм,циклов,вызововпроцедуриотдельныхвыражений,линейныхучастковпрограмм,циклов,вызововпроцедурифункций.функций.Вычисление выражений из известных операндов (свертка операций)ОптимизацияоднократновыполняемыхучастковпрограммыпрактическиОптимизацияоднократновыполняемыхучастковпрограммыпрактическине невыполняется в случаях:оказываетвлиянияна быстродействиепрограммыи можетсказыватьсятолькооказываетвлиянияна быстродействиепрограммыи можетсказыватьсятолькона наобъемезанимаемойпрограммойпамяти,поэтомунаиболеетщательновсегдаобъемезанимаемойпрограммойпамяти,поэтомунаиболеетщательновсегда• непосредственного использования констант программистом:оптимизируетсясамыйсамыйвнутреннийцикл циклпрограммы.Для проведенияоптимизацииоптимизируетсявнутреннийпрограммы.Для проведенияоптимизацииA=sin(2*3.14*B);программыделятделятна линейныеучастки,то естьна выполняемыепо порядкупрограммына линейныеучастки,то естьна выполняемыепо порядкупоследовательностиопераций.Линейныеучасткиимеютодин одинвход входи одинвыход.последовательностиопераций.Линейныеучасткиимеюти одинвыход.• возникновенияконстант-операндовпослемакрорасширений,Линейныеучасткиимеютсяв любойпрограммеи чащевсеговсегосодержатЛинейныеучасткиимеютсяв любойпрограммеи чащесодержат#definePi 3.1415926последовательностивычислений,состоящиеиз арифметическихвыраженийипоследовательностивычислений,состоящиеиз арифметическихвыраженийиA=sin(2*Pi*B);операторовприсваиваниязначенийпеременнымпрограммы.Ни однаоперацияоператоровприсваиваниязначенийпеременнымпрограммы.Ни однаоперациялинейногоне можетбытьвыполненабольшеечислочислораз, чемс неюс неюлинейногоучасткане можетбытьвыполненабольшеераз, смежныечем смежные•участкавозникновенияконстант-операндовв результатекомпиляцииязыковыхоперации.Дляконструкций,линейныхучастковпроводятсяследующиепреобразования:операции.Для линейныхучастковпроводятсяследующиепреобразования:например, многомерных массивов:••• вычислениеиз константна стадиикомпиляции,• вычислениевыраженийконстантнаc [10][10][10];стадиикомпиляции,intвыраженийa [10][10][10],bиз[10][10][10],арифметическиепреобразования,• арифметическиепреобразования,a [3][4][i] = b [8][3][k] * c [3][2][j];устранениевычислений),• устранение(избыточныхвычислений),a’общих[((3 общих* подвыражений10) +подвыражений4) * 10 + i](избыточных:= b’[((8 * 10)+ 3)* 10 + k] *c’ [((3 * 10) + 2) * 10 + j]; •удалениененужныхи других операций,Компилятордолжен присваиванийвыполнить вычисленияи внестираспространениезаписи о новых4343копийзначений,литеральных константах в таблицу констант, как если бы эти константы были введены• перестановканезависимыхсмежныхучастковалгоритмовпрограмм, свертки принимают восамимпрограммистом.Более сложныеварианты• удалениенедостижимыхфрагментовпрограммы,вниманиеизвестныеим значенияпеременных(например, сразу после присваивания) и•оптимизациявычислениялогическихвыражений.даже функций.