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

Твердыня модульных языков
Текущее время: 05 окт 2024, 23:02

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Modula-2 Revision 2010
СообщениеДобавлено: 31 янв 2013, 02:12 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Посчастливилось пообщаться с Бенджамином Ковачем (Benjamin Kowarsch), который сейчас активно разрабатывает компилятор M2R10. Насколько я понял, Вирт высоко оценил проектную работу по совершенствованию Модулы-2, однако разработка компилятора (для LLVM) ведётся очень маленькой группой энтузиастов и без всякой коммерческой поддержки. В IRC есть канал, посвящённый Модуле-2, где активно обговаривается этот проект.

irc://irc.freenode.org/modula-2
https://bitbucket.org/trijezdci/m2r10/

Objective Modula-2 — очень интересный язык, продолжатель традиций Модулы-2. Является золотой серединой между маленьким Обероном и очень большой Адой, наследуя лучшие их традиции, такие как строгая типизация, модульность, надёжность получаемых программных решений. Транслятор с Objective Modula ещё не разработан.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Modula-2 Revision 2010
СообщениеДобавлено: 19 май 2013, 19:18 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Снова общался с Бенджамином Ковачем, распросил про реализацию цикла FOR в Modula-2 Rev. 2010, есть ли отличия от обероновского FOR. И вот что поведал Бенджамин.
Цитата:
<trijezdci> the for loop in r10 is a foreach loop
<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> :)
Публикуется с разрешения Бенджамина Ковача, хотя он предпочёл бы публиковать не этот лог, а точную выдержку из спецификации с EBNF. Так что ссылаемся на страницу 70, описывающую цикл FOR.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Modula-2 Revision 2010
СообщениеДобавлено: 21 май 2013, 19:25 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
Т.е в Модуле-2 цикл FOR очень похож на цикл в ЯП Ада. Есть мелкие различия в синтаксисе, но основное совпадает:
    1) Заголовок цикла является описанием переменной цикла, она существует пока цикл выполняется, но исчезает по окончании цикла.
    2) Переменную цикла нельзя менять в теле цикла, она меняется автоматически - так, как задано в заголовке.
Эти принципы решают проблему с использованием значения переменной цикла по его окончании и с ручным изменением этой переменной. Хотя Вирт и рекомендует поступать так, как будто в Обероне тоже действуют эти принципы, но это именно "правила хорошего тона", а не жесткий контроль компилятора, как в Модуле и Аде.
Жаль, очень жаль, что в Обероне не такой цикл FOR! Могу предположить, в чем заключалась "инерция" профессора Вирта. "Заголовок является описанием переменной цикла" нарушает принцип "всё должно быть предварительно описано в начале модуля или процедуры". А тут вдруг появляется новая переменная не в начале процедуры, а внутри ее тела. Вроде бы технически ничего страшного, при выполнении программы создается и уничтожается куча внутренних служебных переменных. Но именно внутренних и служебных, а тут переменная программиста. Возможно, это усложняет компилятор, изменяет какие-то утверждения об областях видимости и существования переменных и т.д. Вирт не решился нарушать сложившиеся правила о местах описания новых переменных. Но если это обычная переменная, существующая и до и после цикла, то она должна быть чему-то равна? И с какой стати внутри цикла ее использование как-то должно быть ограничено, и если ограничено, то какими правилами? Т.е. отказ от создания переменной в заголовке цикла повлек отбрасывание всех полезных принципов цикла FOR.
Видимо поэтому Вирт вообще решил отказаться от конструкции FOR: в Обероне-1 FOR нет, каждый программист мог сам реализовать аналог при помощи имеющихся операторов цикла. Начиная с Оберона-2 цикл FOR появился, но крайне неудачный. И благополучно перекочевал через все Обероны в Оберон-7, сохранив свои отрицательные качества. При всём глубочайшем уважении к Никлаусу Вирту, осмелюсь заявить: такой FOR был и остается ошибкой, дискредитирующей Оберон-технологии!
Ошибка раз: описание семантики через конкретный эквивалентный фрагмент кода провоцирует программиста на трюки с постзначением переменной цикла и ручным изменением этой переменной в теле цикла, а также связывает разработчиков компилятора, не позволяя применить разнообразные оптимизации.
Ошибка два: эта эквивалентная конструкция ошибочна, она не предусматривает ограниченность целого типа, что вызывает переполнение и зацикливание.
И три (хотя не назову это ошибкой, скорее недостаток, причем субъективный): мне не нравится способ задавать направление цикла знаком величины шага; я бы предпочел направление задавать служебным словом (навроде DOWNTO или DESCENDING), а величину шага задавать положительной константой. Впрочем, это вопрос спорный, тут есть свои сложности, о чем я уже писал.
Да и о недостатках стандартного FOR тоже. Прошу прощения за повторение.

Я не призываю сделать обероновский FOR как в Модуле или Аде. Пусть синтаксис остается таким же, пусть переменная цикла будет обычной переменной, но устраните наконец зацикливание на границе типа! Надеюсь, что общими усилиями и в теории и на практике удастся (уже удалось!) создать новый "незацикливающийся" FOR. И компилятор для этого оператора будет автоматически выбирать ту или иную реализацию, что должно отвадить любителей нарушать упомянутые в начале сообщения принципы.

Еще раз прошу прощения за некоторое отклонение от темы. Обо всём этом я уже писал в других ветках форума. Но не смог удержаться, уж очень резок контраст между циклом FOR Модулы и Оберона.

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Modula-2 Revision 2010
СообщениеДобавлено: 22 май 2013, 01:08 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Абсолютно согласен с тобой, Олег. Остаётся только прибавить, что 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 другими конструкциями. Нет, у такого предупреждения конечно же есть и свой плюс, например, подсказка если программист забыл использовать переменную.


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

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


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

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


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

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