OberonCore
https://forum.oberoncore.ru/

HALT-стопор при отсутствующем ELSE
https://forum.oberoncore.ru/viewtopic.php?f=82&t=3484
Страница 1 из 2

Автор:  Евгений Темиргалеев [ Вторник, 14 Июнь, 2011 10:21 ]
Заголовок сообщения:  HALT-стопор при отсутствующем ELSE

Когда идёт последовательный отбор всех предполагаемых вариантов IF ... ELSIF ... и ветка ELSE в них не входит, нужно вручную ставить стопор, типа HALT(100).
Код:
ASSERT((a IN {0..1}) & (b IN {0..1}), 20);
IF (a = 1) & (b = 1) THEN
  ...
ELSIF (a = 0) & (b = 1) THEN
  ...
ELSIF (a = 1) & (b = 0) THEN
  ...
ELSE (* прочие варианты не предполагаются по логике программы *)
  HALT(100)
END
15.06.11: уточнил пример по обсуждению ниже

Это как-то порекомендовал Info21 --- решил попробовать. Не могу сказать, чтобы ставил везде, но в важных местах ставил.

Сегодня один стопор сработал. От момента исключения (вываливания трапа) до исправления ошибки прошло 30 минут. Без него не известно, сколько бы пришлось возиться и искать --- от чего то, что должно делаться, в определённый момент --- не делается. И то, только после того, как факт неделания обнаружился бы при использовании --- сразу бы этого не произошло.

Теперь буду везде ставить. Собственно, это ничем (кроме ручной писанины) не отличается от CASE и WITH без ELSE.

Автор:  Info21 [ Вторник, 14 Июнь, 2011 11:01 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Евгений Темиргалеев писал(а):
Теперь буду везде ставить. Собственно, это ничем (кроме ручной писанины) не отличается от CASE и WITH без ELSE.
Да, у меня давно свербит на эту тему.
Трактовка ELSE у IF должна быть единообразной.

Автор:  Сергей Губанов [ Вторник, 14 Июнь, 2011 12:03 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Может лучше HALT(126)?

Programming Conventions писал(а):
Free 0 .. 19 use for temporary breakpoints
Preconditions 20 .. 59 validate parameters at procedure entry
Postconditions 60 .. 99 validate results at procedure end
Invariants 100 .. 120 validate intermediate states (detect local error)
Reserved 121 .. 125 reserved for future use
Not Yet Implemented 126 procedure is not yet implemented
Reserved 127 reserved for future use

Автор:  Евгений Темиргалеев [ Вторник, 14 Июнь, 2011 12:14 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Сергей Губанов писал(а):
Может лучше HALT(126)?
Не согласен. Тут именно нарушение инварианта, а не недореализованность.

Автор:  Сергей Губанов [ Вторник, 14 Июнь, 2011 16:07 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Нарушение инварианта из-за недореализованности?

Автор:  Евгений Темиргалеев [ Вторник, 14 Июнь, 2011 17:13 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Нарушение инварианта из-за ошибки в программе.
Код:
CASE x OF
1:
2:
3:
END
Тоже самое, если тут трэпанёт invalid case при x=4

Автор:  ilovb [ Вторник, 14 Июнь, 2011 17:27 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

А разве в CASE это не компилерная заморочка? Там это ошибка, т.к. таблица переходов...

Автор:  Евгений Темиргалеев [ Вторник, 14 Июнь, 2011 17:33 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Это охрана от логической ошибки. Когда программист думает, что предусмотрел все случаи, а на деле выходит не так.

С проверкой индексов ровно тоже.

viewtopic.php?f=6&t=2284

Автор:  QWERTYProgrammer [ Среда, 15 Июнь, 2011 01:41 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Евгений Темиргалеев писал(а):
Это охрана от логической ошибки. Когда программист думает, что предусмотрел все случаи, а на деле выходит не так.

Напомнило философское рассуждение авторов известного написанного на ББ прикладного пакета OpenBUGS о сложностях дебаггинга в сложных ОО-системах: Lunn, D., Spiegelhalter, D., Thomas, A. and Best, N. (2009) The BUGS project: Evolution, critique and future directions

Цитата:
One downside of object-orientation in systems as complex as BUGS is that it can make debugging
somewhat difficult. In more traditional programming settings, there would typically be some kind
of master program specifying a list of commands to be executed in sequence. A debugger can
then be implemented to step through each command in turn and provide current information on
parameters of interest. In contrast, objects are generally designed only to make/respond to various
requests of/from other objects—they have little or no concept of the order in which external events
occur. Consequently, an object-oriented program typically behaves as a complex chain-reaction
and the path back to the source of any error may be extremely convoluted. This can make for
indecipherable error messages, error messages that have nothing to do with the actual error, and
impenetrable ‘trap’ windows, all of which even the developers of the software sometimes struggle
to understand. For example, an ‘undefined real result’ trap lists the sequence of ‘function calls’ that
led to some impossible calculation, such as the square root of a negative number. The calculation
in question may have been attempted by an updater object trying to evaluate some function of
interest. To figure out what the updater was trying to do, which node it was dealing with at the time,
what the current values of that node and those in its Markov blanket are, and why these might have
led to some inconsistency (even if it were that simple), just from a list of function calls and the
current values of some ‘internal’ parameters, is a challenge indeed. As developers of the software
we have access to special tools for probing these ‘traps’ for more information but it can still be
difficult sometimes. It has been particularly difficult to fix any of these traps, or replace them with
more meaningful error messages, since they represent unanticipated errors—things that were not
meant to go wrong—it is virtually impossible to get hold of enough contextual information to
provide a message that might be of some use to the user.

Возникает подспудное подозрение, что проблеме охраны от нарушения инвариантов авторы таки уделили недостаточно внимания:-(

Автор:  Info21 [ Среда, 15 Июнь, 2011 13:08 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

QWERTYProgrammer писал(а):
Возникает подспудное подозрение, что проблеме охраны от нарушения инвариантов авторы таки уделили недостаточно внимания:-(
Почему подспудное?

Громоздить объектные иерархии -- очень естественное и увлекательное ("приматическое") занятие, опережающее всё остальное, откуда и проблемы.

Автор:  Владислав Жаринов [ Четверг, 16 Июнь, 2011 19:44 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Евгений Темиргалеев писал(а):
Нарушение инварианта из-за ошибки в программе.
Код:
CASE x OF
1:
2:
3:
END
Тоже самое, если тут трэпанёт invalid case при x=4
Интересно, это как-нибудь коррелирует с проверкой на y2=4 в схеме Автомата 1 на этом рисунке? :)

Автор:  Валерий Лаптев [ Четверг, 16 Июнь, 2011 19:50 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Кстати, еще один обязательный паттерн. Наряду с паттернами циклов - это паттерн ветвления. Буду первачкам втулять... :)

Автор:  Евгений Темиргалеев [ Пятница, 09 Декабрь, 2011 13:44 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

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

Автор:  Сергей Прохоренко [ Пятница, 09 Декабрь, 2011 18:01 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Евгений Темиргалеев писал(а):
Для статистики: второпях клепания, поставленный на автомате стопор помог обнаружить логическую ошибку при первом промежуточном тестировании.


Ценная вешь! В структурном редакторе она должна быть "по умолчанию".

PureBuilder писал(а):
Ветвь else обязательна. По умолчанию она генерирует сигнал отказа... Программист при желании может заменить генерацию сигнала отказа на иное действие.

Автор:  Евгений Темиргалеев [ Пятница, 09 Декабрь, 2011 21:42 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Сергей Прохоренко писал(а):
PureBuilder писал(а):
Ветвь else обязательна. По умолчанию она генерирует сигнал отказа...
Есть один момент: пока я на практике сталкивался с необходимостью ставить стопор в многоветочном IF (есть ELSIF).

Если же речь идёт о простом одноветочном типа IF x < 0 THEN x := -x END, обязательный ELSE может быть излишен...

Автор:  Сергей Прохоренко [ Пятница, 09 Декабрь, 2011 22:13 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Евгений Темиргалеев писал(а):
Сергей Прохоренко писал(а):
PureBuilder писал(а):
Ветвь else обязательна. По умолчанию она генерирует сигнал отказа...
Есть один момент: пока я на практике сталкивался с необходимостью ставить стопор в многоветочном IF (есть ELSIF).

Если же речь идёт о простом одноветочном типа IF x < 0 THEN x := -x END, обязательный ELSE может быть излишен...


Согласен. Речь идет о многоветочном IF.

Автор:  Trurl [ Суббота, 10 Декабрь, 2011 09:37 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Валерий Лаптев писал(а):
Кстати, еще один обязательный паттерн.

Ну да. К "циклу Дейкстры" добавился "выбор Дейкстры".

Автор:  Валерий Лаптев [ Суббота, 10 Декабрь, 2011 11:16 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Trurl писал(а):
Валерий Лаптев писал(а):
Кстати, еще один обязательный паттерн.

Ну да. К "циклу Дейкстры" добавился "выбор Дейкстры".

Собственно, у него он и был в Дисциплине программирования определен.

Автор:  Владислав Жаринов [ Понедельник, 12 Декабрь, 2011 08:48 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Это имеется в виду "if-fi" (как в Promela)?..

Автор:  Валерий Лаптев [ Понедельник, 12 Декабрь, 2011 08:57 ]
Заголовок сообщения:  Re: HALT-стопор при отсутствующем ELSE

Владислав Жаринов писал(а):
Это имеется в виду "if-fi" (как в Promela)?..

Да.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/