Re[13]: Синтаксический оверхед - Новая порция
От: Amidlokos Россия  
Дата: 28.06.05 09:43
Оценка:
Здравствуйте, faulx, Вы писали:

C>>ЗЫ: как смешно читать нападки на С++


F>Форум такой, так что стараемся.


Спасибо, у вас получается — коллеги улыбаются
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
Re[15]: Синтаксический оверхед - Новая порция
От: Amidlokos Россия  
Дата: 28.06.05 09:48
Оценка: :)
Здравствуйте, faulx, Вы писали:

F>А зачем возвращают значения close() и IUnknown::Release()? А доказательства, что невозврат значения как-то связан с названием оператора удаления объекта, мне не дождаться?


Кто сказал, что вызов close() будет удачным?

И уж простите меня, КТО вам сказал, что Release() удаляет объект?! Этот кто-то врал и не краснел. См. MSDN.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
Re[8]: Народ упорно не врубается
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 28.06.05 09:50
Оценка:
Попробую объяснить свою мысль еще раз



  • Универсальный цикл LOOP

    Есть универсальный цикл LOOP
      LOOP
        ...
        ...
        ...
      END;
      СледующаяИнструкция;
      ...

    который может либо исполняться вечно, либо завершиться с помощью вызова внутри него инструкции EXIT.
      LOOP
        ...
        IF c1 THEN EXIT END;
        ...
        IF c2 THEN EXIT END;
        ...
        IF c3 THEN EXIT END;
        ...
      END;
      СледующаяИнструкция;
      ...

    Условий завершения цикла LOOP может быть произвольное количество 0, 1, 2, 3, ... . Если их 0, то цикл ни когда не завершается.



  • Разница между завершением и прерыванием цикла

    После того как цикл завершается начинает выполняться следующая после него интсрукция — "СледующаяИнструкция;".

    Если цикл прерывается, то управление передается в неизвестном (для него) направлении, и следующая после него инструкция — "СледующаяИнструкция;" — УЖЕ НЕ ВЫПОЛНЯЕТСЯ!

    Как можно прервать любой цикл:
    1) HALT — останов системы
    2) ложный ASSERT — останов команды
    3) RETURN из процедуры
    Во всех этих случаях управление передается в неизвестном (для "самого цикла") направлении, и следующая после него инструкция — "СледующаяИнструкция;" — уже не выполняется. Вот в чем состоит отличие между завершением цикла и прерыванием цикла.



  • Количество условий завершения цикла

    Рассмотрим случай, когда цикл может быть завершен более чем одним способом.
      LOOP
        ...
        IF c1 THEN EXIT END;
        ...
        IF c2 THEN EXIT END;
        ...
        IF c3 THEN EXIT END;
        ...
      END;
      СледующаяИнструкция;
      ...

    Если инструкция "СледующаяИнструкция;" когда-нибудь будет выполнена, значит цикл все-таки завершился, а раз он завершился, значит сработало какое-то из условий завершения c1 или c2 или c3 и т.д. А теперь приготовьтесь — сейчас будет ключевая мысль. На момент написания программы не известно какое именно из условий ci сработает, это можно выяснить только лишь динамически во время работы программы. То есть "СледующаяИнструкция;" не знает наперед почему завершился цикл, а она должна это динамически узнать. Например, вот так:
      LOOP
        ...
        IF c1 THEN EXIT END;
        ...
        IF c2 THEN EXIT END;
        ...
        IF c3 THEN EXIT END;
        ...
      END;
    
      IF c1 THEN быть может цикл loop завершился по условию c1 END;
      IF c2 THEN быть может цикл loop завершился по условию c2 END;
      IF c3 THEN быть может цикл loop завершился по условию c3 END;
      ...

    или каким-то другим способом, например, через вспомогательную переменную complete:
      LOOP
        ...
        IF c1 THEN complete := 1; EXIT END;
        ...
        IF c2 THEN complete := 2; EXIT END;
        ...
        IF c3 THEN complete := 3; EXIT END;
        ...
      END;
      CASE complete OF
        1: цикл loop точно завершился по условию c1 |
        2: цикл loop точно завершился по условию c2 |
        3: цикл loop точно завершился по условию c3 |
        ...
      END
      ...




  • Зачем нужны циклы WHILE и REPEAT

    Спрашивается зачем нужны циклы WHILE и REPEAT если достаточно универсального цикла LOOP? Ответ — для удобства. Это примерно тоже самое как иметь инструкцию IF когда достаточно иметь универсальную инструкцию CASE. Существует много случаев, когда вариантов всего два, поэтому и есть IF кроме CASE, просто так удобнее. Аналогично существует много случаев когда условие завершения цикла всего одно.

      WHILE продолжить DO
        ...
      END;  
      СледующаяИнструкция;
      ...

    Поскольку условие завершения цикла WHILE всего одно, то "СледующаяИнструкция" выполняется при полной уверенности, что "продолжить = FALSE". Ни каких дополнительных проверок во время исполнения не требуется — условие завершения и так известно наперед.
      REPEAT
        ...
      UNTIL остановить;
      СледующаяИнструкция;
      ...

    Поскольку условие завершения цикла REPEAT всего одно, то "СледующаяИнструкция" выполняется при полной уверенности, что "остановить = TRUE". Ни каких дополнительных проверок во время исполнения не требуется — условие завершения и так известно наперед.

    Циклы WHILE и REPEAT нельзя завершить по другому. Но их можно прервать передав управление в неизвестном (для "самих циклов") направлении. К уже известным способам прерывания HALT, ASSERT(FALSE), RETURN добавляется еще один способ прерывания — EXIT который работает в том случае, если сам цикл WHILE или REPEAT является вложенным внутрь агрегирующего его цикла LOOP.
    Например:
      LOOP
        ...
        IF c1 THEN complete := 1; EXIT END;
        ...
        REPEAT
          ...
          IF c2 THEN complete := 2; EXIT END;
          ...      ...
        UNTIL остановить;
        СледующаяПослеRepeatИнструкция;
      END;
      СледующаяПослеLoopИнструкция;
      ...

    Условие c2 одновременно прерывает вложенный цикл REPEAT, так что инструкция "СледующаяПослеRepeatИнструкция;" НЕ ВЫПОЛНЯЕТСЯ, но оно одновременно же завершает цикл LOOP, так что инструкция "СледующаяПослеLoopИнструкция;" — выполняется. Прерывает одно и завершает другое, понимаете тонкость момента?
      LOOP
        ...
        IF c1 THEN complete := 1; EXIT END;
        ...
        REPEAT
          ...
          IF c2 THEN complete := 2; EXIT END;
          ...      ...
        UNTIL остановить;
        СледующаяПослеRepeatИнструкция;
      END;
      CASE complete OF
        1: Цикл loop завершился по условию c1 |
        2: Цикл loop завершился по условию c2 |
        ...
      END
      ...




  • А что в Си?

    В С/C++/C#/Java цикл while может быть завершен вовсе не только одним способом, а несколькими: добавляется break и goto на конец цикла (кроме Java, там goto нет).

    Понимаете? break и goto на конец цикла while тоже ЗАВЕРШАЮТ его, а вовсе не прерывают. После этого начинает выполняться СЛЕДУЮЩАЯ после цикла инструкция. И она не может наперед знать причину завершения цикла, а должна ее динамически узнавать.
  • Re[20]: Синтаксический оверхед - Новая порция
    От: Cyberax Марс  
    Дата: 28.06.05 09:55
    Оценка:
    Трурль wrote:

    > F>Смысл выражения — _создание_ объекта. Его логично записывать

    > формально в виде глагола. Противоположное созданию действие —
    > _разрушение_ (удаление) объекта. Его тоже логично обозначать глаголом.
    > Эти два глагола обозначают противоположные действия, поэтому они
    > должны быть антонимами.
    > Записывать /выражение/ в виде глагола нелогично. Так логично
    > записывать /предложение/.
    >
    >Открой файл — логично
    >Пусть а есть открой файл — нелогично
    >
    File *fl=new File(...);
    //Пусть указатель на fl равен новому объекту-файлу.

    Чего не так?

    --
    С уважением,
    Alex Besogonov (alexy@izh.com)
    Posted via RSDN NNTP Server 1.9
    Sapienti sat!
    Re[9]: Народ упорно не врубается
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 28.06.05 09:59
    Оценка: +2 :)
    Здравствуйте, Сергей Губанов, Вы писали:

    ...

    Эх, вот бы эту энергию и на благо человечества
    Re[13]: Синтаксический оверхед - Новая порция
    От: Cyberax Марс  
    Дата: 28.06.05 09:59
    Оценка:
    Сергей Губанов wrote:

    > C>В отличие от Виртовских поделок процесс разработки С++ открыт и

    > публичен.
    > Клевета.

    На что? На открытость С++?
    Так есть сайты http://open-std.org/JTC1/SC22/WG21/ и
    comp.lang.c++.moderated. Процесс разработки С++ соответствует стандарту
    качества ISO, а в нем есть фаза публичного фидбека. Четко определены
    процедуры голосования и разрешения конфликтов и т.п.

    Что там у нас у Оберона? Хоть список рассылки-то есть?

    --
    С уважением,
    Alex Besogonov (alexy@izh.com)
    Posted via RSDN NNTP Server 1.9
    Sapienti sat!
    Re[10]: Идеологически правильный мегарулез
    От: Privalov  
    Дата: 28.06.05 10:00
    Оценка: :)
    Здравствуйте, Mr. None, Вы писали:

    К>>Мсье неслабый специалист по сферическим коням в вакууме


    MN>Я бы даже сказал — главный на RSDN`е...


    Может, отдельный форум создать? Специально для выпаса этих лошадок.
    Re[21]: Синтаксический оверхед - Новая порция
    От: Трурль  
    Дата: 28.06.05 10:04
    Оценка:
    Здравствуйте, faulx, Вы писали:

    F>Что же делать, если в C++ у каждого выражения может быть вагон побочных эффектов? Тем более у new.

    Тут да, делать нечего

    F> И потом:

    F>
    F>let a = OpenFile()
    F>


    F>Нормально.

    Пусть a означает "открыть файл"?
    Re[10]: Народ упорно не врубается
    От: xBlackCat Россия  
    Дата: 28.06.05 10:04
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Эх, вот бы эту энергию и на благо человечества


    Баян! Я первый эту фразу сказал
    ... << RSDN@Home 1.1.4 beta 3 rev. 185>>
    Rojac &mdash; Rsdn Offline JAva Client
    Анонсы и обсуждение здесь
    Автор: xBlackCat
    Дата: 08.02.10
    Re[11]: Народ упорно не врубается
    От: Privalov  
    Дата: 28.06.05 10:08
    Оценка:
    Здравствуйте, xBlackCat, Вы писали:

    К>>Эх, вот бы эту энергию и на благо человечества


    BC>Баян! Я первый эту фразу сказал


    Кто бы ни сказал, должного эффекта она не возымела...

    Само последнее сочинение — нехилый баян в рамках топика.
    Re[21]: Синтаксический оверхед - Новая порция
    От: Трурль  
    Дата: 28.06.05 10:09
    Оценка:
    Здравствуйте, Cyberax, Вы писали:

    C>Чего не так?

    200!
    Re[12]: Народ упорно не врубается
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 28.06.05 10:12
    Оценка: :)
    Здравствуйте, Privalov, Вы писали:

    P>Здравствуйте, xBlackCat, Вы писали:


    К>>>Эх, вот бы эту энергию и на благо человечества


    BC>>Баян! Я первый эту фразу сказал


    P>Кто бы ни сказал, должного эффекта она не возымела...


    P>Само последнее сочинение — нехилый баян в рамках топика.


    Баянами будем меряться?
    Re[9]: Народ упорно не врубается
    От: Privalov  
    Дата: 28.06.05 10:12
    Оценка: +1
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Понимаете? break и goto на конец цикла while тоже ЗАВЕРШАЮТ его, а вовсе не прерывают. После этого начинает выполняться СЛЕДУЮЩАЯ после цикла инструкция. И она не может наперед знать причину завершения цикла, а должна ее динамически узнавать.


    Примерно так ищется первый отрицательный элемент:

      for (i = 0; i < SIZE; i++)
      {
         if (a[i] < 0) 
            break;
      }
      if (i == SIZE)  // Не найден.
       ......
      else
       =========      // Найден.
       ......


    И что, опять нельзя узнать?
    Re[13]: Народ упорно не врубается
    От: Privalov  
    Дата: 28.06.05 10:16
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Баянами будем меряться?


    Дак весь топик кто-то чем-то меряется. Вон избыточность (оверхед по-русски) уже сколько меряют, и ничего. Все какое-то разнообразие.Посмотрим, чей баян баянистее, а потом еще конкурс на самый баянистый баян всех времен и народов объявим. Победителю — приз: сборник баянов.
    Re[9]: Народ упорно не врубается
    От: Mamut Швеция http://dmitriid.com
    Дата: 28.06.05 10:17
    Оценка:
    СГ>
  • А что в Си?

    СГ>В С/C++/C#/Java цикл while может быть завершен вовсе не только одним способом, а несколькими: добавляется break и goto на конец цикла (кроме Java, там goto нет).


    СГ>Понимаете? break и goto на конец цикла while тоже ЗАВЕРШАЮТ его, а вовсе не прерывают. После этого начинает выполняться СЛЕДУЮЩАЯ после цикла инструкция. И она не может наперед знать причину завершения цикла, а должна ее динамически узнавать.


    Тьфу, блин. Я так и не понял, чем это плохо. Тем более, что никто не мешает и в С++ написать while/for с одной только точкой выхода.

    А в Обероне единственный плюс от LOOP'a — это возможность выйти из нескольких вложенный циклов сразу.


  • dmitriid.comGitHubLinkedIn
    Re[10]: Народ упорно не врубается
    От: Privalov  
    Дата: 28.06.05 10:21
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>А в Обероне единственный плюс от LOOP'a — это возможность выйти из нескольких вложенный циклов сразу.


    ...который обернется нехилым минусом, если промахнуться с количеством циклов, из которых нужно выйти сразу.
    Re[10]: Идеологически правильный мегарулез
    От: Кодт Россия  
    Дата: 28.06.05 10:39
    Оценка: +1
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Пацак, Вы писали:


    СГ>!(a < 10) — ЗАВЕРШАЕТ

    СГ>break — ЗАВЕРШАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!
    СГ>goto на конец — ЗАВЕРШАЕТ

    СГ>return — ПРЕРЫВАЕТ

    СГ>throw куда подальше — ПРЕРЫВАЕТ
    СГ>goto куда подальше — ПРЕРЫВАЕТ
    СГ>assert — ПРЕРЫВАЕТ

    "И незачем так орать" (Кролик).

    В чём разница между завершением и прерыванием (в данном контексте)?

    Так или иначе, если выполнение цикла останавливается, мы покидаем тело цикла штатным способом, оказываясь в предсказуемой точке программы и в предсказуемом же состоянии (т.е. можно говорить о пост-условиях и инвариантах) — то мы имеем дело с завершением.
    Поэтому
    — ложное условие цикла
    — break, return, goto за пределы тела
    завершают.
    return, вдобавок ко всему, завершает процедуру.

    А вот throw и assert — действительно, прерывают (потому что из контекста невозможно предсказать дальнейшие действия).

    Впрочем, если рассматривать исключения как "теневую систему типов", то throw тоже является способом завершения.
    Перекуём баги на фичи!
    Re[10]: Народ упорно не врубается
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 28.06.05 10:41
    Оценка:
    Здравствуйте, Privalov, Вы писали:

    P>И что, опять нельзя узнать?


    Что нельзя узнать?
    Re[9]: Народ упорно не врубается
    От: Mr. None Россия http://mrnone.blogspot.com
    Дата: 28.06.05 10:44
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Попробую объяснить свою мысль еще раз


    Я так понял мои посты вы игнорируете, по причине не знания ответа... Ну что ж буду говорить просто так, может кто и согласиться со мной...


    СГ>
  • Универсальный цикл LOOP
    [skipped] — не вижу ничего существенного и никакого смысла для спора.


    СГ>
  • Разница между завершением и прерыванием цикла

    СГ>После того как цикл завершается начинает выполняться следующая после него интсрукция — "СледующаяИнструкция;".

    СГ>Если цикл прерывается, то управление передается в неизвестном (для него) направлении, и следующая после него инструкция — "СледующаяИнструкция;" — УЖЕ НЕ ВЫПОЛНЯЕТСЯ!
    СГ>...Во всех этих случаях управление передается в неизвестном (для "самого цикла") направлении, и следующая после него инструкция — "СледующаяИнструкция;" — уже не выполняется. Вот в чем состоит отличие между завершением цикла и прерыванием цикла.

    Циклу глубоко фиолетово, на какю инструкцию совершён переход. Более того, он всегда знает, на какую именно инструкцию переход осуществляется, будь то goto, return, break или нормальное завершение по условию... Почему — это вам в архитектуру x86 и язык ассемблер, если простыми словами, то для выполнения этих инструкций нужно знать точный адрес точки перехода. Есть единственный метод "завершения" цикла, при котором точка перехода неизвестна — это выброс исключения...

    СГ>
  • Количество условий завершения цикла

    СГ>Если инструкция "СледующаяИнструкция;" когда-нибудь будет выполнена, значит цикл все-таки завершился, а раз он завершился, значит сработало какое-то из условий завершения c1 или c2 или c3 и т.д. А теперь приготовьтесь — сейчас будет ключевая мысль. На момент написания программы не известно какое именно из условий ci сработает, это можно выяснить только лишь динамически во время работы программы. То есть "СледующаяИнструкция;" не знает наперед почему завершился цикл, а она должна это динамически узнать.


    Применение любого из указанных методов выхода, за исключением return и throw, непосредственно контролируется автором цикла, поскольку они имеют воздействие только в локальном контексте, которому принадлежит цикл. Поэтому нет никаких сложностей с тем, чтобы обеспечить нужные гарантии завершения цикла, если этого требует алгоритм. Бывают алгоритмы, в которых таких условий может быть несколько, причём такие алгоритмы бывают даже в обероне и даже в обероне в таком случае придётся выполнять динамическую проверку.
    Пример (поиск символа в строке):
    int i = 0;
    while(str[i] != ch || str[i] != 0) i++;
    if(str[i] == 0)
        // символ не найден
    else
        // символ найден

    Или вы утверждаете, что в обероне вы обойдётесь без последней проверки? Извините, в силу своего не очень маленького опыта в программировании не поверю в это!

    А делать поверку просто так не всякий случай — извинте это нонсенс... Или вы утверждаете, что всегда нужно делать так, только потому что в цикле невзначай, по какому-то щучьему велению могут оказаться break`и:
    long fact = 1;
    int i = 0;
    for(i = 1; i < 10; i++) fact *= i;
    if(i < 10)
    {
        // по какой-то причине цикл не выполнился до конца...
    }

    Если да, то можете дальше не читать, и дальнейший спор я считаю бессмысленным, по причине вашей фанатичной упёртости.

    Есть 2 способа выхода из цикла при котором автор кода использующего цикл не контролирует его код return и выброс исключения. В этом случае гарантии нужного завершения цикла предоставить не удасться и придётся выполнять динамическую проверку. НО так будет и в C++, и в Обероне, и в любом другом языке, потому что:
    1) результат работы функции вам проверить всё равно необходимо, если таковой есть, иначе зачем вы её вызывали;
    2) перехватить исключение (именно это и есть динамическая проверка на выход посредством ислючения) вам придётся, анче ваша программа завершиться.

    Вот и выходит, сударь, что вся ваша теория с прерыванием/завершением цикла и гарантиями мало того, что не имеет никакого смысла, но более того — ошибочна.
    Единственный случай, при котором потребуются дополнительные проверки — это дальний goto в середину локального контекста, но это справедливо не только для циклов, но и для любых других управляющих структур. Поэтому его лучше не сипользовать без сущей на то необходимости.
  • Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
    Re[11]: Идеологически правильный мегарулез
    От: Кодт Россия  
    Дата: 28.06.05 10:44
    Оценка: 1 (1) :))) :)
    Здравствуйте, Дарней, Вы писали:

    Д>Здравствуйте, Сергей Губанов, Вы писали:


    Д>взялся бы ты лучше за функциональные языки, честное слово


    Ужасужасужас. Как сейчас представляю:
    "Эрланг супротив Оберона — сынок, в нём нет статической типизации. Лисп — ваще сынок, там по скобкам оверхед. Джей и Кей — пара братьев-уродцев, совершенно нечитаемый код. А чтобы на Обероне ФП-программы писать, достаточно взять исходники блекбокса и в двадцати местах руками поправить. Делов-то".
    Перекуём баги на фичи!
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.