Re[36]: Goto's are evil?
От: Cyberax Марс  
Дата: 09.12.05 19:53
Оценка:
eao197 wrote:

> E>>Давай так, если считаешь, что знаешь C++, то ответь на вопрос,

> заданный мной в: Re[17]: Goto's are evil?
> <http://rsdn.ru/forum/Message.aspx?mid=1515315&amp;only=1&gt;
Автор: eao197
Дата: 01.12.05

> E>>Свои знания C++ я оцениваю весьма скромно.
> R>А почему вы тогда спрашиваете? вы антисемит?
> Имхо, гораздо проще и быстрее было продемострировать знания, если
> таковые имелись.

Кстати да, вопрос очень простой. Свой любимый вопрос (про shared memory)
я даже задавать не буду

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[44]: Goto's are evil?
От: Cyberax Марс  
Дата: 09.12.05 20:04
Оценка:
reductor wrote:

> да легко

> как раз монады такие вещи очень лихо формализуют
> просто идет инверсия и хэндл сверху отдается внутрь — вообще странно,
> это даже в ООП-мире успело появиться в виде стандартного паттерна —
> inversion of control (dependency injection)

Я уже по-моему раза три сказал, что инверсия управления невозможна в
нормальном виде, если используются два ресурса с частично
перекрывающимся временем жизни. IoC умеет работать нормально только с
вложенными жизненными циклами.

Ну и в многопоточных случаях ни IoC, ни регионы (для работы с памятью)
не помогают. Но такие случаи все же достаточно редкие, так что их можно
не считать.

Мне лично один раз пришлось править программу на Erlang (чистый
функциональный язык для параллельных программ), где происходила утечка
описателей устройств (а они были очень дефецитны, утечка всего десятка
из них приводила систему в ступор). Это было ОЧЕНЬ неприятно —
приходилось делить логически единый код на куски, которые можно
вкладывать друг-в-друга. В итоге в следующей версии (ее уже делал не я)
эту программу на Erlang переписали на С++ (с использованием ACE). До сих
пор работает и совершенствуется.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[45]: Goto's are evil?
От: reductor  
Дата: 09.12.05 21:06
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я уже по-моему раза три сказал, что инверсия управления невозможна в

C>нормальном виде, если используются два ресурса с частично
C>перекрывающимся временем жизни. IoC умеет работать нормально только с
C>вложенными жизненными циклами.
C>Ну и в многопоточных случаях ни IoC, ни регионы (для работы с памятью)
C>не помогают. Но такие случаи все же достаточно редкие, так что их можно
C>не считать.

У меня какое-то дикое желание кого-нибудь уволить тут же возникло.

Вы отдаете себе отчет, что управление памятью — это формальная задача со своей алгеброй?
Что существует, например, исчисление регионов?
Что 15 лет уже как в хаскеле монады это дело неявно описывают?

держите:
http://citeseer.ist.psu.edu/509734.html
http://citeseer.ist.psu.edu/633301.html
http://citeseer.ist.psu.edu/221563.html
и
http://www.cs.cornell.edu/Info/People/jgm/lang-based-security/monadic-regions.pdf

То же самое и про исчисления процессов, пи-исчисление, потоки и прочие.

http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2000-57

Короче, жду от вас формальное представление RAII и доказательства того, что регионы "не помогают", а RAII помогает.

На неформальный ответ не прореагирую.

Потому два ресурса с "частично перекрывающимся" временем жизни — это полная дичь.
Даже лень объяснять почему. По-моему, это должно быть очевидно.


C>Мне лично один раз пришлось править программу на Erlang (чистый

C>функциональный язык для параллельных программ), где происходила утечка
C>описателей устройств (а они были очень дефецитны, утечка всего десятка
C>из них приводила систему в ступор). Это было ОЧЕНЬ неприятно —
C>приходилось делить логически единый код на куски, которые можно
C>вкладывать друг-в-друга. В итоге в следующей версии (ее уже делал не я)
C>эту программу на Erlang переписали на С++ (с использованием ACE). До сих
C>пор работает и совершенствуется.

Воздержусь от комментариев даже не смотря на то, что все жду, когда уже меня отсюда удалят.
Как не стыдно только такое писать.

делить код на куски и вкладывать друг-в-друга
нет слов
чикатило!
Re[14]: Goto's are evil?
От: AVC Россия  
Дата: 09.12.05 22:24
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Эти и другие люди прославились тогда, когда они о своей славе не заботились (шпилька в адрес Вирта нынешнего); упрекать их в том, что она не заслужена, — несерьёзно. Заслужена.


Я почти со всем в данном посте согласен.
Кроме вот этой фразы со "шпилькой".
ИМХО, если так хочется вставить "шпильку", не надо брать на себя роль миротворца или судьи.
А то получается как у капрала Шовинэ: солдаты всех армий примерно одинаковы, за исключением разве что французов.
По содержанию же этой "шпильки" могу сказать следущее. Нынешний "честолюбивый" (на Ваш взгляд) Вирт отстаивает те же принципиальные положения, что и в эпоху своей "скромности". В этом нетрудно убедиться, сопоставляя сказанное им сейчас с тем, что он говорил "тогда".

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[10]: Goto's are evil?
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.05 23:52
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Я??? Это ж ты толкнул про ассемблеры. А я про goto. Во многих ассемблерах, кстати, goto тоже вещь не тривильная. Не всегда можно вот так запросто сделать jump (jmp, jp, etc). Иногда только через приседания.


Я думл ты поймешь мою шутку юмора. Сори.

V>Удачная разработка — она и в африке удачная разработка. Говоря об удачности ассемблера имеют ввиду, разумеется, удачную систему команд проца.


Ты серьезно хочешь поговорить о ассемблерах? В общем, то не вопрос. Могу отделить ветку, но меня это не интересует.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[46]: Goto's are evil?
От: Cyberax Марс  
Дата: 10.12.05 13:44
Оценка:
reductor wrote:

> Вы отдаете себе отчет, что управление памятью — это формальная задача

> со своей алгеброй?

Я отдаю себе отчет, что это практическая задача, лучше С++ которую пока
никто еще не решает.

> Короче, жду от вас формальное представление RAII и доказательства

> того, что регионы "не помогают", а RAII помогает.

http://llvm.cs.uiuc.edu/pubs/2005-02-TECS-SAFECode.pdf
Вот примерно около этого отрывка:

Often, the increase in memory with case 3 pools is acceptable. These are
cases where there is limited wasted memory from pools with overlapping
lifetimes, in spite of not freeing memory back to the system (possibly due
to a lot of pool memory self-reuse).

Обратите внимание на слова "wasted memory" — у меня как раз был такой
случай, только вместо памяти терялся критичный ресурс. А вот RAII
позволяет достичь нулевого оврехеда, в случае region inference это
невозможно для перекрывающихся участков.

> Даже лень объяснять почему. По-моему, это должно быть очевидно.


Для меня как раз очевидно обратное.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[10]: Goto's are evil?
От: klapaucius  
Дата: 13.12.05 13:29
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>Не-а. IBM как и Гагарин останутся в истории навсегда(пока существуют компьютеры). Они были первыми.

IBM была первой? А разве не Rand?
Вот и получается, что для того чтобы запомнили — первым быть недостаточно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[11]: Goto's are evil?
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.12.05 07:45
Оценка:
Здравствуйте, klapaucius, Вы писали:
K>IBM была первой? А разве не Rand?
Так, для справки: изначально IBM называлась "Hollerith's Tabulating Machine Company", так как была создана Германом Холлеритом для производства табуляторов по заказу правительства США — нужно было проводить перепись населения. http://www-03.ibm.com/ibm/history/history/year_1896.html. По сравнению с нею, Ранд (1948 г.р.) — молокососы.
K>Вот и получается, что для того чтобы запомнили — первым быть недостаточно.
Не, не получается.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Goto's are evil?
От: Dmi_3 Россия  
Дата: 08.01.06 16:26
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Есть такая программа re2c. она генерирует распознаватели регулярных выражений в C-код.

DEA>Там есть несколько вариантов генерации. (1)используя goto (2)используя if-ы (3)используя таблицу состояний. Почему-то, самый быстрый код получается в варианте (1)...

А почему? Скорее всего это особенности реализации а вовсе не фундаментальное преимущество goto.

DEA>Простая и бесхитросная реализация бинарного алгоритма возведения в степень больших чисел. С использованием GOTO. в данном случае goto спасает (а)от достаточно неприятного дублирования кода, (б) ничуть не вредит ясности текста.

DEA>
DEA>//rn = (an ** en) mod mn
DEA>umodexp(data* rn, data const* an, data const* en, data const* mn)
DEA>{
DEA>    data *n1 = rn; n1->copy(an);
DEA>    data *n2 = data::alloc(rn->capacity);//пусть этот меморилик вас не смущает
DEA>        //код немного упрощен для наглядности

DEA>    data::byte_type const* ep = en->data + en->size - 1;
DEA>    data::byte_type mask = 1 << (data::bits-1);
DEA>    while( 0 == (*ep & mask) )
DEA>        mask >>= 1;//skip to first '1' bit

DEA>    reduction_algo reduce(mn);
DEA>    goto start;
DEA>    for(;;) {
DEA>        umul(n1, n2, n2); 
DEA>        reduce(n2, n1);
DEA>        if( *ep & mask ) {
DEA>                umul(n1, n2, an);
DEA>        start: reduce(n2, n1);
DEA>        }
DEA>        if( 0 == (mask >>= 1) ) {
DEA>            if( --ep < en->data_ ) break;
DEA>            mask = 1 << (data::bits-1); 
DEA>        }
DEA>    }
    rn->>copy(n2);
DEA>}
DEA>

DEA>Посему, вопрос: должен ли goto в данном куске кода быть изничтожен, если да, то какие преимущества сие действие принесет.

Я не антифанат goto. Для него тоже есть малюсенький уголок в программировании, но этот пример крайне неудачен и чисто формально преобразуем в более понятный вид без goto:
<skip>
    reduction_algo reduce(mn);
    reduce(n2, n1);//Вместо goto start;
    for(;;) {
        if( 0 == (mask >>= 1) ) {
            if( --ep < en->data_ ) break;
            mask = 1 << (data::bits-1); 
        }
        umul(n1, n2, n2); 
        reduce(n2, n1);
        if( *ep & mask ) {
            umul(n1, n2, an);
            reduce(n2, n1);//Теперь здесь нет метки.
        }
    }
<skip>

Всего одна строчка кода вместо goto start и метки. Это можно назвать дублированием? Кода стало меньше(число нажатий клавиш), читабельность и ясность (структурирование) улучшились.
По-моему это просто более ясная запись алгоритма. И код должен стать эффективнее поскольку компилятору не нужно разбираться с дополнительным входом ВНУТРЬ ЦИКЛА, а именно в неоптимальных циклах часто и теряется производительность.
Re: Goto's are evil?
От: Бабокин Дмитрий Россия  
Дата: 08.01.06 19:11
Оценка:
Кроме читабельности кода, если ещё один аспект — использование goto даёт возможность написания кода, который не приводится к вложеной структуре циклов (циклы с несколькими входами). А это делает анализ такого кода на порядок более сложной задачей, а следовательно заметно усложняется задача оптимищации кода компилятором.

Почему, интересно, Линус не восхищается Фортраном, в котором есть возможность написания процедур с несколькими входами.
Re[2]: Goto's are evil?
От: WolfHound  
Дата: 09.01.06 09:37
Оценка: +1
Здравствуйте, Бабокин Дмитрий, Вы писали:

БД>Кроме читабельности кода, если ещё один аспект — использование goto даёт возможность написания кода, который не приводится к вложеной структуре циклов (циклы с несколькими входами). А это делает анализ такого кода на порядок более сложной задачей, а следовательно заметно усложняется задача оптимищации кода компилятором.

Старым оптимизаторам это возможно мешало. А современным оптимизаторам это по барабану.
Посмотри хотябы на MSIL который потом обрабатывает JIT... там только условные и безусловные переходы... никаких циклов там нет.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Goto's are evil?
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.01.06 11:35
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Бабокин Дмитрий, Вы писали:


БД>>Кроме читабельности кода, если ещё один аспект — использование goto даёт возможность написания кода, который не приводится к вложеной структуре циклов (циклы с несколькими входами). А это делает анализ такого кода на порядок более сложной задачей, а следовательно заметно усложняется задача оптимищации кода компилятором.

WH>Старым оптимизаторам это возможно мешало. А современным оптимизаторам это по барабану.
Совершенно верно. Наличие многих входов может мешать только эвристическим оптимизаторам, которые пытаются "узнавать" характерные образцы кода. Нормальный оптимизатор строит CFG (Control Flow Graph), приводит его к SSA или SSI и уже потом начинает трансформации. При этом ему абсолютно безразлична исходная структура кода.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Goto's are evil?
От: Бабокин Дмитрий Россия  
Дата: 12.01.06 08:45
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


WH>>Здравствуйте, Бабокин Дмитрий, Вы писали:


БД>>>Кроме читабельности кода, если ещё один аспект — использование goto даёт возможность написания кода, который не приводится к вложеной структуре циклов (циклы с несколькими входами). А это делает анализ такого кода на порядок более сложной задачей, а следовательно заметно усложняется задача оптимищации кода компилятором.

WH>>Старым оптимизаторам это возможно мешало. А современным оптимизаторам это по барабану.
S>Совершенно верно. Наличие многих входов может мешать только эвристическим оптимизаторам, которые пытаются "узнавать" характерные образцы кода. Нормальный оптимизатор строит CFG (Control Flow Graph), приводит его к SSA или SSI и уже потом начинает трансформации. При этом ему абсолютно безразлична исходная структура кода.

Не надо смушать людей умными словами SSA тут ни при чём. После построения CFG допустим строим структуру циклов и... видим, что есть циклы с двумя и более входами и очень, очень огорчаемся. Многие высокоуровневые оптимизации циклов обламываются сразу, а для того, чтобы выполнить те, которые всё-таки возможно произвести потребуется написать примерно столько же кода, сколько и для обработки стандартных случаев. Получается ради 1% случаев приходится писать (тестировать и поддерживать) в два раза больше кода.

Ещё один пример. Допустим у нас расставлены вероятности переходов в CFG. Теперь, зная колличество входов в функцию, нам нужно расставить счётчики исполнения в каждом линейном участке. Это почти линейный алгоритм если все циклы имеют один вход. Если же есть циклы с многими входами, то для точного решения этой задачи потребуется алгоритм с большей вычислительной сложностью.

Так что, я всё-таки настаиваю на своей точке зрения, что CFG программы написаной с использование goto может оптимизироваться хуже (иногда заметно хуже) современными промышленными оптимизирующими копиляторами.
Re[5]: Goto's are evil?
От: Cyberax Марс  
Дата: 12.01.06 08:53
Оценка:
Бабокин Дмитрий wrote:
> Не надо смушать людей умными словами SSA тут ни при чём. После
> построения CFG допустим строим структуру циклов и... видим, что есть
> циклы с двумя и более входами и очень, очень огорчаемся.
Почему? Ведь можно применить простое преобразование и разделить цикл на
два цикла с одной точкой входа.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: Goto's are evil?
От: Бабокин Дмитрий Россия  
Дата: 12.01.06 21:09
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Бабокин Дмитрий wrote:

>> Не надо смушать людей умными словами SSA тут ни при чём. После
>> построения CFG допустим строим структуру циклов и... видим, что есть
>> циклы с двумя и более входами и очень, очень огорчаемся.
C>Почему? Ведь можно применить простое преобразование и разделить цикл на
C>два цикла с одной точкой входа.

Я говорю про цикл с двумя входами, а не с двумя обратными дугами. Может я чего-то не понимаю — объясни как преобразовать следующий цикл:

if (A) goto L2;   //Basic block 1 (goto для простоты за линейный участок не считаем)

L1:               //Basic block 2
i+=1;

L2:               //Basic block 3
i+=2;

if (i<N) goto L1; //Basic block 4


Цикл сожержит блоки 2-4. 2 и 3 являются точками входа в цикл.
Re[7]: Goto's are evil?
От: WolfHound  
Дата: 13.01.06 08:34
Оценка:
Здравствуйте, Бабокин Дмитрий, Вы писали:

БД>Я говорю про цикл с двумя входами, а не с двумя обратными дугами. Может я чего-то не понимаю — объясни как преобразовать следующий цикл:


БД>
БД>if (A) goto L2;   //Basic block 1 (goto для простоты за линейный участок не считаем)

БД>L1:               //Basic block 2
БД>i+=1;

БД>L2:               //Basic block 3
БД>i+=2;

БД>if (i<N) goto L1; //Basic block 4
БД>


if (A) goto L2;     //Basic block 1 (goto для простоты за линейный участок не считаем)

L1_1:               //Basic block 2

i+=1;

                    //Basic block 3
i+=2;

if (i<N) goto L1_1; //Basic block 4
goto END;

L2:                 //Basic block 3
i+=2;

if (i<N) goto L1_2; //Basic block 4
goto END;

L1_2:               //Basic block 2
i+=1;

                    //Basic block 3
i+=2;

if (i<N) goto L1_2; //Basic block 4

END:
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Goto's are evil?
От: Бабокин Дмитрий Россия  
Дата: 13.01.06 12:44
Оценка:
То, что ты предлагаешь — это дублицирование кода. Т.е. это некоторая трансформация. Причём если её польза почти очевидна в мальких примерах, то если это большое приложение и у нас не один цикл, а гнездо циклов, такое дублицирование может быть вредно. Кроме того, зачастую хочется проводить сначала полный анализ, а уже потом приступать к трансформациям — в такой модели как раз и мешают циклы с несколькими входами.
Re[9]: Goto's are evil?
От: WolfHound  
Дата: 13.01.06 13:01
Оценка:
Здравствуйте, Бабокин Дмитрий, Вы писали:

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

Я вобще не понимаю что ты к этим циклам прицепился. ИМХО все без них прекрасно оптимизируется.
В твоем примере оптимизировать просто нечего. Попробуй привести пример с несколькими входами в цикл который нельзя оптимизировать без разбиения на несколько циклов.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: Goto's are evil?
От: Бабокин Дмитрий Россия  
Дата: 13.01.06 17:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Бабокин Дмитрий, Вы писали:


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

WH>Я вобще не понимаю что ты к этим циклам прицепился. ИМХО все без них прекрасно оптимизируется.
WH>В твоем примере оптимизировать просто нечего. Попробуй привести пример с несколькими входами в цикл который нельзя оптимизировать без разбиения на несколько циклов.

Вот пример, который нельзя разбить на несколько циклов:
L1:               //Basic block 1
if (A) goto L3;

L2:               //Basic block 2
if (B) goto L4;

L3:               //Basic block 3
if (C) goto L1;
else goto L2;

L4:               //Basic block 4


Блоки 2 и 3 являются циклом с двумя входами.

А оптимизировать нечего только пока CFG не наполнен реальным кодом.
Re[11]: Goto's are evil?
От: WolfHound  
Дата: 13.01.06 19:54
Оценка:
Здравствуйте, Бабокин Дмитрий, Вы писали:

БД>Вот пример, который нельзя разбить на несколько циклов:

Я просил пример который нельзя оптимизировать.
БД>Блоки 2 и 3 являются циклом с двумя входами.

БД>А оптимизировать нечего только пока CFG не наполнен реальным кодом.

Я всеравно не понимаю как это мешает оптимизатору?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.