Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

бред с оптимизацией [D7, WinXP]


Страницы:   1 2

Max ©   (2012-05-28 22:45:00) 

Обнаружил ошибку при дебаге программы - цикл for i:=1 to ... идет в обратном порядке 8-[] Соответсвенно не правильно работает программа. Два часа ломал голову в чем проблема - оказалось неправильно работает оптимизация в дельфи. Отключил галку - все стало нормально. Вопрос - как это решить нормально?


ProgRAMmer Dimonych   (2012-05-30 11:25:00) [1]

> [35] Anatoly Podgoretsky ©   (30.05.12 09:53)
> Кстати когда отладчик не может показать значение "переменной"
> то он прямо так и говорит, что значение недоступно из-за
> оптимизации. Вот только показ значений счетчика цикла смущает
> неокрепшие умы.

Но ведь он же их и укрепляет?


Anatoly Podgoretsky   (2012-05-30 09:53:00) [2]

Кстати когда отладчик не может показать значение "переменной" то он прямо так и говорит, что значение недоступно из-за оптимизации. Вот только показ значений счетчика цикла смущает неокрепшие умы.


Anatoly Podgoretsky   (2012-05-30 09:51:00) [3]

Ну так и я о том же.


Sha   (2012-05-30 09:47:00) [4]

> Anatoly Podgoretsky ©   (30.05.12 09:19) [32]

Хорошо, тогда разверну мысль.

После оптимизации относительно переменной цикла у разработчиков Delphi был следующий выбор.
В том виде, как писал программист, ее нет, но есть счетчик итераций.
Для доступа к элементам массива используется адрес текущего элемента,
который вместо умножения увеличивается или уменьшается на размер элемента.
Можно ничего не показывать, а можно показать этот счетчик.
Что лучше? Конечно, второе.

После "сильной" оптимизации на уровне ассемблерного кода (сейчас речь не о Delphi)
операторы размазаны и наползают друг на друга,
бывает даже, что в процедуре *все* операторы начинаются в одном месте.
Поставить точку прерывания на конкретном операторе просто невозможно.
Существуют только места, где вычисления переменных заканчиваются, да и то не всех.
Временные переменные могут вычисляться иначе, чем задумал программист,
и вообще не получать окончательного значения.

Так что то, что мы имеем, - дар Борланда.
Кому не нравится отлаживать код после оптимизатора, имеет возможност это делать без него.


Anatoly Podgoretsky   (2012-05-30 09:19:00) [5]

> Sha  (30.05.2012 09:07:31)  [31]

Так и с оптимизацией работает как надо, только это другое надо.


Sha   (2012-05-30 09:07:00) [6]

> Германн ©   (30.05.12 03:24) [27]
> "Жест доброй воли" за туеву хучу баксов?

Именно так.
Отладчик без оптимизации работает как надо.
А с оптимизацией и не должен по определению.


sniknik   (2012-05-30 08:00:00) [7]

> Германн
дебагер все показывает правильно, ИМХО, если бы он показывал ожидаемое ламерами, а не то, что реально есть, то были бы ОЧЕНЬ большие проблемы при малейшей ошибке/неточности в самом дебагере. да и связку между написанным и CPU хрен сделаешь.
вообще было бы невозможно разобраться, как при любом обмане.
ситуация была бы похожа на замену реальной ошибки на свой перевод... теми же ламерами, что доставляет больше всего проблем поддержке (не знают что происходит, поэтому непонятно в чем причина).


Омлет   (2012-05-30 07:35:00) [8]

> Германн

Александр пытается объяснить, что в результате оптимизации может получиться код в котором ни в каком виде не будет тех переменных, которые задавал пользователь. Откуда же отладчику взять значения этих переменных, если их в помине нет? Размер кучи баксов на этот факт повлиять не могут.

С тем же успехом можно катить бочку на интерпретатор, который выкинул строчку "b := a + 2" в коде.

var
 a,b: integer;
begin
 a := 10;
 b := a + 2;
 caption := inttostr(a);
end;

Ты хоть кол на голове чеши, дебаггер не встанет на эту строку и не покажет значение b.


Anatoly Podgoretsky   (2012-05-30 07:29:00) [9]


>  это жест доброй воли со стороны разработчиков

Во всяком случае не для слабонервных, а то насмотрятся и бегут на форум.


Германн   (2012-05-30 03:24:00) [10]


> То, что в Delphi отладчик кое-что показывает после компиляции
> в режиме оптимизации - это жест доброй воли со стороны разработчиков.
>

Саш, тебе самому это не смешно?
"Жест доброй воли" за туеву хучу баксов?


Sha   (2012-05-30 02:57:00) [11]

Для отладки и работы с отладчиком существуют отладочные компиляторы или режимы компиляции без оптимизации.
То, что в Delphi отладчик кое-что показывает после компиляции в режиме оптимизации - это жест доброй воли со стороны разработчиков. Могли бы этого не делать и были бы правы.


Германн   (2012-05-30 02:55:00) [12]


> Sha ©   (30.05.12 01:48) [21]

Вот кстати.
Обрати внимание на
> sniknik ©   (28.05.12 23:38) [9]
>
> > баги с оптимизацией натыкался
> у тебя в голове баг... большой такой, серый, с извилинами.
>  %)
>
> ты куда смотришь? на i? с точкой останова на 30 строке.
> а нужно на AData с точкой на 22.
> все правильно работает, оптимизирует, это ты это правильное
> поведение интерпретируешь как баг.
>


Германн   (2012-05-30 02:48:00) [13]


> Sha ©   (30.05.12 02:37) [23]
>
> Как у тебя получилось сделать такой вывод?
>

"Sha ©   (29.05.12 09:08) [15]

Это не баг.
Счетчик повторений показан корректно. Того кода, что ты писал просто нет.
Ты же не возмущаешься тому, что что некоторые операторы при оптимизации выброшены.
Ты ведь программист, не так ли?"
Т.е. я должен знать что именно мне показывает отладчик в том или другом случае?
А на кой нужен такой отладчик в RAD системе?


Sha   (2012-05-30 02:37:00) [14]

Как у тебя получилось сделать такой вывод?


Германн   (2012-05-30 02:20:00) [15]


> Sha ©   (30.05.12 01:48) [21]
>
> Нет, не согласен.
> После работы оптимизатора понятие высокоуровневого оператора
> и даже переменной теряет смысл.
> Если б оно сильно оптимизировало, было б удивительно, если
> б оно вообще там что-то показывало.
> А ты балоны катишь, когда радоваться должен, что видишь
> почти все.
>

Т.е. ты утверждаешь, что RAD системы разработаны для "высокоуровневых" программистов?


Sha   (2012-05-30 01:48:00) [16]

Нет, не согласен.
После работы оптимизатора понятие высокоуровневого оператора и даже переменной теряет смысл.
Если б оно сильно оптимизировало, было б удивительно, если б оно вообще там что-то показывало.
А ты балоны катишь, когда радоваться должен, что видишь почти все.


Германн   (2012-05-30 01:03:00) [17]


> Sha ©   (29.05.12 16:01) [19]
>
> > Германн ©   (29.05.12 15:47) [18]
>
> Понятно. Предположу, что ты не видел,
> что вытворяли с кодом на ЕС ЭВМ оптимизаторы PLI и FORTH.
>

Да мало ли что я видел или не видел. :)
По существу ты с моим определением согласен?


Sha   (2012-05-29 16:01:00) [18]

> Германн ©   (29.05.12 15:47) [18]

Понятно. Предположу, что ты не видел,
что вытворяли с кодом на ЕС ЭВМ оптимизаторы PLI и FORTH.


Германн   (2012-05-29 15:47:00) [19]


> Sha ©   (29.05.12 09:08) [15]
>
> Это не баг.
> Счетчик повторений показан корректно. Того кода, что ты
> писал просто нет.
> Ты же не возмущаешься тому, что что некоторые операторы
> при оптимизации выброшены.
> Ты ведь программист, не так ли?
>

Это именно баг отладчика! И совсем при этом не важно, что есть оптимизатор, который выкинул из кода переменную цикла. Либо отладчик должен её "симулировать", либо честно говорить, что не может показать значение этой переменной из-за того, что она исключена из кода в целях оптимизации как это он говорит в ряде других случаев.


ProgRAMmer Dimonych   (2012-05-29 10:44:00) [20]

> [16] Pavia ©   (29.05.12 09:31)

А поподробнее?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо