Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 15 дек 2019, 10:41

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: О границах параметра цикла FOR
СообщениеДобавлено: 03 мар 2013, 14:28 
Не в сети
Администратор
Аватара пользователя

Сообщения: 269
Откуда: Россия
Влад Жаринов писал(а):
По ходу, "лишний" инкремент может иметь смысл, если трактовать параметр как указатель позиции. Который должен иметь также положение "после конца" (и, кстати, "до начала" тогда уж :)). Так у Мейера в Эйффеле, где-то в этой книге объяснялось (в главе о типах вроде). Что не отменяет проблем...

Совершенно верно, работать с системой, в которой есть "после конца" (например фиктивная пустая запись в конце БД - EOF) и "перед началом" обычно удобнее, потому, что снимается "особость" последнего и первого элементов - они становятся не граничными, а внутренними.
Но в данном случае не так. Здесь FOR связан с целочисленным типом, который ограничен в пределах MIN(T)..MAX(T), ограничен самим ЯП! Никакого "после конца" (навроде +бесконечность) в типе Т нет, инкремент максимального значения не определен. Можно было бы считать за "после конца" флаг переполнения (переноса), но и его в самом Обероне нету (всякие SYSTEM-трюки не в счет). И тем не менее, после обработки самого последнего элемента делается лишний инкремент.
Еще 1 довод почему лишний инкремент не должен толковаться как указатель позиции "после конца". Такое положение может возникнуть лишь после самой последней итерации (из-за лишнего инкремента). Но после этой итерации цикл закончится вообще! А если закончился, так и значением указателя интересоваться дурной тон. Он не может быть ""после конца", потому что он вообще не может быть никакой! "Значение параметра цикла FOR после окончания цикла не определено", составлять свою программу рассчитывая на что-то иное - опасно и неграмотно. Также нельзя и досрочно завершать FOR, а потом по значению счетчика узнавать на каком шаге мы выпрыгнули. И изменять значения переменной цикла внутри - тоже моветон.
Цикл FOR должен выполниться для всех значений от А до В ни одного не пропуская и не повторяя дважды - вот его постусловие. Надо составлять свою программу, чтоб это постусловие было всегда. Если мы стоим после цикла, значит цикл выполнился для всех значений, поэтому нам не надо знать указатель позиции. "После конца" говорит не значение указателя, а сам факт завершения цикла!
А завершение должно быть всегда, цикл FOR, в отличие от прочих, никогда не зацикливается (не должен, если грамотно спроектирован). Цикл с шагом 1 всегда выполняется B-A+1 раз (или 0 раз, при A>B).
Да, конечно, объясняя семантику FOR через фрагмент Оберон-кода, мы можем отследить:
- чему равен параметр "после конца",
- что будет, если изменить это значение внутри цикла,
- что будет, если цикл досрочно прервать и т.д.
И вот тут и возникла проблема с инкрементом МАХ(Т)!
Такой способ задания семантики провоцирует на трюкачества, на использование FOR не по назначению.
Я бы вообще в компиляторах после окончания FOR присваивал параметру случайное число. :) Уж не определено, так не определено... Отучило бы хоть от некоторых трюков. Zorko, может сделаем? ;)

_________________
А кроме того, я думаю, что корFORген должен быть разрушен!


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Цикл FOR. Следовать ли стандарту?
СообщениеДобавлено: 04 мар 2013, 09:08 
Не в сети
Аватара пользователя

Сообщения: 987
Откуда: Днепропетровская обл.
Я бы лучше вообще FOR’ом не пользовался при таком раскладе. ;)

Получается, программиста надо бить по рукам когда он использует значение счётчика цикла после выхода из цикла, а также его было бы очень желательно бить по рукам если он меняет счётчик внутри цикла (вообще было бы идеально считать переменную-счётчик внутри цикла как “только для чтения”, но это так сложно отследить (например, если счётчик меняется в процедуре, вызванной внутри цикла); поэтому я бы предложил выдавать предупреждение при ручном изменении счётчика хотя бы там, где это легче отследить компилятору). Впрочем, использовать глобальные переменные для счётчика цикла — дурной тон. Как и много чего ещё, что не так легко запретить на уровне стандарта языка. Вот так-то, цикл FOR приводит ко многим соблазнам...

Остаётся удивляться, почему FOR есть в Обероне-07.

И, кстати, потерять ракету можно не только от FOR i := MAX(INTEGER)-10 TO MAX(INTEGER), но и в результате банального переполнения из-за работы на границе предела возможных значений переменной. И без всякого цикла FOR. Это следствие машинной арифметики.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Цикл FOR. Следовать ли стандарту?
СообщениеДобавлено: 04 мар 2013, 10:48 
Не в сети
Администратор
Аватара пользователя

Сообщения: 269
Откуда: Россия
Zorko писал(а):
Я бы лучше вообще FOR’ом не пользовался при таком раскладе. ;)

Надо пользоваться, но пользоваться правильно, а компилятор должен эту правильность стимулировать. Написать вместо FOR неправильный WHILE ничуть не лучше.

Цитата:
Получается, программиста надо бить по рукам когда он использует значение счётчика цикла после выхода из цикла, а также его было бы очень желательно бить по рукам если он меняет счётчик внутри цикла
В ЯП Ада примерно так и есть: переменная цикла создается перед первым выполнением цикла (даже описывать ее в VAR не надо, вернее вообще нельзя описать. FOR I ...-это и есть ее описание), уничтожается после завершения цикла; внутри цикла ее можно только читать. Я не призываю менять Оберон настолько сильно, хотя какой-то резон есть и в такой строгости.

Цитата:
И, кстати, потерять ракету можно не только от FOR i := MAX(INTEGER)-10 TO MAX(INTEGER), но и в результате банального переполнения из-за работы на границе предела возможных значений переменной. И без всякого цикла FOR. Это следствие машинной арифметики.
Поэтому надо знать эти границы заранее и работать аккуратно (например, не делать инкремент, если значение максимально). Если заранее известно, что будет переполнение, то заранее же и можно принять меры.

_________________
А кроме того, я думаю, что корFORген должен быть разрушен!


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 04 мар 2013, 18:18 
Не в сети
Администратор
Аватара пользователя

Сообщения: 269
Откуда: Россия
Saferoll писал(а):
Zorko писал(а):
Я полагаю, что актуальность данного вопроса в контексте 32-битных платформ незначительна, и вот аргументация. Если в качестве счётчика цикла использовать 32-битные и больше целые, то вероятность достижения TO MAX(INTEGER), а уж тем более TO MAX(LONGINT) невероятно мала, стоит очень напрячь мозг, чтобы получить задачу, где такое значение действительно потребуется.
Не забывайте, что проблема имеет место, когда B=MAX(LONGINT) или MAX(INTEGER), граница А в этом случае может быть любой (потому что всегда А<=B=MAX(LONGINT) ), т.е. сама подобласть может состоять всего из нескольких чисел (например MAX(INTEGER)-10 TO MAX(INTEGER)), но сами числа очень большие - максимальные.
Возражения самому себе: если сама подобласть мала, то можно вместо FOR x:=A TO MAX(INTEGER) написать FOR x:=0 TO MAX(INTEGER)-A, затем в теле цикла либо везде вместо x использовать x+A, либо ввести новую переменную x1:=x+A и использовать её.
Возражения на эти возражения: 1) Для того, чтобы такое написать, надо признать ошибку (ну ладно - особенность) FOR на границе типа.
2)Ради чего делать такое усложнение, ради ошибочной реализации оператора (пусть возведенной в стандарт)? Если в формуле написано при x=2^32-t..2^32-1, то хочется, чтобы и в тексте программы было нечто, максимально напоминающее эту формулу. В данном случае хотелось бы написать FOR напрямую. FOR замечательно соответствует формулам "большая буква с индексом внизу"(например сумма-"сигма"), фразам "при x=a,b" и пр. Хорошо бы эту большую букву\отрезок\пр. заменить FOR, а границы индекса поставить по обе стороны от ТО. Увы, он имеет дефект, придется как-то исхитряться. А любая хитрость, увеличивающая разрыв между текстом программы и матпостановкой (алгоритмом, моделью, предметной областью), увеличивает и вероятность ошибок, затрудняет модификацию, препятствует понимаю программы другими.
Оффтопик.Поэтому мне и нумерация массивов с нуля не нравится. В векторной алгебре элементы нумеруются с 1. Поэтому формула Хi=2*X_(i+1) превращается в программе в X[i-1]:=2*X[i]. Т.е. я должен при переводе взгляда бумага-экран мысленно прибавлять\вычитать единичку? Нет, я понимаю доводы в пользу такого решения, читал и замечания Вирта и обсуждение на oberoncore. И я согласен, что достоинства такой индексации перевешивают недостатки. Но недостатки не исчезают из-за того, что их перевесили. :(

_________________
А кроме того, я думаю, что корFORген должен быть разрушен!


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Цикл FOR. Следовать ли стандарту?
СообщениеДобавлено: 04 апр 2013, 20:51 
Не в сети
Администратор
Аватара пользователя

Сообщения: 269
Откуда: Россия
Надеюсь, учитывая недавно минувшее 1 апреля, модератор не будет сильно ругать за помещение сюда шутки. :)

КорFORген - термин фористики(науки, изучающей цикл FOR). Означает особенности (чаще всего негативные) цикла FOR, связанные с его происхождением ("родовые пятна").

Этимология термина. "Кор"(cor) - видоизменение латинской приставки "con" -"с" (как в слове "кор-респондент"). "Ген" - от греческого корня "рождение", "происхождение".
КорFORген - "связанное с происхождением FOR".

Пример. Проблемы цикла FOR в Обероне, связанные с его происхождением от стандартного цикла Си for (x=A;x<=B;x++).

_________________
А кроме того, я думаю, что корFORген должен быть разрушен!


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 2 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club