Автор Тема: Модифицированный синтаксис Оберона  (Прочитано 180555 раз)

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Модифицированный синтаксис Оберона
« Ответ #210 : Март 14, 2012, 04:16:20 pm »
CASE в последнем обероне определён для подряд идущих целых чисел и должен работать существенно быстрее чем цепочка ELSIF по тем же самым числам поскольку должен делать переход сразу в нужное место (это по сути параметризованный целым числом goto).

CASE для не чисел или для не подряд идущих чисел (короче, если нельзя его соптимизировать в прямой переход) не нужен ибо не будет быстрее того же самого ELSIF.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Модифицированный синтаксис Оберона
« Ответ #211 : Март 14, 2012, 04:18:04 pm »
DO WHILE вместо REPEAT UNTIL синтаксиса не упрощает, а лишь уменьшает лексику на два слова.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #212 : Март 14, 2012, 04:28:22 pm »
CASE в последнем обероне определён для подряд идущих целых чисел и должен работать существенно быстрее чем цепочка ELSIF по тем же самым числам поскольку должен делать переход сразу в нужное место (это по сути параметризованный целым числом goto).
Ну, собственно современные и не очень компиляторы цепочку соответствующих if .. else if также оптимизируют таблицей переходов. То есть код генерируется идентичный case'у. Это очень простая и древняя оптимизация.

То есть для чего-то такого:
int main() {
    int i = getchar();
    if (i==1) i++;
    else if (i==2) i--;
    putc(i);
    return 0;
}

Получается вот такое:
define i32 @main() nounwind uwtable {
  %1 = tail call i32 (...)* @getchar() nounwind
  switch i32 %1, label %4 [
    i32 1, label %2
    i32 2, label %3
  ]

; <label>:2                                       ; preds = %0
  br label %4

; <label>:3                                       ; preds = %0
  br label %4

; <label>:4                                       ; preds = %3, %2, %0
  %i.0 = phi i32 [ 2, %2 ], [ 1, %3 ], [ %1, %0 ]
  %5 = tail call i32 (...)* @putc(i32 %i.0) nounwind
  ret i32 0
}

declare i32 @getchar(...) nounwind

declare i32 @putc(...)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #213 : Март 14, 2012, 05:00:19 pm »
Я бы убрал CASE. Для частных случаев можно определить решение в стандартной библиотеке.
Остается лишь навороченный FOR...(обсуждали на соседнем форуме), IF->ELSIF..., WHILE<->DO

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #214 : Март 14, 2012, 05:15:26 pm »
Я бы убрал CASE. Для частных случаев можно определить решение в стандартной библиотеке.
Остается лишь навороченный FOR...(обсуждали на соседнем форуме), IF->ELSIF..., WHILE<->DO
Если смотреть чисто технически, то CASE это просто сахарок для некоторых частных случаев + возможность компиляторщику не заниматься анализом if'ов для оптимизации неких тривиальных случаев.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #215 : Март 14, 2012, 05:21:12 pm »
Если же смотреть с точки зрения пользователя (то есть программиста), то CASE для этих самых частных случаев существенно читабельней и понимабельней (не надо всматриваться в условия ifов). То есть смысл в CASE таки есть.

Согласен. Это как foreach против for. Да, это частный случай. Более ограниченный, но и более читабельный/выразительный для соответствующих ситуаций.

DIzer

  • Гость
Re: Модифицированный синтаксис Оберона
« Ответ #216 : Март 14, 2012, 05:22:43 pm »
DO WHILE вместо REPEAT UNTIL синтаксиса не упрощает, а лишь уменьшает лексику на два слова.
оспода, конечно  дело не  лексике - а в  каких терминах вы формулируете условия  выполнения цикла... либо  while (пока выполняется)  либо until- РЕАЛЬНАЯ проблема у новичков - в том, что что в первом случае поощряется формулировка в терминах "продолжения" во втором в терминах "окончания"
-кстати у меня есть ощущение что это есть проблема ИСКЛЮЧИТЕЛЬНО неанглоязычных....

DIzer

  • Гость
Re: Модифицированный синтаксис Оберона
« Ответ #217 : Март 14, 2012, 05:30:37 pm »
Кстати , господа - блиц - мне интересно в каких терминах вы предпочитаете формулировать цикл ( продолжения или окончания) - скажу честно, я , лично почему - то  в  большинстве случаев формулирую условие в терминах окончания... Зы конечно продолжения , простите.... :)

DIzer

  • Гость
Re: Модифицированный синтаксис Оберона
« Ответ #218 : Март 15, 2012, 04:28:07 am »
Второй момент, связка
WHILE A DO
   DO
   ............
   WHILE B;
END;

записанная по правилам Оберона выглядит ИМХО коряво...

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #219 : Март 15, 2012, 05:01:55 am »
Если смотреть чисто технически, то CASE это просто сахарок для некоторых частных случаев + возможность компиляторщику не заниматься анализом if'ов для оптимизации неких тривиальных случаев.
А может наоборот if - сахарок для частного случая?
CASE cond OF 
|TRUE: stmt1
|FALSE: stmt2
END

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #220 : Март 15, 2012, 05:23:07 am »
Если смотреть чисто технически, то CASE это просто сахарок для некоторых частных случаев + возможность компиляторщику не заниматься анализом if'ов для оптимизации неких тривиальных случаев.
А может наоборот if - сахарок для частного случая?
CASE cond OF 
|TRUE: stmt1
|FALSE: stmt2
END
if да, но не if … elif … else. Хотя конечно можно вложенных кейсов нагородить. Да что там - и if и case можно убрать оставив только while! :-)

PS.Вообще в функциональщине обычно if в оберонгвском виде отсутствует. Там именно расширенный паттернматчингом case.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #221 : Март 15, 2012, 06:14:07 am »
А может наоборот if - сахарок для частного случая?
Думаю, что нет. Если в обощённом IF используются неоднородные условия, то его нельзя преобразовать в CASE. Например, такой:
if a = 1 then ... elsif b = 2 then ... end;

DIzer

  • Гость
Re: Модифицированный синтаксис Оберона
« Ответ #222 : Март 15, 2012, 06:46:23 am »

if да, но не if … elif … else. Хотя конечно можно вложенных кейсов нагородить. Да что там - и if и case можно убрать оставив только while! :-)


Можно и гланды через зад удалять. Вопрос - ЗАЧЕМ?

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #223 : Март 15, 2012, 11:36:04 am »
Имхо CASE на сахар не очень тянет, так как кострукция достаточно громоздкая и неэстетичная.

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Модифицированный синтаксис Оберона
« Ответ #224 : Март 15, 2012, 03:55:38 pm »
Думаю, что нет. Если в обощённом IF используются неоднородные условия, то его нельзя преобразовать в CASE. Например, такой:
if a = 1 then ... elsif b = 2 then ... end;
А у нас супер-case:)
case true of a = 1: ... | b = 2: ... end;