И. Соммервилл - Инженерия программного обеспечения (1133538), страница 149
Текст из файла (страница 149)
Преобразование исходного кода программ Самый простой способ реинжениринга программ- зто зрггомвтичсский перевод исход. ного кода с одного языка программирования на другойв болеечсовременный, При этом структура и орпшнэзция программ остаются неизменными. Программа может переводиться как на обновленную версию исходного языка (например, с языка СОВОЬ74 на язык СОВО1: 85), так и на другой "не родственный" язык (например. с языка г ОВТВАХ на С).
Причины перевода на другой язык могут быть следующие. 1. Облоагелие лгажформм алларагллмх средсом. В организации может быть принято решение по изменению аппаратной платформы. Новые аппаратные средства могут не поддерживать компиляторы исходного языка программ. 2.
У)гдосзшчип квллифицироеллггого ле)гсолала. Бывает, что для сопровождения программ на исходном языке невозможно найти достаточно квалифицированный персонал, особенно это касается программ, написанных на специфических языках, давно вы. шедших из употребления. 3. Излечения лаеижики организации. Органиэация может принять решение о переходе на общий стандартный язык программирования, чтобы снизить затраты на сопровождение программных систем, поскольку сопровождение большого количества версий старых компиляторов невыгодно. 574 т4асть эП. Эволюция программного обеспечения 4.
Нгдосэюточло сучдсэы яоддержки сэифого ПО. Поставщик компиляторов для старого языка программирования может уйти с рынка программных продуктов или прекратить поддержку своего продухта. Процесс перевода исходного кода программ показан иа рис. 28.4. Преобразование ис. ходного кода будет эффективным только тогда, когда есть возможность выполнить основной перевод автоматически. Это может сделать либо специально созданная программа, либо коммерческал программа по конвертированию кода с одного языка в другой, либо система сопоставления с образцом. В последнем случае нужно создать список команд для описания перевода с одного лзыкового представления па другое. Параметризированные образцы исходного языка подвергаются сравнению н сопоставлению с такимн же образцами в новом языке.
Рэс. 28,4. уурокгсс лумобрлзовпнил лрофлтм В некоторых случаях автоматизированный перевод становится невозможным. Структурные компоненты исходного кода моПт не иметь соответствия в новом языке. Одна из причин этого в толк что исходный язык может содержать встроенные условные команды компиляции, которые не поддерживаются в новом языке. В такой ситуации придется на.
стран вать и совершенствовать создаваемую систему вручную. 28.2. Анализ систем Цель такого анализа — воссгановление структуры и спецификации системы. Этот про. цесс нс подразумевает изменения программ. Входными данными процесса анализа обыч. ио служит исходный код системы. Однако зачастую даже он недоступен, тогда процесс анализа начинается с исполняемой программы.
Анализ систем не тождсственеп реинженирингу систем. Целью анализа является определение архитскгуры и спецификации системы па основе ее исходного кода Целью реинжениринга можно назвать создание усовершенствованной и удобной в сопровождении системы. По, как показано па рис. 28.2, анализ системы может быть составной частью процесса реинжениринга. Схема процесса анализа системы приведена иа рис. 285. Вначале с помощью автоматизиро. ванных срслств проводится анализ струкгуры системы. В большинстве случаев этого недостаточно для воссоздания систслшой архитектурьс Треб>ется дополнительная работа с исходным кодом системы н с моделью ее структуры. Эта дополпительнал информация сравнивается с данными, собранныьщ во времл автоматического анализа системы, и представляется в виде ориентированного графа, отображающего связи в исходном коде программ.
28. Реинжениринг программного обеспечения 575 Рис 28.5. Про!гесс аяалкза спплак Репозиторий системной информации служит лля сравнения структуры графа и кода. На основе ориентированного графа можно пол)чить такие документы, как схемы структуры программ и данных, а также матрицы зависимостей. Матрицы зависимостей показывают места определения в програл~лгах системных объектов и ссылки на них, Процесс разработки локументацни повторлющийся, так как информация о системной структуре используется для дальнейшего уточнения информации, которал хранится в системном репозитарии. В процессе анализа полезны разные срсдсува просмотра программ, которые предос. тавляют раэлнчныс системы представления программ и позволяют легко перемещаться по исходному коду.
Например, с их помощью можно найти определения ланпых, а затем переместиться по коду к месту их использования. Описание некоторых подобных систем просмотра программ можно найти в (73, 2б8, 257). После создания документации но системной архитектуре, в рспозиторий вводится ло. полнительная информация, поэволяющал воссгановить системную спецификацию. Также обязательно ручное описание структуры системы. К сожалению, спецификацию невозможно создать автоматически из модели системы.
28.3. Совершенствование стр)ууцРуры программ Если в процессе эксплуатации наследуемой систелгы возникла необходимость оптимизировать использование памяти и имеютсл проблемы с пониманием того, как она работает, это означает, что система плохо структурирована. Управляющая структура наследуемых систем обычно значительно усложнена множеством безусловных переходов н нечеткой логикой программного кода.
Регулярное сонровоящеинс системы также нс способствует сохранению системной структуры. После частых изменений некоторые фрагменты кода становятся неиспользуемыми, однако это можно обнаружить только по. еле тгнательного анализа программы. В листинге 28.1 показан пример того, как усложненная логика >правления может сделать трудной для понимания достаточно простую программу. Программа написана на языке, подобном РОВТВЛМ, который часто использовалсл длл созданил программ такого рода. Программа нс стала понятнее даже после того, как я дал переменным осмысленные имена. Это программа управления обогрсвателсм.
Панельный переключатель имеет по. ложения Оп (Включено), 0(( (Выключено) и Соп(го((еб (Ре~улирование). Если система находится в режиме регулирования, она включается или выключается в зависимости от тсрмореле и установок таймера. Если обогреватель включен, перекзючатсль Зв)гсйч1еаг(пд выключает его, н наоборот. 576 'Хвать УП. Эволюция программного обеспечения Как правило, такая сложная логическая структура, как в коде листинга 28.1, образуется после внесения изменений в процессе сопровождения. Реализуя новые условия или связанные с ними действия, забывают об изменении структуры программы'. Не задумываясь о перспективе, этот путь можно назвать кратчайшим и менее рискованным, так как он снижает вероятность возникновения большого количества ошибок в системе.
Если же подумать о будущем, это решение приведет к трудному для понимания коду. Сложная структура кода может также появиться от желания программистов избежать дублирования кода. Ра. нее, когда на программы накладывалось требование ограничения памяти, это бьшо обязательным условием. Листинг 28.1. Программа с нечеткой логикой ягагг: дег (Тгше-оп, ТЕше-оЕЕ, Тиае, яесггпд, Тешр, яы1гсп) ЕЕ яыЕссп = оЕЕ досо оЕЕ ЕЕ Яызгсй -" оп дого оп досо Спгг1д оЕЕ: ЕЕ неасЕпд-всаспв оп досо зы-оЕЕ досо 1оор оп: ЕЕ неас1пд-всаспв = оее досо зы-ог1 досо 1оор Спгг18п ЕЕ Тиае = ТЕше-оп дого оп ЕЕ Тыве = Тыве-оЕЕ дого оЕЕ ЕЕ тЕше < ТЕше-оп дого Ягагг Ее типе > т1ше-оее досо зсагс 1Е Тешр > яеССЕпд СЬеп дого оЕЕ ЕЕ Тешр < ЯеССЕпд Спеп досо оп Яы-оЕЕ: неасзпд-всаспв := оЕЕ дого ЯыЕСси я<-оги неасгпд-всасцв := оп зыгссуи яыгссь-ьеасЕпд 1оор: дого Згагг В листинге 28.2 приведена та жс салгая программа, переписанная мной с использованием структурированных управлшбвгих конструкций.
Три положения переключателя (Оп, Ой и Соп(го((еб) четко о%рсдсгеЪы и связаны с соответствующим кодом. Язык (зта не был использован при написании этой программы потому, что исходная программа не являлась объектно. ориентированной. Листинг 28.2. Структурированнан программа 1оор -- пес получает значения переменных нэ окрувення снстеыы Дег (Тгше-оп, ТЕше-оЕЕ, Тгше, Яегс1пд, Тешр, Яы1гсЫ саве Яы1ссп ос ыпеп Оп => ЕЕ Невзгод-эгагпв = оЕЕ Спев Зы1сс(г-Ьеас1пд ; неасгпд-всасчв := оп епб ЕЕ наев ОЕЕ-"> зс НеаСЕпд-вгаспв = оп Ваап ЯыЕСсп-ЬеаГЕпд ; НеаСЕпд-всаспв :=оЕЕ епб ЕЕ наев Сопгго11ес( => зЕ Тгше >= ТЕше-оп апб Тгше <= ТЕше-оЕЕ Феп ее тешр > зессгпд еп<( неасЕпд-всасчв = оп Фьеп Зы1ссЬ-Ьеас1пдг неасЕпд-всагпв = оЕЕ е1вм тешр < яесг1пд апб неас1пд-всаспв оее сьев 28.
Реинжениринг программного обеспечения 572 Ямгссп-Ьеас1пдг Неавзпд-эеаепэ := оп епб зк епб зк епп паве еЫ 1оор В процессе реструктуризации программ можно также упрощать сложные условные операторы. В лисгинге 28.3 показан пример упрощения условного оператора, содержащего логический оператор отрицания по(. Листинг 28.3. Упрощение услоиия — Сложное условие 12 пок (д > В апс( (С < (З ок пок (8 > Г1 1 1.. — Упрощенное условие 12 д <= В еп6 (С <= (З ок Е > Г) В известной работе [80) доказано, что любую программу можно переписать с помощью простых условных операторов 1(-1((еп-е(ве и циклов а(з((е-1оор, при этом можно исключить все безусловные операторы перехода. Эта теорема является основой автоматической реструктуризации программ. Зтапы такого преобразования программ показаны иа рис. 28.6.
Сначала программа представляется в виде ориентированного граф, после чего создастся структурированная программа без использования операторов перехода. ркс 28.б. Аетоятпичеснпя [мструктуризлвкя я[кирами Созданный ориентированный граф показывает поток передачи управления в программе. К этому графу применяются методы упрощения и преобразования, в результате чего находятся и устраняются неиспользуемые части кода.