Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Modula-2 Revision 2010 https://zx.oberon.org/forum/viewtopic.php?f=43&t=79 |
Страница 1 из 1 |
Автор: | Zorko [ 31 янв 2013, 02:12 ] |
Заголовок сообщения: | Modula-2 Revision 2010 |
Посчастливилось пообщаться с Бенджамином Ковачем (Benjamin Kowarsch), который сейчас активно разрабатывает компилятор M2R10. Насколько я понял, Вирт высоко оценил проектную работу по совершенствованию Модулы-2, однако разработка компилятора (для LLVM) ведётся очень маленькой группой энтузиастов и без всякой коммерческой поддержки. В IRC есть канал, посвящённый Модуле-2, где активно обговаривается этот проект. irc://irc.freenode.org/modula-2 https://bitbucket.org/trijezdci/m2r10/ Objective Modula-2 — очень интересный язык, продолжатель традиций Модулы-2. Является золотой серединой между маленьким Обероном и очень большой Адой, наследуя лучшие их традиции, такие как строгая типизация, модульность, надёжность получаемых программных решений. Транслятор с Objective Modula ещё не разработан. |
Автор: | Zorko [ 19 май 2013, 19:18 ] |
Заголовок сообщения: | Re: Modula-2 Revision 2010 |
Снова общался с Бенджамином Ковачем, распросил про реализацию цикла FOR в Modula-2 Rev. 2010, есть ли отличия от обероновского FOR. И вот что поведал Бенджамин. Цитата: <trijezdci> the for loop in r10 is a foreach loop Публикуется с разрешения Бенджамина Ковача, хотя он предпочёл бы публиковать не этот лог, а точную выдержку из спецификации с EBNF. Так что ссылаемся на страницу 70, описывающую цикл FOR.
<trijezdci> there is no, for x := start to stop do <trijezdci> and the loop control variable is declared by the loop header and only visible inside the loop's body, but immutable inside the body <trijezdci> FOR foo IN bar DO <trijezdci> (* foo is visible here, but immutable here *) <trijezdci> END <trijezdci> (* foo is no longer visible here *) <trijezdci> basically this is like Ada <trijezdci> for reverse order the syntax is FOR DESCENDING foo IN bar DO <drrob1> So how would I code FOR i := 1 TO 10 DO ? <trijezdci> FOR i IN [1..10] OF INTEGER DO <ttmrichter> Oh, ranges are a data type now? <ttmrichter> Nice. <drrob1> The brackets are set notation, right? <trijezdci> [1..10] OF INTEGER <= range <trijezdci> ranges are always typed <trijezdci> no, square brackets in this notation indicate a range <drrob1> Is that new? <trijezdci> no, you have this already in Pascal <Zorko> immutable = unchangeable <trijezdci> read only, yes <Zorko> then we cannot pass this var as VAR parameter into procedure? <trijezdci> the loop header will of course update the control variable on each loop pass, but inside the body of the loop it is treated like a constant <Zorko> it's very good that you told <trijezdci> yes, you cannot pass the control variable of a loop as a VAR parameter <trijezdci> only as a value parameter or a CONST parameter <trijezdci> CONST parameters are like VAR, but they enforce immutability in the function passed to <trijezdci> for math iterations like Sum over all n, where n from 0 to 10 for 2n+1 you simply iterate over the n, just like it is in math <trijezdci> FOR n IN [1..10] OF INTEGER DO <trijezdci> sum := sum + 2 * n + 1; <trijezdci> END <trijezdci> this looks to a programmer like there is a wasteful 2*n multiplication inside the loop <trijezdci> but in reality this is a loop invariant that a good compiler will move outside the loop anyway <trijezdci> so trying to avoid writing it this way would be nothing more than premature optimisation <trijezdci> but this is so deep in the psyche of programmers used to the for to by loop that it is difficult to get them to accept this <trijezdci> even Rick, who is a mathematician (professor for mathematics actually) had difficulties accepting this <trijezdci> the sum := sum + 2*n + k form is exactly the way it is written in a math formula, but he had very serious trouble accepting that the code should be written like this <trijezdci> it took him at least a year to agree that this was alright and we would remove the for-to-by loop <trijezdci> inertia <Zorko> I just wanted to find out whether M2R10 has not problems with "last value of type" MAX(T) in loop with counter <Zorko> and it seems that all is well <trijezdci> it wont <trijezdci> also, there is no problem with "what is the value of x after the loop has finished" <trijezdci> because x is no longer visible outside the loop <Zorko> yes, it's also good <trijezdci> problem avoided <Zorko> and a developer cannot change loop counter inside the loop <Zorko> well, I would call it an ideal solution <Zorko> interesting, why prof. Wirth accepts this "imperfect" FOR in Oberon-07 <trijezdci> inertia I think <Zorko> |
Автор: | Saferoll [ 21 май 2013, 19:25 ] |
Заголовок сообщения: | Re: Modula-2 Revision 2010 |
Т.е в Модуле-2 цикл FOR очень похож на цикл в ЯП Ада. Есть мелкие различия в синтаксисе, но основное совпадает:
2) Переменную цикла нельзя менять в теле цикла, она меняется автоматически - так, как задано в заголовке. Жаль, очень жаль, что в Обероне не такой цикл FOR! Могу предположить, в чем заключалась "инерция" профессора Вирта. "Заголовок является описанием переменной цикла" нарушает принцип "всё должно быть предварительно описано в начале модуля или процедуры". А тут вдруг появляется новая переменная не в начале процедуры, а внутри ее тела. Вроде бы технически ничего страшного, при выполнении программы создается и уничтожается куча внутренних служебных переменных. Но именно внутренних и служебных, а тут переменная программиста. Возможно, это усложняет компилятор, изменяет какие-то утверждения об областях видимости и существования переменных и т.д. Вирт не решился нарушать сложившиеся правила о местах описания новых переменных. Но если это обычная переменная, существующая и до и после цикла, то она должна быть чему-то равна? И с какой стати внутри цикла ее использование как-то должно быть ограничено, и если ограничено, то какими правилами? Т.е. отказ от создания переменной в заголовке цикла повлек отбрасывание всех полезных принципов цикла FOR. Видимо поэтому Вирт вообще решил отказаться от конструкции FOR: в Обероне-1 FOR нет, каждый программист мог сам реализовать аналог при помощи имеющихся операторов цикла. Начиная с Оберона-2 цикл FOR появился, но крайне неудачный. И благополучно перекочевал через все Обероны в Оберон-7, сохранив свои отрицательные качества. При всём глубочайшем уважении к Никлаусу Вирту, осмелюсь заявить: такой FOR был и остается ошибкой, дискредитирующей Оберон-технологии! Ошибка раз: описание семантики через конкретный эквивалентный фрагмент кода провоцирует программиста на трюки с постзначением переменной цикла и ручным изменением этой переменной в теле цикла, а также связывает разработчиков компилятора, не позволяя применить разнообразные оптимизации. Ошибка два: эта эквивалентная конструкция ошибочна, она не предусматривает ограниченность целого типа, что вызывает переполнение и зацикливание. И три (хотя не назову это ошибкой, скорее недостаток, причем субъективный): мне не нравится способ задавать направление цикла знаком величины шага; я бы предпочел направление задавать служебным словом (навроде DOWNTO или DESCENDING), а величину шага задавать положительной константой. Впрочем, это вопрос спорный, тут есть свои сложности, о чем я уже писал. Да и о недостатках стандартного FOR тоже. Прошу прощения за повторение. Я не призываю сделать обероновский FOR как в Модуле или Аде. Пусть синтаксис остается таким же, пусть переменная цикла будет обычной переменной, но устраните наконец зацикливание на границе типа! Надеюсь, что общими усилиями и в теории и на практике удастся (уже удалось!) создать новый "незацикливающийся" FOR. И компилятор для этого оператора будет автоматически выбирать ту или иную реализацию, что должно отвадить любителей нарушать упомянутые в начале сообщения принципы. Еще раз прошу прощения за некоторое отклонение от темы. Обо всём этом я уже писал в других ветках форума. Но не смог удержаться, уж очень резок контраст между циклом FOR Модулы и Оберона. |
Автор: | Zorko [ 22 май 2013, 01:08 ] |
Заголовок сообщения: | Re: Modula-2 Revision 2010 |
Абсолютно согласен с тобой, Олег. Остаётся только прибавить, что Modula-2 Rev 2010 реализована таким способом, что в цикле FOR n IN [Min..Max] OF TYPE DO .. END значения Min и Max обязательно должны быть константами. Т.е. если я правильно понял, то задать произвольное количество повторений цикла FOR с помощью переменных вообще не получится (только через WHILE или REPEAT), так что наш вариант цикла FOR для Оберона в чём-то даже более функционален. А уж что он проще — так это точно, остаётся сопоставить с примерами циклов, описанными на странице 70. Ещё мне не понравилось, что в этой ревизии Модулы можно выходить из FOR, WHILE и REPEAT/UNTIL оператором EXIT. Дело в том, что я понял главное достоинство таких циклов — без возможности из них вот так вот запросто выпрыгнуть (RETURN не в счёт — это вопрос самодисциплины программиста) — после исполнения цикла мы точно уверены в том, что условия выхода из цикла достигнуты, а не сработала одна из корявых подпорок, которую ещё надо найти в цикле. Повышается ценность цикла LOOP/EXIT — он специально для таких случаев (многократного выпрыгивания из цикла) предназначен. Именно поэтому семантически обероновский UNTIL в конце цикла гораздо удачнее сишного while, потому что в конце цикла нас больше интересуют условия выхода из него, а условия вхождения в цикл и его продолжения нас интересуют в начале. Ещё один момент в новой ревизии Модулы. Если переменная-счётчик, описанная внутри цикла, нигде больше не используется, то компилятор обязательно выдаст предупреждение. Нетрудно придумать такой случай, когда надо просто повторить несколько раз фрагмент кода, и чтобы избежать накапливающихся предупреждений — ничего другого не придумаешь как всё равно сэмулировать FOR другими конструкциями. Нет, у такого предупреждения конечно же есть и свой плюс, например, подсказка если программист забыл использовать переменную. |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |