(решено) GoTo или repeat until?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 13:39:58

vitaly_l,
википедия писал(а): Вечный двигатель первого рода — устройство, способное бесконечно совершать работу без затрат топлива или других энергетических ресурсов. Согласно закону сохранения энергии, все попытки создать такой двигатель обречены на провал. Невозможность осуществления вечного двигателя первого рода постулируется в термодинамике как первое начало термодинамики.
Вечный двигатель второго рода — машина, которая, будучи пущена в ход, превращала бы в работу всё тепло, извлекаемое из окружающих тел. Невозможность осуществления вечного двигателя второго рода постулируется в термодинамике в качестве одной из эквивалентных формулировок второго начала термодинамики.


Добавлено спустя 1 минуту 56 секунд:
Хотя я встречал более мягкую формулировку для ВД 2 рода.

Добавлено спустя 2 минуты 23 секунды:
vitaly_l писал(а): когда упоминают страшного и коварного: BSODa.


Настоящий программист не боится Синего Экрана... подумаешь, система склеила ласты.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 14:00:23

Лекс Айрин писал(а):будучи пущена в ход, превращала бы в работу всё тепло, извлекаемое из окружающих тел.

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

Лекс Айрин писал(а):подумаешь, система склеила ласты.

Ого... значит:
GoTo - это инструмент для настоящих программистов?!
В хокей(GoTo) - играют только настоящие программисты?!
Художники хотят освоить хокей из GoTo... Конструкции из GoTo - проще придумывать... но проверять сложнее...

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение vada » 07.09.2015 14:06:25

Есть еще существенный недостаток GOTO. Он отражен в науке (о правильности программы). Небольшой такой раздел кибернетики.
Не буду вдаваться в теоремы и аксиомы, ибо, большинство их за 30 лет забыто, но кое-что помню:
1) Программный блок считается правильным если на вход ему поданы правильные данные и на выходе получены правильные данные.
2) Из первого следует что у блока должен быть один вход и один выход (GOTO нарушает это правило).
Надеюсь, что все знают про юнит тестирование кода? Так вот это тестирование служит для доказательства правильности программы.
Юнит тестирование считается завершенным если тесты прошли по ВСЕМ ветвям кода. Если это не так, то программы нельзя считать правильной.
Код с конструкцией GOTO нельзя гарантированно протестировать юнит тестами. От сюда следует что программа с GOTO не может быть правильной.

Ну это все теоретические всяческие выкладки. Практически юнит тесты не спасают от ошибок, но это ошибки уже другого рода.
Это уже ошибки в ДНК постановщиков и программистов :)

Если вы хотите иметь заведомо неправильную программу, пользуйтесь GOTO.

Да! Еще одну аксиому приведу:
Каждая программа имеет хотя бы одну ошибку.
:)
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 14:15:00

vitaly_l писал(а):GoTo - это инструмент для настоящих программистов?!

Да нет. Настоящий программист не должен этого допускать.

vitaly_l писал(а):Художники хотят освоить хокей из GoTo... Конструкции из GoTo - проще придумывать... но проверять сложнее...


А хоккей на костылях не хотят?

Как раз проще использовать все доступные конструкции... иначе очень тяжело пробираться через забот из меток. Не знаю как Вы, а я привык думать на используемом ЯВУ.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 14:40:54

vada писал(а):От сюда следует что программа с GOTO не может быть правильной.

Лекс Айрин писал(а):Настоящий программист не должен этого допускать.


Лады, 100% убедили! К моему счастью, я только в одной функции попробовал пользоваться GoTo и тут же спросил про возможные проблемы на этом холиваре. И громадное спасибо всем, т.к. я получил исчерпывающе доказательства!

Таким образом посовещавшись, художники, кассационную жалобу программистов на действия GoTo в отношении программ рассмотрели и постановили:
1) На территории художников - оператором GoTo пользоваться отныне и навсегда запрещено, т.к. у художников отсутствуют инструменты проверки работы программ использующих GoTo.
2) Переделать функцию, в которой использован оператор GoTo.
3) Аргумент Лекс Айрин "Настоящий программист не боится Синего Экрана... подумаешь, система склеила ласты." - признать незаконным и провокационным.

Холивар Кассационной инстанции окончен. Желающие вправе похоливарить на данную тему в НаиВысшем холиваре у художников, в продолжение данного топика. ВСЕМ БОЛЬШУЩЕЕ СПАСИБО!
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 14:48:05

vitaly_l писал(а): Аргумент Лекс Айрин "Настоящий программист не боится Синего Экрана... подумаешь, система склеила ласты." - признать незаконным и провокационным.


согласен со вторым, но не с первым.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 14:53:25

Лекс Айрин писал(а):согласен со вторым, но не с первым.

Аргумент не признан, для открытия НаиВысшего холивара в отношении операторов: GoTo и repeat until. В НаиВысшем холиваре отказано, т.к. Лекс Айрин не подготовился и не предоставил в холивар вкусные: печеньку или орешек в виде полезной информации. А информацию про склеивание ласт - художники уже переварили и давно уже не боятся страшного и коварного BSODa.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 15:02:44

vitaly_l, а сама информация о наличии такой возможности? Вообще, Синий экран возникает даже тогда, когда, по идее, система может переварить ошибку. Но программистам "самой любимой компании" проще аварийно завершить работу системы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 15:08:24

Лекс Айрин писал(а):система может переварить ошибку

То есть, можно отловить коварного BSODa и вырубить программу, а не систему? А как? try? Но выше говорилось что try BSODa - не остановит. Там же сбой файловой системы. Правильно?
Последний раз редактировалось vitaly_l 07.09.2015 15:23:49, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 15:23:29

vitaly_lможно даже, если правильно все сделать, продолжить выполнение программы.. но только если не порушены системные структуры.
И вот как раз обработчик ошибок и должен выполнять действия не допускающие этого... ну или корректно завершить программу, если нет смысла в дальнейшем выполнении (структуры данных программы нарушены до невосстановимого состояния). К сожалению, многие программисты пользуются данным механизмом неправильно. Они просто замыкают ошибку, но не выполняют действий по исправлению ситуации.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 15:34:02

Лекс Айрин писал(а):выполнять действия не допускающие этого

ну это, легко сказать, однако мудрый vada уверяет что, нет программы, в которой отсутствует хотя-бы одна ошибка.
Лекс Айрин писал(а):корректно завершить программу, если нет смысла в дальнейшем выполнении (структуры данных программы нарушены до невосстановимого состояния)

А как определить что, структура программы нарушена? Ну например, при обнаружении шибки в except: можно выйти "без сохранения"... типа halt(); чтобы не попортить рабочие установки программы (если они делаются при выходе из программы) и обрабатываемый файл. Сама же программа на диске не перепишется. С другой стороны, если программа свалит систему, а система не сможет потом себя реанимировать... вот тогда "уя" как страшно. Но я уже признал, эти аргументы. Поэтому НаиВысший холивар не могу открыть. Нужна реальная информация про GoTo и repeat until, доказывающая, что GoTo полезен, т.к. он признан запрещённым к использованию.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение Лекс Айрин » 07.09.2015 16:16:37

vitaly_l писал(а): однако мудрый vada уверяет что, нет программы, в которой отсутствует хотя-бы одна ошибка.


это не мешает предпринимать шаги по их исключению.
vitaly_l писал(а):А как определить что, структура программы нарушена?


это должен делать обработчик.

vitaly_l писал(а): можно выйти "без сохранения"... типа halt();


А кто говорит, что это "без сохранения"? Корректно написанная программа сохраняет все, что можно и восстанавливает до чего дотянется даже падая. Это тоже обработчик. И, судя по тому, что СЭС я в программе написанной на паскале еще не видел... этот механизм работает хорошо.

vitaly_l писал(а): Нужны реальные доказательства и информация про GoTo и repeat until.


Вам уже дали практически всю инфу по данному вопросу. Тем более, что именно ВЫ хотели знать о чем-то что портит аппаратуру и/или ось. Вам данная инфа предоставлена... а после этого вы говорите "Фи! Это не куртуазно!"

А насчет BSODа... просто не надо его бояться. Нужно понимать, что это нормальное явление.поймите, что рискованные шаги типа перепрыгивания из процедуры в процедуру почти закономерно приведут к ошибке... если это, например, драйвер, то и до "Высшей Справедливости" недалеко.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: (решено) GoTo или repeat until?

Сообщение vitaly_l » 07.09.2015 16:48:21

Лекс Айрин писал(а):Вам уже дали практически всю инфу по данному вопросу.

И что же, у программистов для Карлсона, не осталось, ни капельки - вкусного малинового варенья?

Лекс Айрин писал(а):Фи! Это не куртуазно! Вам уже дали практически всю инфу по данному вопросу.


Отвечу словами Карлсона:

Ну нет, это я не ем — один пирог и восемь свечей. Лучше так — восемь пирогов и одна свечка!

Какой же ты всё-таки гадкий!
Мне ничего не надо. Только, может быть, гору шоколада, какой-нибудь торт огромный, и пребольшой-большой кулёк конфет, и всё!!!…
Слушай, ты же забыл варенье! И конфеты ты же оставил!

Как же так? Ботинок есть, а ребёнка в нём нет.
Так это вы таскали мои плюшки!?
Это я шалю. Ну, то есть балуюсь...


Оспорить решение художников можно только предоставив обоснованную информацию в защиту GoTo. И баста! Он улетел, но обещал вернуться!

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) GoTo или repeat until?

Сообщение hinst » 07.09.2015 17:05:36

GoTo нельзя
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: (решено) GoTo или repeat until?

Сообщение скалогрыз » 07.09.2015 17:10:06

vitaly_l писал(а):этот ассемблер - мне более понятен

о! так ты ассемблер знаешь! тогда я тебе скажу, такую вещь.
Repeat Until более экономный чем Goto при той же реализации. И экономный repeat-until на как минимум на одну инструкцию.
Например
Код: Выделить всё
  i:=1;
  repeat
    inc(i);
  until i=10;

и
Код: Выделить всё
  i:=1;
  loop: 
    inc(i);
  if i<10 then goto loop;

для repeat until ассемблер таков
Код: Выделить всё
; [5] i:=1;
      mov   word ptr [ebp-4],1
   ALIGN 4
@@j7:
; [7] inc(i);
      inc   word ptr [ebp-4]
; [8] until i=10;
      mov   ax,word ptr [ebp-4]
      cmp   ax,10
      je   @@j9
      jmp   @@j7
@@j9:
; [9] end;

а для goto такой
Код: Выделить всё
; [16] i:=1;
      mov   word ptr [ebp-4],1
@@j14:
; [18] inc(i);
      inc   word ptr [ebp-4]
; [19] if i<10 then goto loop;
      mov   ax,word ptr [ebp-4]
      cmp   ax,10
      jl   @@j15
      jmp   @@j16
@@j15:
      jmp   @@j14
@@j16:
; [20] end;

код в целом идентичен, кроме дополнительной jmp инструкции (собственно самого goto)

Если вернёшься к самому первому примеру, с которой началась тема, то увидишь, что там происходит та же самая ситуация.
Как итоге, чем больше замен repeat...until на goto, тем больше лишних инструкций.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru