Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
FOR в Обероне 7. Стало только хуже https://zx.oberon.org/forum/viewtopic.php?f=32&t=457 |
Страница 1 из 4 |
Автор: | Saferoll [ 04 июн 2019, 20:42 ] |
Заголовок сообщения: | FOR в Обероне 7. Стало только хуже |
Zorko попросил реализовать цикл FOR для совместимости с версией Оберон-7. Что же, попытаюсь вспомнить старые навыки. Теоретически, это должно быть просто – чуть подправить стандартный FOR Оберона. Но мне "религия" (вера в Истинный и Всеправедный FOR ) ![]() Первоначально в Обероне 7 FOR был такой же, как в Оберон-2 и КП. Но в последней версии Оберон 7синтаксис оператора FOR выглядит так: Цитата: ForStatement = FOR ident ":=" expression TO expression [BY ConstExpression] DO StatementSequence END А семантика определяется как эквивалентность конструкцииКод: "OBERON"
Код: "OBERON"
Код: "OBERON"
Код: "OBERON"
Код: "OBERON"
Как видим, FOR в Обероне-7 практически 1-в-1 повторяет цикл в Си Код: "C" for(v=beg;v<=end;v+=inc); for(v=beg;v>=end;v+=inc); В любом случае, считаю это ухудшением и отступлением от «генеральной линии Oberon way». Я с глубочайшем уважением отношусь к профессору Вирту и его коллегам, но такой FOR вызывает у меня только резкие негативные чувства. Вообще, с этим оператором в Обероне творится что-то странное. Как пишут разные источники, создавая Оберон, Вирт не стал включать в него FOR, посчитав этот оператор цикла излишним. В Оберон-2 FOR все-таки был включен (вроде бы с большого неудовольствия Вирта, только по настоянию). Но включен-то не самый лучший вариант, лучше бы вообще никакого не было! Почему то вместо сокрытого механизма изменения переменной, как это было в Паскале и Модуле, в Оберон вошел явный процедурный цикл через while (близкий к Си). И вот теперь ,в Оберон 7, сделан еще один шаг к Си - исчезла временная переменная. |
Автор: | Saferoll [ 04 июн 2019, 20:54 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Кстати, в новой книге «Алгоритмы и структуры данных» 2016 года во многих программах используется оператор FOR, но он вообще отсутствует в приложении «В.Синтаксис Оберона». Причем не только в НФБН, но даже в списке ключевых слов (хотя, неиспользуемые в книге WITH и IS в приложении приведены). В оригинале Algorithms and Data Structures точно также, так что это не погрешность переводчиков. Я уже писал ранее в темах Цикл FOR. Следовать ли стандарту? Мы наш, мы новый FOR построим Модификация Ofront. Реализуем "правильный" FOR чем именно плох стандартный, подобный сишному, FOR в Обероне и какие выгоды сулит FOR, приближенный к Паскалю и Модуле. А новый FOR в Обероне 7, кроме дефекта на границе диапазона, кроме дурной семантики, провоцирующей на трюки с изменением переменной цикла и отслеживанием ее значения после завершения, дарует новую возможность - изменять выражение, определяющее конечное значение. Не говоря уже о том, что вычисление выражения end в начале каждой итерации весьма неэффективно. |
Автор: | Saferoll [ 05 июн 2019, 08:35 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
По сообщениям с форума Oberoncore можно проследить, когда примерно поменялся FOR: в Revision 1.10.2013 / 10.3.2014 используется временная переменная "lim := end;"; в более поздней Revision 1.10.2013 / 1.5.2016 выражение end подставляется прямо в условие WHILE. Т.е. где-то между этими версиями реализация FOR без лишнего шума и огласки поменялась. |
Автор: | Comdiv [ 05 июн 2019, 11:12 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Saferoll писал(а): Как видим, FOR в Обероне-7 практически 1-в-1 повторяет цикл в Си Вы то ли шутите, то ли преувеличиваете, то ли плохо знакомы с Си.Попробуйте повторить это c FOR в Обероне: Код: "OBERON"
|
Автор: | Saferoll [ 05 июн 2019, 12:00 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Comdiv писал(а): Вы то ли шутите, то ли преувеличиваете, то ли плохо знакомы с Си. Благодарю за уточнение, я действительно преувеличил (вернее, неточно выразился). Конечно же, не всякий сишный цикл for можно выразить через FOR в Обероне (даже в Обероне-7). Более корректно было написать "Теперь цикл FOR в Оберон-7 стал еще ближе к циклу for в языке С."Попробуйте повторить это c FOR в Обероне: Ведь теперь цикл Код: "OBERON"
соответствует (в зависимости от знака inc) циклу С Код: "C" for(v=beg;v<=end;v+=inc){S}; Рассмотрим 2 полюса - цикл FOR в Паскале/Модуле и цикл for в С. В Паскале изменение значения переменной цикла скрыто где-то внутри, нет зацикливания на границах диапазона, запрещено менять значение переменной цикла в теле цикла (если сменить, может получиться что угодно), по окончании цикла значение переменной цикла является неопределенным. Кроме того, изменение граничного выражения внутри цикла не влияет на количество итераций. В языке С все условия и инкременты\декременты совершаются явно, for - просто иная запись для некоторого while. Поэтому возможны трюки с изменением значений переменной или граничного выражения, а также использование значения параметра цикла после окончания. В Обероне-2, КП и ранних версиях Оберон-7 цикл FOR был где-то посередине (как в С, за исключением того, что граничное выражение вычислялось 1 раз перед циклом, поэтому изнутри цикла его нельзя было изменить). В Обероне 7 с Revision 1.10.2013 / 1.5.2016 (или чуть раньше) стало практически 1-в-1 как в С ("1-в-1" по побочным эффектам и трюкам, а не по возможностям втиснуть в цикл любые условия и операторы). |
Автор: | Saferoll [ 05 июн 2019, 12:17 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Что же до реализации такого цикла, то это просто. Нужно немного переделать стандартный цикл FOR Оберона-2. В модуле OfrontOPP чуть подправим процедуру: Код: "OBERON"
Код: "OBERON"
Вот собственно и всё! Проверим на программе ASCII из подсистемы ZXDev: Код: "OBERON"
Результат - выдача одного символа # (CHR(35)), т.е. трюк с изменение значения b сработал. |
Автор: | Comdiv [ 05 июн 2019, 18:30 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Вполне вероятно, что такой цикл и не следовало делать. Авторское описание языка, конечно, из-за краткости не обладает юридической точностью и сторонние разработчики могут трактовать его по-разному, но, возможно, недаром слова "given number of times" коллектив переводчиков перевёл как "фиксированное число раз". Обратите внимание на эквивалентный код Код: "OBERON"
|
Автор: | Saferoll [ 05 июн 2019, 22:18 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Comdiv писал(а): Если воспринимать код как потенциально рабочий, а не просто псевдокод, то "S" - это вызов процедуры без параметров, который не может изменить переменные из условия цикла, если они локальные. Это очень важная оговорка, и, будь это так, в тексте были бы пояснения. В предыдущих ревизиях, где используется временная переменная, семантика задана похоже: Код: "OBERON"
Синтаксис во всех редакциях задан как Код: "OBERON"
|
Автор: | Comdiv [ 05 июн 2019, 23:52 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Предполагать-то как раз можно что угодно - в этом недостаток. В описании не сказано, что соответствие проводится между общими синтаксическими конструкциями, поэтому можно предположить, что соответствие проводится между частными случаями, оставляя остальные варианты в рамках неопределённости. Если же S - это произвольный список операторов, то и о неизменности lim нельзя утверждать. |
Автор: | Saferoll [ 06 июн 2019, 10:24 ] |
Заголовок сообщения: | Re: FOR в Обероне 7. Стало только хуже |
Comdiv писал(а): Предполагать-то как раз можно что угодно - в этом недостаток. Да, но предположения должны на чем-то основываться. Без веских оснований можно предположить необходимость совершать троекратное приседание со звуком "Ку-у!", обратившись лицом на северо-восток всякий раз при употреблении в своей программе цикла FOR. ![]() ![]() А вот предположения, что синтаксис и семантика, размещенные в разделе об одном и том же операторе, описывают одно и то же; что тело цикла FOR такое же, как у циклов WHILE и REPEAT...UNTIL; что Оберон-7 в основном похож на прочие обероны; что столь важное нововведение, как необходимость телу цикла FOR состоять только из одного вызова процедуры без параметров, должно быть описано в тексте хотя бы одной фразой выглядят достаточно разумными, чтобы предположить, что при переходе к новой версии только убрали временную переменную, оставив остальное как было. Поэтому весьма сомнительно, что S - это только вызов процедуры без параметров. Скорее уж это то же самое, что было всегда - список произвольных операторов. Цитата: Если же S - это произвольный список операторов, то и неизменность lim нельзя предполагать, если не сказано иное. lim-скрытая временная переменная, нигде не присутствующая в самом FOR, поэтому недоступная для воздействия программиста. Воздействовать можно только на переменную цикла v. Возможно, предполагалось, что программист сам не будет использовать трюки, или сам выделит какую-то переменную и перед циклом выполнит присваивание ей граничного выражения, если это выражение может измениться во время цикла. Но тогда и сборщик мусора не нужен, если программист сам удаляет и выделяет память без ошибок. В том и смысл хороших компиляторов (и разумно продуманных ЯП), что человеку свойственно ошибаться, а компилятор и конструкции языка должны от этого предостеречь. "Скрытый магический механизм" управления переменной цикла, недоступный для воздействия программиста, приближает такой цикл к высокоуровневой абстракции, такой, например, как сумма (сигма большое). Ведь никто не спрашивает, чему равно i после вычисления суммы в математической формуле - это так же бессмысленно, как спрашивать, чему равна нижняя закорючка у буквы сигма, если ее отломить. А вот явный механизм, как в С или в Обероне-7, позволяет "залезть внутрь", а значит и позволяет легче совершить ошибку.
|
Страница 1 из 4 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |