УДК 681.5

ОБЗОР ПРОБЛЕМНЫХ СИТУАЦИЙ В КОДЕ ПРОГРАММ

Антипин Андрей Федорович
Стерлитамакский филиал Башкирского государственного университета
кандидат технических наук, доцент кафедры прикладной информатики и программирования

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

Ключевые слова: многомерный интервально-логический регулятор, оператор, отладка, программное обеспечение, продукционное правило


OVERVIEW OF PROBLEM SITUATIONS IN PROGRAM CODE

Antipin Andrey Fedorovich
Sterlitamak branch of the Bashkir state University
candidate of technical sciences, associate Professor of the Department of applied informatics and programming

Abstract
The article is devoted to the questions of development and debugging of programs containing repeating operators. Shows an overview of problem situations and proposed solution.

Keywords: condition-action rule, debugging, multidimensional interval-logic regulator, software, the operator


Библиографическая ссылка на статью:
Антипин А.Ф. Обзор проблемных ситуаций в коде программ // Современная техника и технологии. 2015. № 2 [Электронный ресурс]. URL: http://technology.snauka.ru/2015/02/5785 (дата обращения: 28.05.2017).

В процессе тестирования, отладки или анализа программ самого разного уровня не редки ситуации, когда в их коде встречаются операторы, которые полностью идентичны и при этом либо следуют друг за другом, либо повторяются через некоторое число операторов. Такие операторы следует трактовать, как повторяющиеся, но нет однозначного ответа на вопрос, что с ними требуется сделать. Необходимо прежде проанализировать содержимое (структуру, составные элементы) таких операторов и только потом принимать решение об их дальнейшем использовании, объединении или удалении [1].

Рассмотрим часто встречающиеся проблемные ситуации в коде программ. Для упрощения понимания все примеры программ приведены на языке Pascal.

1) переменная (логического или числового типа) многократно (n раз) инициализируется на некотором участке (фрагменте) программы без использования ее значения в каком-либо выражении (логическом или функциональном). Например,

a := 5;

b := 7;

a := 8;


a := 9;

В такой ситуации возможны следующие варианты:

а) переменная не связана с каким-либо внешним по отношению к программе параметром и/или базой данных. В данном случае можно утверждать, что первые n –1 инициализаций избыточны и следует оставить лишь последнюю (n) инициализацию данной переменной;

б) переменная связана с каким-либо внешним параметром и/или базой данных. В данном случае невозможно точно утверждать, что какая-либо другая переменная, используемая в выражениях между инициализациями данной переменной, не зависит от ее значения в те или иные моменты времени. Чтобы установить истину надо определить функциональные связи, или зависимости, между всеми переменными на данном участке программы при их объявлении;

в) операторы инициализации следуют один за другим без каких-либо других операторов между ними. В данном случае следует поступить так же, как в п. 1, а), т. е. удалить первые n –1 инициализаций, т. к. иметь вес будет лишь последняя.

2) антецеденты продукционных правил условных операторов полностью идентичны друг другу. Например,

if a > 5 then inc(b);


if a > 5 then dec(c);

В этой ситуации возможны следующие варианты:

а) условные операторы следуют один за другим без каких-либо других операторов между ними. Если переменные, содержащиеся в антецедентах продукционных правил второго и последующих операторов, не содержатся в консеквентах правил первого и предыдущих операторов соответственно, то можно утверждать, что это взаимодополняющие операторы и их следует объединить в один условный оператор. Иначе, это будут разные операторы.

Если операторы, приведенные выше, являются взаимодополняющими, то их объединение будет иметь вид

if a > 5 then

begin

inc(b);

dec(c);

end;

При объединении операторов нужно выполнить проверку на их противоречивость. Если в консеквентах продукционных правил каких-либо операторов выполняется инициализация или изменение значений одинаковых переменных, то эти операторы будут противоречить друг другу и только программист (эксперт) может решить, какое из имеющихся действий следует предпочесть [2];

б) между условными операторами находится n других операторов. Для того чтобы отнести данные операторы к п. 2, а) необходимо выполнение следующих условий:

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

– переменные, включенные в консеквенты правил второго и последующего операторов, не должны использоваться на протяжении всего участка программы между операторами.

3) консеквенты продукционных правил условных операторов полностью идентичны друг другу. Если антецеденты продукционных правил второго и последующего операторов не содержат переменных, значения которых могут меняться на всем промежутке программы между операторами, включая консеквенты их продукционных правил, то такие операторы можно объединить в один условный оператор путем дизъюнкции антецедентов.

Например, операторы

if a > 5 then inc(b);

if a < 9 then inc(b);

можно объединить в один условный оператор

if (a > 5) or (a < 9) then inc(b);

4) предусловия, постусловия или параметры операторов цикла полностью идентичны друг другу. Например,

while a > 5 do (или for i := 0 to 5 do)

begin

end;

while a > 5 do (или for i := 0 to 5 do)

begin

end;

В этой ситуации варианты будут аналогичны п. 2, а) и б).

5) переменные, значения которых изменяются в теле операторов цикла [3], одновременно используются в качестве их параметров (оператор for), в предусловиях или постусловиях (операторы while … do и do … while соответственно).

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

В подобной ситуации необходим строгий контроль над возможными вариантами значений переменных, способных дать начало бесконечному циклу, как, например, в случае

for i := 0 to 10 do

begin

dec(i);

end;

где переменная i на каждой итерации цикла одновременно увеличивает и уменьшает (в процессе выполнения оператора декремента dec(i)) свое значение на единицу.

В ряде случаев бывает полезен анализ значений, которые могут принимать переменные и которые по факту используются в антецедентах правил, что позволит выявить избыточные операторы и своевременно удалить их из программы.

Некоторые из описанных выше ситуаций можно избежать, используя современные версии компиляторов и сред разработки программ. Так, разработчики Pascal ABC и Embarcadero Delphi XE3 установили запрет по умолчанию на компиляцию программы при изменении в теле операторов цикла их параметров, как в примере, приведенном в п. 5.

В то же время следующий код в Pascal ABC (версия 2.0, сборка 529) и Embarcadero Delphi XE3 (version 17.0.4770.56661) был откомпилирован без ошибок:

i := -1;

while i < 0 do

begin

i := i – 0;

end;

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

Все перечисленные ситуации объединяет одно – это необходимость в разработке методов и/или правил, которых необходимо придерживаться для создания семантически верного программного кода. Автором предлагается использовать в процессе разработки программ методику анализа структуры многомерного интервально-логического регулятора (МИЛР), отличительной особенностью которого является [4, 5] строгое задание на начальном этапе проектирования системы автоматического регулирования интервалов значений, которые могут принимать переменные-параметры в процессе эксплуатации, что дает возможность просчитать все возможные ситуации и выявить повторяющиеся, взаимодополняющие или противоречащие друг другу операторы. Семантический анализ программ МИЛР при этом выполняется автоматически при помощи специального программного обеспечения [6].


Библиографический список
  1. Антипин А.Ф. Вопросы автоматизации семантического анализа программ // Автоматизация, телемеханизация и связь в нефтяной промышленности. 2014. № 7. С. 26–30.
  2. Антипин А.Ф. Сравнительный анализ быстродействия дискретно-логического регулятора // Программные продукты и системы. 2010. № 1. С. 75–77.
  3. Степашина Е.В., Мустафина Е.А. Численный алгоритм уточнения механизма химической реакции DRGEP-методом // Журнал Средневолжского математического общества. 2011. Т. 12. № 3. С. 122.
  4. Антипин А.Ф. Способ анализа программного кода автоматизированной системы управления технологическими процессами // Автоматизация, телемеханизация и связь в нефтяной промышленности. 2013. № 10. С. 21–25.
  5. Антипин А.Ф. Системы управления технологическими процессами на базе многомерных логических регуляторов // Автоматизация и современные технологии. 2014. № 1. С. 12–18.
  6. Антипин А.Ф. Об одном способе анализа структуры многомерного четкого логического регулятора // Прикладная информатика. 2012. № 5. С. 30–36.


Все статьи автора «Антипин Андрей Федорович»


© Если вы обнаружили нарушение авторских или смежных прав, пожалуйста, незамедлительно сообщите нам об этом по электронной почте или через форму обратной связи.

Связь с автором (комментарии/рецензии к статье)

Оставить комментарий

Вы должны авторизоваться, чтобы оставить комментарий.

Если Вы еще не зарегистрированы на сайте, то Вам необходимо зарегистрироваться: