Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инт.среды.docx
Скачиваний:
89
Добавлен:
10.06.2015
Размер:
180.16 Кб
Скачать

5.2.7. Сопровождение

Можно выделить следующие основные группы инструментов, используемых при сопровождении программ:

  • связанные с технической стороной сопровождения (трансляторы, отладчики, системы управления версиями текстов и т. п.). Поскольку сопровождение представляет мини-модель жизненного цикла, то инструменты, применяемые во всех процессах жизненного цикла, могут понадобиться и здесь;

  • связанные с анализом и пониманием кода. Это специальные средства реинжиниринга и обратной инженерии. Также сюда мы относим средства восстановления спецификаций, конверторы и другие системы;

  • связанные с организационной стороной сопровождения. Эти средства дают возможность выполнения административных функций (например, ведения базы данных ошибок) сопровождающему программный продукт.

5.2.8. Завершение эксплуатации

Основная группа систем данного процесса - это системы деинсталляции. Такие системы выполняют действие, обратное действию инсталляции, и, как правило, входят в инсталляционный пакет.

5.3. Универсальный инструментарий

Напомним, что в этом разделе под универсальностью инструментария будем понимать возможность его применения в нескольких процессах

5.3.1. Инструменты работы с текстом

Существующие на сегодняшний момент системы можно подразделить на несколько классов. Так, некоторые из них используются как простые средства для обработки текстов, другие же представляют собой мощные автоматизированные программные комплексы. В этом разделе перечислены наиболее значимые из них.

5.3.1.1. Средства, базирующиеся на регулярных выражениях

Развитыми средствами определения шаблонов и осуществления поиска являются средства семейства grep в операционной системе Unix. Как grep, так и egrep могут искать участки текста, используя регулярные выражения. Наряду со специальными утилитами используются механизмы, встроенные в некоторые языки обработки текстов, например Perl (http://www.perl.org/).

Эти средства используют текстовый поиск и в них не заложена семантика входного текста. А значит с их помощью нельзя отличить поиск по регулярным выражениям в произвольном тексте от поиска в исходном тексте программ. Можно провести аналогии с использованием архивирующих систем: те из них, которые предназначены для архивации текста, будут обладать гораздо меньшей эффективностью для архивации потоков звука и видео, и наоборот. Поэтому такие средства обладают рядом ограничений.

  • Написание конкретного шаблона для поиска в исходном тексте может быть затруднительным, а иногда и невозможным. Например, пусть требуется локализовать два последовательных оператора цикла: цикл типа for, следующий за циклом типа while, причем оба с произвольными условиями и блоками операторов, на одном и том же уровне вложенности. Возможная спецификация для grep может быть такой: .*while.*for. Однако такая спецификация grep отыщет не только последовательные операторы цикла, но и вложенные. Дополнительно будут найдены такие последовательные операторы, которые непосредственно не следуют друг за другом. Кроме того, оба требуемых ключевых слова могут оказаться в комментарии.

  • Вторая проблема, связанная с использованием grep, заключается в написании шаблонов для отыскания деклараций. Рассмотрим написание шаблона для поиска декларации целой переменной х и символьной с. Поскольку порядок деклараций на одном и том же уровне вложенности в большинстве случаев не столь важен, они могут оказаться в любом порядке в исходном тексте. Поэтому для отыскания, например, двух деклараций с помощью регулярных выражений надо применять конструкцию такого вида: (.*int[ ]*x[ ]*;.*char[ ]*c[ ]*;) | (.*char[ ]*c[ ]*;.*int[ ]*x[ ]*;). Сложность же такой спецификации для более чем двух отыскиваемых деклараций очевидна. Если в исходном тексте была декларирована инициализированная целая переменная (int x=0;), то поиск для нее окажется неудачным в любом случае.

  • Третья проблема, которая может возникнуть при использовании средств семейства grep, связана со специальными символами. Обычно эти средства воспринимают символ "новая строка" как разделитель даже тогда, когда мы ищем выражение в многострочном контексте. Это особенно мешает поиску в исходном тексте, поскольку зачастую предмет поиска охватывает несколько строк. К тому же необходимость постоянно учитывать разделители (пробелы, символы "новая строка", символы табуляции) затрудняет составление регулярных выражений.

Регулярные выражения для поиска по шаблонам используются в утилитах ed, sed, awk и perl:

  • ed и sed являются текстовыми преобразователями. Они позволяют находить и заменять фрагменты, базируясь на регулярных подвыражениях (в случае sed - многострочных). Они тоже воспринимают входной текст как поток символов, что некорректно;

  • awk воспринимает входной текст как набор записей, и, несмотря на то, что это уже более подходящая абстракция, нежели символ, она все же не адекватна в применении к программному тексту. Семантически разные части могут оказаться в одной записи. Например, for (i=0;i<5,-i++) { - это все одна запись;

  • perl, в частности версии 5, обладает более широким механизмом регулярных выражений, но даже и они остаются не столь удобными для поиска в исходном тексте программы, поскольку не учитывают его особенности.