Re[8]: Синтаксический оверхед
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.06.05 07:59
Оценка:
Здравствуйте, faulx, Вы писали:

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


A>>Ээээ, нет Не путайте национальные системы измерений и профессиональные Футы с милями тоже "юзерские".


F>А какие же профессиональные единицы измерения длины? Кабельтовы с теми же милями, как у моряков? Или мы, как программисты, считаем, что в одном километре 1024 метра?


Ясен перец, а метр делится на 1024 миллиметра...
Re[6]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 24.06.05 08:00
Оценка:
Здравствуйте, faulx, Вы писали:

F>Посмотрел в интернете, кажется, Паскаль действительно не запрещает. Позор! Интересно, как с этим в Аде и Обероне?


В Дельфи (начиная с какой-то версии) запрещает (компилятор ругается — переменная цикла всегда размещается в регистре процессора и, вообще говоря даже не обязана сохранятся потом в память (после завершения цикла ее значение НЕ ОПРЕДЕЛЕНО), об этом даже много спорили на форумах когда выяснялось, что дельфийский for работает значительно быстрее чем сишный for для целых чисел (ведь сишный for обязан сохранять значение переменной-счетчика из регистра обратно в оперативную память на каждой итерации, а это долго), лично однажды проверял), а в Обероне 2 FOR — это сахар над WHILE — запрещать нечего. В Ада — понятия не имею.
Re[5]: FOR
От: faulx  
Дата: 24.06.05 08:10
Оценка:
Здравствуйте, Курилка, Вы писали:

СГ>>>Дело в том, что в Обероне (1987) цикла FOR нет вообще (вспомните: циклы бывают всего трех типов... и FOR-а среди них нет).


СГ>>>Под "давлением общественности", по "массовым просьбам трудящихся" или по каким-то иным не известным нам причинам в Обероне 2 (1992) цикл FOR всё-таки появился.


F>>Любопытно было бы выслушать ваше мнение по поводу Лисповского мега-цикла.


К>Да ну, ты что, Оберон — же вершина совершенства, соответственно круче его ничего не может быть по определению, какие там лиспы, функциональные языки — ересь это всё, не гоже адептам правильной веры это трогать даже


Жаль будет, если он промолчит. Мне было бы действительно интересно услышать его мнение. Дело в том, что Лисповский loop — это пункт ожесточенных споров в среде самих программистов на Лиспе.

Кстати, если кто не в курсе. В Лиспе loop со всеми своими наворотами — не часть языка, а всего лишь макрос из стандартной библиотеки. Если бы Оберон имел такие же возможности по работе с макросами, как Лисп, никакого "давления общественности" не возниколо бы, и не пришлось бы менять язык — синтаксический сахар, преобразующий for в while, любой желающий мог бы реализовать самостоятельно.
Re[10]: Яркий пример
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.06.05 08:16
Оценка: +3 -1
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Признаться честно, мне не известны тонкости реализации конвееров. Но то что данные из оперативной памяти грузятся в регистр процессора много тактов всем известный факт. Так вот, очевидно, что для ускорения работы надо "смотреть в перед" и загружать те данные, которые в скором времени понадобятся заранее. Спрашивается как быть процессору если встречается оператор ветвления? Данные из какой ветви загружать заранее? Предпочтение отдается главной ветви (т.е. коду в THEN, а код в ELSE считается исполняемым с меньшей вероятностью. Прошу прощения если не совсем прав, еще раз напоминаю, что мне не известны тонкости реализации конвееров.
Признаться, я не великий эксперт по написанию компиляторов. Но, имхо, язык, в котором эффективность результирующей программы зависит от порядка веток в IF — студенческая недоделка. Программист на языке высокого уровня должен быть как можно сильнее изолирован от подробностей архитектуры. Потому что эти подробности меняются уж очень часто. И вместо обучения программиста этим подробностям надо обучать компилятор.
Иначе мы дойдем до маразма. Сергей, Оберон случайно не советует декларировать частоиспользуемые переменные до редкоиспользуемых? С мотивацией типа "у тех, кто декларирован первыми, больше шансов попасть в регистр, а не в стек. А современные процессоры быстрее работают с регистрами". Похожая логика, не так ли?
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Яркий пример
От: Cyberax Марс  
Дата: 24.06.05 08:17
Оценка:
Сергей Губанов wrote:

> while(true) = LOOP


Так и думал, что это скажете...

Изменим на "while(game_state==running_main_loop)"

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[6]: FOR
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.06.05 08:23
Оценка:
Здравствуйте, faulx, Вы писали:

F>Кстати, если кто не в курсе. В Лиспе loop со всеми своими наворотами — не часть языка, а всего лишь макрос из стандартной библиотеки. Если бы Оберон имел такие же возможности по работе с макросами, как Лисп, никакого "давления общественности" не возниколо бы, и не пришлось бы менять язык — синтаксический сахар, преобразующий for в while, любой желающий мог бы реализовать самостоятельно.


В курсе конечно, кстати вроде бы как loop — одна из частей (не единственная) лиспа вызывающая споры среди самих лисперов, т.е. одни говорят — в loop сила, другие — не очень лисповский синтаксис, не совсем ложится на лисповские программы. Но в лиспе всегда есть выбор — используй всё, что хочешь, а если есть свои идеи — придумывай свой синт. сахар, благо макросы дают огромные возможности.
Re[6]: Синтаксический оверхед
От: Пацак Россия  
Дата: 24.06.05 08:28
Оценка:
Здравствуйте, faulx, Вы писали:

F>
F>block_with_overview(on_enter(); at_exit())
F>{
F>   f();
F>}
F>


F>Исполняется в порядке:


F>
F>on_enter();
F>f();
F>at_exit();
F>


F>Такой блок — тоже, по сути, декларация того, что мы будем делать в блоке. Сразу видно, чем все закончится. По коду бегать глазами не надо.


Ну что ж — такой блок можно представить (в известном приближении конечно) как некий метод с двума callback'ами, вызываемыми в начале и в конце соответственно. Довольно часто практикуемое решение вроде.

F>Ведь, наверное, calculate_current_increment() вызывается не просто так, а туда передаются какие-то параметры.


Ну почему же... Он может быть методом некоего static — объекта, например. Или просто состояние текущего объекта меняется в цикле и calculate_current_increment() это учитывает, давая поправку после каждой итерации.

F>Речь не про конкретный язык, а про синтаксис, а он у циклов в C и C++ одинаковый. А поскольку, несмотря на существование итераторов и стандартных алгоритмов, цикл for в C++ существует и, по-видимому, широко используется, проблема его синтаксической избыточности (долой слово "оверхэд"!) остается.


Тем не менее итераторы никто пользовать не запрещает. И если человек пользуется не ими, а обычным циклом со счетчиком — то наверное он знает, что делает. Иначе это уже проблема программиста, а не языка.
Ку...
Re[7]: Синтаксический оверхед
От: Sergey J. A. Беларусь  
Дата: 24.06.05 08:34
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

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


Давайте, вы когда говорите ерунду, будете ставить смайлики ? А то неокрепшие умы могут и поверить....

Итак цикл.
int _tmain(int argc, _TCHAR* argv[])
{
    for(int i=0;i<10;i++)
    {
        printf("%d\n", i);
    }
    return 0;
}


Код.
_main    PROC NEAR                    ; COMDAT

; 8    : {

    push    esi

; 9    :     for(int i=0;i<10;i++)

    xor    esi, esi
$L66482:

; 10   :     {
; 11   :         printf("%d\n", i);

    push    esi
    push    OFFSET FLAT:??_C@_03PMGGPEJJ@?$CFd?6?$AA@
    call    _printf
    add    esp, 8
    inc    esi
    cmp    esi, 10                    ; 0000000aH
    jl    SHORT $L66482

; 12   :     }
; 13   :     return 0;

    xor    eax, eax
    pop    esi

; 14   : }

    ret    0
_main    ENDP


i это esi. Теперь ткните меня в строку, где оно сохраняется в память ?

СГ>а в Обероне 2 FOR — это сахар над WHILE — запрещать нечего. В Ада — понятия не имею.


Не только в Ада, не только ....
Я — свихнувшееся сознание Джо.
Re[7]: Синтаксический оверхед
От: faulx  
Дата: 24.06.05 08:39
Оценка:
Здравствуйте, Пацак, Вы писали:

П>Ну что ж — такой блок можно представить (в известном приближении конечно) как некий метод с двума callback'ами, вызываемыми в начале и в конце соответственно. Довольно часто практикуемое решение вроде.


Тем не менее выглядит не очень-то наглядно. Это было, собственно, к подтверждению тезиса о том, что ситуация, когда очередность записи операторов в программе соответствует очередности их вызова при выполнении, более наглядна, чем когда не соответствует.

F>>Ведь, наверное, calculate_current_increment() вызывается не просто так, а туда передаются какие-то параметры.


П>Ну почему же... Он может быть методом некоего static — объекта, например. Или просто состояние текущего объекта меняется в цикле и calculate_current_increment() это учитывает, давая поправку после каждой итерации.


Это все понятно. Вопрос в том, какой случай более распространен.

П>Тем не менее итераторы никто пользовать не запрещает. И если человек пользуется не ими, а обычным циклом со счетчиком — то наверное он знает, что делает. Иначе это уже проблема программиста, а не языка.


Речь, наверное, все-таки не про итераторы, а про стандартные алгоритмы. В C++ их использовать неудобно по причине отсутствия родных лямбд и локальных функций (Про boost я знаю.) Но! Раз цикл есть, почему не обсудить его. Да и не всегда стандартные алгоритмы удобны. Скажем, с матрицами гораздо естественнее работать по индексам.
Re[7]: Синтаксический оверхед
От: merlin.fs Украина  
Дата: 24.06.05 08:39
Оценка:
Здравствуйте, Amidlokos, Вы писали:

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


A>Кстати, сишные for-ы позволяют в зависимости от условий крутиться как вперёд, так и назад:


A>
A>int step = (condition)? 1 : -1;

A>for (int i = start; (i < count && i >= 0); i += step)
A>{
A>    blah_blah_blah(i);
A>} 
A>


A>Пусть один раз в жизни, но мне такое встречалось В паскале пришлось бы через while писать. Но это всё скорее просто к слову...


Не знаю как кто, но я если в делфях и использую for, то или для какого-то заполнения (типа тестов) или для обхода массива (то есть: где статические данные и нужна скорость).
Во втором случае: (типа такого)
for i := 0 to count - 1 do
  arr[i] := _чегото_там_;

(если включена оптимизация) скорее всего скомпилится код, в котором этот цикл будет идти в обратную сторону.
Но это, тоже так к слову

ИМХО для таких циклов (как в Вашем примере) лучше пользоваться while/repeat until, и при рефакторинге легче будет.

PS. конечно это может у меня уже привычка от паскаля
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[2]: Идеологически правильный мегарулез
От: Пацак Россия  
Дата: 24.06.05 08:50
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Конечно, если вложенные циклы, тоже LOOP-ные, то описанный тут механизм работать не будет (EXIT выведет только на конец ближайшего LOOP-а).


... то есть пример снова чисто синтетический, зависящий от кучи условностей и встречающийся на практике исключительно редко. Я, например, не помню ни одного случая когда мне приходилось покидать три (!!!) вложенных цикла как-то иначе, нежели чем через except или return. И уж тем более ни разу не приходилось задумываться лупные они или не лупные.
Ку...
Re[7]: Синтаксический оверхед
От: Трурль  
Дата: 24.06.05 09:42
Оценка:
Здравствуйте, Amidlokos, Вы писали:

A>Трурль, а вы-то куда на своих наезжать вылезли? Напоминаю, в Обероне массив тоже начинается с нуля
Автор: Sergey J. A.
Дата: 24.06.05

Что поделааешь. Амикус Оберон сед магик амикус веритас.
Re[8]: Синтаксический оверхед
От: Трурль  
Дата: 24.06.05 09:48
Оценка:
Здравствуйте, faulx, Вы писали:


F>Или мы, как программисты, считаем, что в одном километре 1024 метра?

Как программисты, мы должны использовать кибиметры.
Re[2]: Идеологически правильный мегарулез
От: Hobot Bobot США  
Дата: 24.06.05 09:50
Оценка: +3
Здравствуйте, Сергей Губанов, Вы писали:


СГ>Мы можем выйти из нескольких вложенных WHILE/REPEAT циклов. Внешний цикл делаем LOOP-ным, а все вложенные циклы делаем WHILE/REPEAT-ными. Тогда EXIT прервет все циклы сразу. А вот если бы EXIT прерывал бы не только LOOP-ные циклы, но и все остальные, то из нескольких вложенных циклов (без goto или RETURN) выйти было бы (по быстрому) нельзя.

СГ>Конечно, если вложенные циклы, тоже LOOP-ные, то описанный тут механизм работать не будет (EXIT выведет только на конец ближайшего LOOP-а).

По-моему о таком надо молчать и не признаваться...
А то только что рассказывали что из while может быть ровно один выход и вот на тебе...
За такие решения вообще убивать надо немедленно. Вот понадобится один из вложенных while на loop переделать, например, и привет...
What a piece of work is a man! how noble in reason! how infinite in faculty! in form and moving how express and admirable! in action how like an angel! in apprehension how like a god! the beauty of the world! the paragon of animals!
Re[3]: Идеологически правильный мегарулез
От: Пацак Россия  
Дата: 24.06.05 10:18
Оценка:
Здравствуйте, Hobot Bobot, Вы писали:

HB>По-моему о таком надо молчать и не признаваться...

HB>А то только что рассказывали что из while может быть ровно один выход и вот на тебе...
HB>За такие решения вообще убивать надо немедленно. Вот понадобится один из вложенных while на loop переделать, например, и привет...

Не-е-е-е-е-е-е, стоп!!! ИМХО нас морочат.
Я чот не пойму. Не так давно СГ убеждал всех, что EXIT из while вывести не может и что компилитор не даст соорудить такую инструкцию и вот — на тебе! Этак я тогда из любого while могу то же самое сделать:

LOOP
    WHILE (1=1) DO 
         IF ... THEN EXIT END;
    END
    EXIT;
END


2СГ: так пропустит компилятор такую конструкцию или не пропустит? Позволяет писать EXIT из WHILE или не позволяет?
Ку...
Re[4]: Идеологически правильный мегарулез
От: Sergey J. A. Беларусь  
Дата: 24.06.05 10:26
Оценка: 6 (2) +3 :)))
Здравствуйте, Пацак, Вы писали:

П>Здравствуйте, Hobot Bobot, Вы писали:


П>Не-е-е-е-е-е-е, стоп!!! ИМХО нас морочат.

П>Я чот не пойму. Не так давно СГ убеждал всех, что EXIT из while вывести не может и что компилитор не даст соорудить такую инструкцию и вот — на тебе! Этак я тогда из любого while могу то же самое сделать:

Я приведу компиляющийся код, иначе Серегй объяснит где у вас ошибка в листинге, и уйдёт с гордо поднятой головой, проигнорировав остальное.

  PROCEDURE Test*();
  VAR  i: INTEGER;
  BEGIN
        i:=10;
        LOOP
            WHILE i # 0 DO
                DEC(i);
                EXIT;
            END
        END;
  END Test;


Дааа... какая неожиданность. После WHILE i не равно 0 !
Я — свихнувшееся сознание Джо.
Re[3]: Идеологически правильный мегарулез
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 24.06.05 10:27
Оценка: -1 :)))
Здравствуйте, Hobot Bobot, Вы писали:

HB>А то только что рассказывали что из while может быть ровно один выход и вот на тебе...


Дык выход выходу рознь.

Одно дело завершить цикл WHILE/REPEAT и перейти к выполнению следующей за ним инструкции — что возможно лишь одним способом (а именно удовлетворить условиям завершения),

а другое дело покинуть его (вместе со следующей после него инструкцией) вовсе по RETURN или по EXIT объемлющего "более крупного" цикла LOOP.

Покинуть можно еще по ложному ASSERT() — прекращает выполнение текущей команды и по HALT() — завершает работу.
Re[20]: Яркий пример
От: Cyberax Марс  
Дата: 24.06.05 10:43
Оценка:
Трурль wrote:

>

>A>IF oneItem # anotherItem THEN
>A>
>
>
> A>Где в этом коде гарантия того, что я сравниваю значения переменных а
> не адреса процедур?
>
>a+b
>
> Где в этом коде гарантия того, никакие файлы не удаляются?

А где гарантия того, что при
IF oneItem # anotherItem THEN

Не происходит исключение, из-за того, что инлайновая ассемблерная
вставка в Обероне изменила код функции проверки равенства строк на код
форматирования винчестера?

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[8]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 24.06.05 10:45
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>Давайте, вы когда говорите ерунду, будете ставить смайлики ? А то неокрепшие умы могут и поверить....


Вы определили i внутри for, а надо было определить ее снаружи так как в Delphi, иначе смысл сравнения отсутствует. Почему сишный for медленнее дельфийского я уже объяснил: 1) в Delphi значение переменной цикла for не определено после его завершения, 2) значение переменной цикла запрещено самому менять. И вообще, по данному вопросу есть громадные обсуждения в других форумах. Ссылки, к сожалению, дать не могу, не сохранил. Кажется на delphikingdom...
Re[4]: Идеологически правильный мегарулез
От: Sergey J. A. Беларусь  
Дата: 24.06.05 10:54
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Одно дело ....


СГ>а другое дело ...


Так значит, мало того, что правило "один вход-один выход" работает не для всех циклов, но ещё и не всегда для остальных ?
Вам ещё не кажется, что Оберон это просто какой-то уродец ?
Я — свихнувшееся сознание Джо.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.