OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 23 Сентябрь, 2019 14:03

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




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 14:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9141
Откуда: Россия, Орёл
Vlad писал(а):
Это все схоластика и мне неинтересно в нее вдаваться. Конкретный код с break/return как минимум удобнее и нагляднее.

Все споры на эту тему как раз и показывают, что это - субъективно и дело привычки. А вот то, какой вариант формально грамотнее, вполне доказуемо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 14:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Если совместить операцию чтения с возвращением статуса, то получится цикл WHILE без компромисов:

WHILE ReadNext(i) DO ... END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 15:29 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Сергей Губанов писал(а):
Если совместить операцию чтения с возвращением статуса, то получится цикл WHILE без компромисов:

WHILE ReadNext(i) DO ... END

Функция с побочным эффектом - нехорошо.

Может так?
Код:
WHILE HasNext() DO i := Next() END;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 15:45 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Вообще-то любая процедура/функция чтения сдвигающая позицию курсора является процедурой/функцией с побочным эффектом. У Вас побочным эфектом обладает функция Next().

PROCEDURE ReadInteger (OUT i: INTEGER): BOOLEAN;

возвращающая статус операции - это просто "сокращенная запись" вот такой процедуры:

PROCEDURE ReadInteger (OUT i: INTEGER; OUT status: BOOLEAN);

первый вариант этой процедуры как раз предназначен для подстановки в цикл WHILE.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 16:38 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1200
Сергей Губанов писал(а):
первый вариант этой процедуры как раз предназначен для подстановки в цикл WHILE.

И чег после этого стоят все рассуждения о преимуществах while и недостатках loop?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 16:47 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Trurl писал(а):
И чег после этого стоят все рассуждения о преимуществах while и недостатках loop?

:oops:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 15 Июнь, 2007 12:00 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Vlad писал(а):
Это все схоластика и мне неинтересно в нее вдаваться. Конкретный код с break/return как минимум удобнее и нагляднее.

Все споры на эту тему как раз и показывают, что это - субъективно и дело привычки. А вот то, какой вариант формально грамотнее, вполне доказуемо.


Докажи ;) Заодно еще докажи, что WHILE формально "правильнее" рекурсии. Я уже говорил, что формальность сама по себе ничего не стоит, если на практике она оборачивается несопровождаемым кодом.

С точки зрения сопровождения для меня, например, принципиально, чтобы для случая когда "код инициализации" по определению повторяет "код итерирования", этот код был гарантировано одинаковым. Такую гарантию дает только написание этого кода в одном экземпляре внутри цикла. А вот цикл, написанный "по общей схеме", такой гарантии мне не дает, только формальные размышления о формальности такого подхода, не учитывающие банальные человеческие факторы (читабельность и способность ошибаться).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 15 Июнь, 2007 14:17 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Vlad писал(а):
С точки зрения сопровождения для меня, например, принципиально, чтобы для случая когда "код инициализации" по определению повторяет "код итерирования", этот код был гарантировано одинаковым. Такую гарантию дает только написание этого кода в одном экземпляре внутри цикла.

Так уже переписали с WHILE и без повторений :)

Вместо
Код:
Берем_след_элемент;
WHILE Взят_успешно() DO
   Используем элемент;
   Берем_след_элемент;
END;


использовать
Код:
WHILE Прочитан_элемент(e) DO
   Используем_элемент(e);
END;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 15 Июнь, 2007 15:28 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
PGR писал(а):
использовать
Код:
WHILE Прочитан_элемент(e) DO
   Используем_элемент(e);
END;


Да, так лучше, если только написание отдельной функции того стоит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 15 Июнь, 2007 16:03 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Vlad писал(а):
PGR писал(а):
использовать
Код:
WHILE Прочитан_элемент(e) DO
   Используем_элемент(e);
END;


Да, так лучше, если только написание отдельной функции того стоит.

Кроме того, BlackBox не выполняет inline подстановку функций и при больших объёмах вычислений можно серьёзно потерять в производительности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 15 Июнь, 2007 16:06 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Vlad писал(а):
Гы :) Кстати к вопросу о "первосортных" программистах, которые пишут "правильные" циклы для использования "второсортными". Я тут глянул реализацию стандартного сишного find. Ужасайтесь :)

Код:
{
  _STLP_DIFFERENCE_TYPE(_RandomAccessIter) __trip_count = (__last - __first) >> 2;

  for ( ; __trip_count > 0 ; --__trip_count) {
    if (*__first == __val) return __first;
    ++__first;

    if (*__first == __val) return __first;
    ++__first;
...


Тут вам и множественные return (даже не break) из цикла, и switch (о ужас!) без break'ов.

P.S. Только не надо кричать, что STLPort писали "второсортные" программисты. Скромнее надо быть (c).

Могу предположить, что этот нетривиальный код - оптимизация. Ручное разворачивание цикла. Чтобы быстрее выполнялось на МП с суперскалярной архитектурой.

Однако, этот код стандартной библиотеки. Если предположить, что еще есть какие-либо системы (встроенные) с не суперскалярными МП, то там будет хуже. Выигрыша по времени нету, а места занимает больше. Гораздо больше....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 16 Июнь, 2007 16:22 

Зарегистрирован: Понедельник, 14 Май, 2007 19:33
Сообщения: 4
Евгений Темиргалеев писал(а):
Vlad писал(а):
Гы :) Кстати к вопросу о "первосортных" программистах, которые пишут "правильные" циклы для использования "второсортными". Я тут глянул реализацию стандартного сишного find. Ужасайтесь :)

Тут вам и множественные return (даже не break) из цикла, и switch (о ужас!) без break'ов.

Могу предположить, что этот нетривиальный код - оптимизация. Ручное разворачивание цикла. Чтобы быстрее выполнялось на МП с суперскалярной архитектурой.


Абсолютно верно, это ручное разворачивание цикла с целью оптимизации. И суперскалярность здесь не при чем, даже на обычном Pentium-процессоре должен быть выигрыш во времени исполнения. Дело в том, что передача управления в машинном коде выполняется медленно, поскольку приводит к очистке конвейера процессора. Соответственно, для уменьшения числа переходов делается раскрутка цикла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 17 Июнь, 2007 21:35 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Не очень понимаю все эти развороты циклов вручную, современные компиляторы сами умеют делать это тогда когда надо, более того у самого процессора есть свои "предсказатели переходов" Branch Prediction. В большинстве случаев угадывают неплохо (до 97% попадания, кажется). Вот и "разворачивай" после этого.


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

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB