OberonCore
https://forum.oberoncore.ru/

Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти
https://forum.oberoncore.ru/viewtopic.php?f=6&t=2290
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Среда, 27 Январь, 2010 19:10 ]
Заголовок сообщения:  Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти

Не уверен, что тема в правильном форуме...
Просто способ, который сейчас часто применяю. Сильно связано с RETURN в Оберон-7.
Код:
... операторы, определяющие значение a
a := ...
IF a THEN
  ... операторы, определяющие значение b
  b := ...
  IF b THEN
    ... операторы, определяющие значение c
    c := ...
    IF c THEN
      ...
    ELSE
      ...
    END
  ELSE
    ...
  END
ELSE
  ...
END

Код:
... операторы, определяющие значение a
ok := a;
IF ~ok THEN
  ...
END;
IF ok THEN
  ... операторы, определяющие значение b
  ok := b;
  IF ~ok THEN
    ...
  END
END;
IF ok THEN
  ... операторы, определяющие значение c
  ok := c;
  IF ~ok THEN
    ...
  END
END

Ощущения (проверенные практикой) --- читабельность повышается. Работать с кодом много легче (порезан на независимые последовательно идущие куски).

Если кого волнует скорость (лишние проверки).
1) Да хоть и в ущерб скрости, пока не заметно. Главное читабельнее.
2) Не факт что в ущерб. См. след. два сообщения

Автор:  Info21 [ Среда, 27 Январь, 2010 19:11 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

Всегда так поступаю в подобных случаях.

Автор:  Евгений Темиргалеев [ Среда, 27 Январь, 2010 19:13 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

Part II: IA-64 Optimization Guide писал(а):
11.2.2 Predication in IA-64
Now that the performance implications of branching have been described, this section overviews predication – the primary IA-64 mechanism used by optimizations described in this section.

Almost all IA-64 instructions can be tagged with a guarding predicate. If the value of the guarding predicate is false at execution time, then the predicated instruction’s architectural updates are suppressed, and the instruction behaves like a nop. If the predicate is true, then the instruction behaves as if it were unpredicated. There are a small number of instructions such as unconditional compares and floating-point square-root and reciprocal approximate instructions whose qualifying predicate do not operate as described above. See Part I: IA-64 Application Architecture Guide for additional information.

Автор:  Евгений Темиргалеев [ Среда, 27 Январь, 2010 19:15 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

IA-64 Application Instruction Set Architecture Guide Revision 1.0 писал(а):
2.8 Predication
Predication is the conditional execution of instructions. Conditional execution is implemented through branches in traditional architectures. IA-64 implements this function through the use of predicated instructions. Predication removes branches used for conditional execution resulting in larger basic blocks and the elimination of associated mispredict penalties.

To illustrate, an unpredicated instruction
Код:
        r1 = r2 + r3
when predicated, would be of the form
Код:
        if (p5) r1 = r2 + r3

In this example p5 is the controlling predicate that decides whether or not the instruction executes and updates state. If the predicate value is true, then the instruction updates state. Otherwise it generally behaves like a nop. Predicates are assigned values by compare instructions.

Predicated execution avoids branches, and simplifies compiler optimizations by converting a control dependence to a data dependence. Consider the original code:
Код:
        if (a>b) c = c + 1
        else d = d * e + f
The branch at (a>b) can be avoided by converting the code above to the predicated code:
Код:
        pT, pF = compare(a>b)
        if (pT) c = c + 1
        if (pF) d = d * e + f
The predicate pT is set to 1 if the condition evaluates to true, and to 0 if the condition evaluates to false. The predicate pF is the complement of pT. The control dependence of the instructions c = c + 1 and d = d * e + f on the branch with the condition (a>b) is now converted into a data dependence on compare(a>b) through predicates pT and pF (the branch is eliminated). An added benefit is that the compiler can schedule the instructions under pT and pF to execute in parallel. It is also worth noting that there are several different types of compare instructions that write predicates in different manners including unconditional compares and parallel compares.


Автор:  Сергей Губанов [ Четверг, 28 Январь, 2010 14:49 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

А я с вами не согласен.

Вспомогательный флаг = программист не справился с управлением.

В подобных случаях стараюсь свести к канонической форме линейного поиска (даже ценой введения процедур):
Код:
IF C0(...) THEN
  A0(...)
ELSIF C1(...) THEN
  A1(...)
ELSIF C2(...) THEN
  A2(...)
ELSE
  ...
END
Любой ветвистый if-овый код может (и должен :D ) быть сведён к этой канонической форме.

Автор:  Сергей Губанов [ Четверг, 28 Январь, 2010 14:51 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

А причём тут IA-64? Кто-нибудь Итаниумы живьём видел?

Автор:  Евгений Темиргалеев [ Четверг, 28 Январь, 2010 15:34 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

Евгений Темиргалеев писал(а):
Если кого волнует скорость (лишние проверки).
1) ...
2) Не факт что в ущерб. См. след. два сообщения

Если не ошибаюсь, код с ok близок к указанному виду оптимизации для ia-64.

Автор:  Peter Almazov [ Четверг, 28 Январь, 2010 15:50 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

В заголовке темы ошибка, не "1 ур.вл-ти", а 2.
Вместо 3, но с введением дополнительной сущности.
Изврат это.

Автор:  Евгений Темиргалеев [ Четверг, 28 Январь, 2010 16:14 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти

Peter Almazov писал(а):
В заголовке темы ошибка, не "1 ур.вл-ти", а 2.
согласен
Peter Almazov писал(а):
Вместо 3,
дана схема-пример 3 ур. работающая для произв.

Автор:  Александр Шостак [ Суббота, 30 Январь, 2010 05:20 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти

По мне так нормально и естественно смотрится, если не больше трёх вложений:
Код:
// Если файловый пак удачно загружен
      IF FileLangPack <> NIL THEN BEGIN
         // Ищем там указанный модуль
         IF FindLangUnit(FileLangPack, Client.Name, LangUnit) THEN BEGIN
            // Ищем там строки указанного языка
            IF FindLangStrings(LangUnit, LangName, LangStrings) THEN BEGIN
               // Очищаем старый язык клиента
               FreeOldClientLang(Client);
               // Записываем данные о новом
               SetClientLang(Client, LangName, LangStrings, C_FILEPACK);
               // Следующий клиент...
               CONTINUE;
            END; // .if
         END; // .if
      END; // .if

Автор:  Евгений Темиргалеев [ Суббота, 30 Январь, 2010 21:51 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти

Стараюсь придерживаться везде одного стиля...

Ваш пример, мне кажется, не совсем подходит. Ветки ELSE отсутствуют. И (по всей видимости код не опущен) вложенные посл-ти операторов начинаются сразу с IF. На КП я бы записал:
Код:
IF (FileLangPack # NIL)
  & FindLangUnit(FileLangPack, Client.Name, LangUnit)
  & FindLangStrings(LangUnit, LangName, LangStrings) THEN
  ...
END

Автор:  Александр Шостак [ Суббота, 30 Январь, 2010 22:36 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти

А если потом появится дополнительный код, который нужно вызвать после очередного IF, и это не простая логическая функция? Вам придётся разбивать условие на блоки. Если я не ошибаюсь, по той же причине из Оберона убрали паскалевский IF ... THEN ...; и заменили на блочный IF THEN ELSE END.

Автор:  Евгений Темиргалеев [ Суббота, 30 Январь, 2010 23:26 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 2 ур. вл-ти

Стараюсь придерживаться везде одного стиля (см. первый пост). Там один блок на два разбить не проблема. Выше -- как я бы переписал Ваш код один в один.

Berserker писал(а):
Если я не ошибаюсь, по той же причине из Оберона убрали паскалевский IF ... THEN ...; и заменили на блочный IF THEN ELSE END.
Составной оператор (операторные скобки) BEGIN ... END "заменён" на StatementSequence = Statement {; Statement}.
Как следствие изменились IF и остальные structured statemens:
IF expr THEN statement [ELSE statement] заменилось на IF expr THEN StatementSequence [ELSE StatementSequence] END

Автор:  Евгений Темиргалеев [ Среда, 10 Февраль, 2010 22:55 ]
Заголовок сообщения:  Re: Замена IF произв-й влож-ти на последовательные с 1 ур. вл-ти

Сергей Губанов писал(а):
А я с вами не согласен.
...
Любой ветвистый if-овый код может (и должен :D ) быть сведён к этой канонической форме.
Попробовал переписать пару кусков с ok указанным способом. Появились лишние процедуры, но "независимые куски" стали явно видны в ветках IF.

Запись с ok я бы назвал в этом случае (ненужной) оптимизацией. Спасибо за наводку.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/