информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Шестой Perl превратится в Raku,... 
 Kik закрывается, все ушли на криптофронт 
 Sophos открывает Sandboxie 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / theory
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[UPD, сглупил] Пример кода, нереализуемого без goto 13.08.07 12:56  Число просмотров: 4779
Автор: Heller <Heller> Статус: Elderman
Отредактировано 13.08.07 17:03  Количество правок: 3
<"чистая" ссылка> <обсуждение закрыто>
Все очень просто:

expr1 goto label2:
somecode1;
label1:
somecode2;
label2:
somecode3;
expr2 goto label1;

Без goto этот алгоритм реализовать невозможно. Это легко доказать.

Будем считать, что нам доступны только операторы if, while и do{}while; можно использовать break. Это стандартный набор - как правило любые другие операторы реализуются через них.

Далее надо заметить, что с помощью if{} переход в обратном направлении кода невозможен, то есть для этого можно использовать только while и do{}while. Для однократного перехода вперед нет принципиальной разницы между while и if (только while потребует дополнительной временной переменной; так что использовать будем if). Тогда приведенный код выше обязан иметь цикл while, содержащий фрагменты somecode2 и somecode3:

expr1 goto label2:
somecode1;
do {
somecode2;
label2:
somecode3;
} while expr2;

Для реализации goto под expr1 необходим блок if, который бы "пронзал" собой блок while, а сделать это невозможно синтаксически. Если мы разорвем цикл while, то у нас без goto опять же никаким образом не получится возврат к коду somecode2.

Конечно, можно много чего придумать. Например, каждый блок снабдить меткой и указывать ее с оператором continue. Извратиться с try b catch. Это решит проблему, но ИМХО читаемости коду не прибавит - уж лучше goto. Если приведенный мной выше пример сделать помасштабнее, добавив большее количество условных переходов и меток, то какой бы структурированный синтаксис мы не придумали, получится очень большой уровень вложенности, что не хорошо.

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

К тому же с точки зрения математического исследования алгоритмов goto - единственно возможный вариант для представления кода в виде графа. Если рассмотреть гипотетическую возможность автоматического создания алгоритмов с помощью ИИ (читайте про автоматическое доказательство теорем), то мы можем получать серьезные полезные алгоритмы, изначально использующие goto и не всегда понятно каким образом и почему работающие. Специально приводить их к синтаксису if/while не будет никакого смысла.

-------------------
[UPD]: В общем, я сглупил, ламо. Все что написано выше не считается =)
Пример кода выше можно реализовать на простых if/while так:

if (expr1) {
somecode1;
somecode2;
}
somecode3;
while (expr2) {
somecode2;
comecode3;
}

Я как-то изначально о таком ходе не подумал, хотя самому достаточно регулярно приходится писать такой код. Однако это никак не оправдывает общественную неприязнь к goto. Я настаиваю на том, что код на goto в самом начале поста куда более легко читаем и при этом более компактен. Более того, в ряде случаев интуитивные рассуждения приводят именно к коду с goto, а не к структурированному коду. Думаю, такие задачи каждому здесь попадались.

В общем из примера выше понятно, что без goto все же можно обойтись в любом случае, и алгоритма, не реализуемого без него не существует. Однако в случае таких перекрестных переходов может потребоваться либо слишком заумный синтаксис, либо слишком много кода потребуется дублировать (в простейшем случае выше объем кода увеличился в два раза, если пример будет несколько более сложным, потери могут быть еще больше).
<theory> Поиск 








Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach