| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
24.06.2010, 10:13
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Опять это "Сладкое Слово Своб..." тьфу...Ассемблер.Поймите-не это Главное.Допустим, писАть асс-вставки на 1 Мгц внутр,или на 16-ти в С переплюнуть .Здесь Главное компилятор в узде держать.Для этого нужно хотя-бы принципы оптимизации компилятора нужно знать.Разработчики этим - не делятся.И это Есть-Плохо.Эти Фичи уже всех и вся достали.Было-бы хорошо,если в открытом доступе всё было.Форум- не помощник- так как никто особенно не заморачивается-ну не пошло-я-по-другому сделаю.Попробуете Себя заставить- проанализировать код с оптимизацией и без?(нафиг надо!).И выложить критичные моменты на форум.Кому это надо?...(я- пессимист... от Ассемблера -лет 5 как отошёл-и не жалею!(оффтоп))
|
|
|
|
24.06.2010, 11:39
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Интересно, а как можно пользоваться компилятором, который "меняет логику работы программы в зависимости от уровня оптимизации"? И вообще, как можно пользоваться компилятором, который меняет логику работы программы вообще? Это же надо думать!
Нет не меняет!!! Не может в принципе!!! Если случаются хомуты в его работе (например в работе оптимизатора), то это обнаруживается и устраняется разработчиками. Я, к примеру, с таким не сталкивался. Но на электрониксе обсуждали пару случаев, где возможно, компилятор (IAR) вёл себя некорректно.
Сообщение от wowlw
|
Оптимизацию по скорости лучше не применять, а критичные ко времени процедуры
писать на ассемблере. Особенно прерывания.
|
Даже не знаю как ответить. Почему такая безапеляционность?
Я всегда включаю полную оптимизацию и больше к этому вопросу не возвращаюсь. За несколько лет было пару случаев, когда я отключал оптимизацию при отладке. Естественно, чтобы устранить свои косяки. К компилятору претензий не было. Обычно это случается при сложных вычеслениях либо при сложной работе с указателями. Например, когда идёт работа с указателями на указатели и мешается FLASH с ОЗУ.
|
Сообщение от OlegNZH
|
|
Здесь Главное компилятор в узде держать.Для этого нужно хотя-бы принципы оптимизации компилятора нужно знать.Разработчики этим - не делятся.И это Есть-Плохо.Эти Фичи уже всех и вся достали.Было-бы хорошо,если в открытом доступе всё было.
|
Не надо ничего ни в чём держать. Надо просто правильно писать программу. Понимая действия компилятора и линковщика. Понимать логику работы оптимизатора бессмысленно. Кого и чего достали - я не понял. Какие у вас претензии к компилятору - озвучьте - мы обсудим.
|
|
|
|
24.06.2010, 13:03
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Как раз к компилятору- у меня претензий нет.Просто Программу пишет человек ...и Он должен Правильную Логику закладывать.Компилятор .что? Он всё делает по-честному- если видит- переменная объявилась, но в видимости нету- нафиг её...а то,что она аппаратно может изменится(я- условно),так просто ему (компилятору) абсолютно до-барабану.(и Это Правильно и Логично - так и должно быть).Просто программирование - всегда имеет привязку к железу(иначе это было-бы- "вещь в себе").А все тонкости нельзя учесть.....ИМХО
|
|
|
|
24.06.2010, 14:41
|
|
|
Прописка
Регистрация: 05.03.2010
Сообщений: 144
Сказал спасибо: 47
Сказали Спасибо 195 раз(а) в 19 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Все верно. Компилятор, он компилировать должен в соответствии с заложенными в него правилами. Но, пишет то человек. В моем случае - представления не имею о правилах работы данного компилятора. Если бы знал, то естественно учел бы. Довольно давно, на IBM370 сталкивался с подобными проблемами, когда у пользователя менялась логика работы при использовании определенного режима оптимизации. Но было проще. Поднял документацию по компилятору, прочел описанные человеческим языком требования и особенности, и все. Все становится на свои места. В данной ситуации компилятор может и делает все верно, но я понятия не имею как заставить его работать так, как мне надо. А открыть документацию и почитать - естественно не представляется возможным. Нет ее. На IBM370 документация на один из компиляторов представляла собой пару книжных полок. А тут что? максимум описание ключей для задания режима оптимизации. Может кто подскажет ссылочку на документацию где есть нормальное описание?
Последний раз редактировалось 291066; 24.06.2010 в 14:45.
|
|
|
|
24.06.2010, 14:58
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
так в том-то и дело.Разработчики держат в секрете ключевые вопросы оптимизации.Ноу-хау.(может даже и не секрет- просто никто не спрашивает...)Даже CV разных версий при оптимизации даёт разный по объёму код.Не говоря уже про IAR и WinAVR. Проще наверное настраиваться на код без оптимиз..- побольше изначально закладывать в проект памяти.(хотя я- наталкиваюсь постоянно на грабли- лишняя ночь-переделка алгоритма...потом -работает - а в чём фича-неизвестно(точнее - времени нет разбираться)(личные глюки-это само-сабой - но когда всё поотключаешь-а оно не соответствует всё равно написанному ,задумываешься ))
|
|
|
|
24.06.2010, 15:53
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от OlegNZH
|
|
Проще наверное настраиваться на код без оптимиз..- побольше изначально закладывать в проект памяти.
|
А в результате? Потеря в скорости и огромный размер кода - неправильное решение, тупиковое.
|
Цитата:
|
|
(хотя я- наталкиваюсь постоянно на грабли- лишняя ночь-переделка алгоритма...потом -работает - а в чём фича-неизвестно(точнее - времени нет разбираться)(личные глюки-это само-сабой - но когда всё поотключаешь-а оно не соответствует всё равно написанному ,задумываешься ))
|
Вот в том то и дело. 
Нет универсальных решений и нет универсальных подсказок, и описание оптимизации ничего не даст. Вы изменили прогу и оптимизатор сработал по другому, что посчитал лишним то и выбросил, и то, что работало пять минут назад, работать перестало. Поэтому полезно просматривать листинг откомпилированного, а если не работает, то уже и другого выхода нет. Где-то какую-то переменную нужно объявить как глобальную, где-то как volatile, нужно подсказать компилятору, что этого трогать нельзя, направить его на путь истинный. Где и что как делать приходит с опытом, а опыт и понимание в таком деле плохо передаются на бумаге. Некоторые куски прог тупо перекидываются без переделок с платформы на платформу, с одного компилятора на другой, а с некоторыми - как другой компилятор, так и свои заморочки.
|
|
|
|
24.06.2010, 19:23
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от OlegNZH
|
|
Компилятор .что? Он всё делает по-честному- если видит- переменная объявилась, но в видимости нету- нафиг её...а то,что она аппаратно может изменится(я- условно),так просто ему (компилятору) абсолютно до-барабану.(и Это Правильно и Логично - так и должно быть).
|
Вот именно. А если бы он не выкинул, то у вас бы то же были бы к нему претензии. Поэтому вы должны чётко донести до компилятора свою задачу. Угадать её - он не в состоянии. И к железу это не имеет ни малейшего отношения.
|
|
|
|
24.06.2010, 19:46
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от st_1
|
|
Нет универсальных решений и нет универсальных подсказок, и описание оптимизации ничего не даст. Вы изменили прогу и оптимизатор сработал по другому, что посчитал лишним то и выбросил, и то, что работало пять минут назад, работать перестало.
|
Честно говоря я не понимаю. Этого не должно быть! Это значит что прога написана неверно. Приведите пример, где компилятор меняет логику работы, в зависимости от уровня оптимизации. А то много текста - мало толка.
|
Цитата:
|
|
Поэтому полезно просматривать листинг откомпилированного, а если не работает, то уже и другого выхода нет. Где-то какую-то переменную нужно объявить как глобальную, где-то как volatile, нужно подсказать компилятору, что этого трогать нельзя, направить его на путь истинный.
|
На мой взгляд, это в корне неверный подход! Вас послушать, так это не программирование, а гадание на кофейной гуще. Заранее неизвестно, как и какую переменную как объявлять. Но это не так. На самом деле переменные объявляются так, как они должны быть объявлены.
Берём книгу по программированию на Си. (Я взял Герберта Шилдта к примеру) и читаем про квалификатор volatile. Первая строчка: "... указывает компилятору на то, что значение переменной может измениться независимо от программы...". По-моему всё понятно. Например значение АЦП. Или значение переменной, которое изменяется в прерывании, так как "Код, который составляет тело ф-ции, скрыт от остальной программы...", а прерывание это одна из ф-ций. Иными словами значение переменной в одной ф-ции, меняется из другой ф-ции. А с точки зрения компилятора это не взаимосвязанные объекты (что кстати архиправильно!!!). Также и ОС будет функционировать. Есть задача - есть ядро ОС. Задаче должна работать так, как будто кроме неё вообще ничего нет. И в тоже время получать данные извне.
|
Цитата:
|
|
Где и что как делать приходит с опытом, а опыт и понимание в таком деле плохо передаются на бумаге. Некоторые куски прог тупо перекидываются без переделок с платформы на платформу, с одного компилятора на другой, а с некоторыми - как другой компилятор, так и свои заморочки.
|
А по-моему, надо один раз понять - и тогда эксперименты будут ненужны, как и "тупое" (читай неосмысленное) копирование.
|
|
|
|
24.06.2010, 19:59
|
|
|
Прописка
Регистрация: 05.03.2010
Сообщений: 144
Сказал спасибо: 47
Сказали Спасибо 195 раз(а) в 19 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
По-моему совершенно неверный подход - подстраиваться под компилятор. Скажу больше - порочный подход. Опять же, опираясь на свой давний опыт с уверенностью скажу, что проблемы с неоднозначностью логики откомпилированного кода возникали крайне редко, это были редкие исключения описанные в документации. Причем очень редкие. Есть описанный синтаксис языка, и компилятор должен не нарушая логики транслировать его. Соглашусь с тем, что написание абстрактных программ (не привязанных к железу) и аппаратно ориентированных - совершенно два разных подхода. Но, все равно, не должен оптимизатор строить неоднозначный код. Тем более, что заранее известно - программа пишется под конкретное железо.
Проанализировав листинг, я был в шоке. Оператор присваивания одной и той же переменной, какого-то значения в одном случае хранит переменную в регистре, а в другом пишет в память. Полный бред!!! И это в простой программе где все переменные могут поместиться в регистрах. Внеся совершенно незначительные правки в других местах программы листинг коренным образом меняется. На мой взгляд проблема в подходе к написанию компиляторов и общей культуре программирования. Смотря сейчас на исходники чужих программ, поражаюсь стилю написания (хотя сам сейчас так пишу). Но если я просто "развлекаюсь" и моя программа будет работать только у меня дома, то промышленные программы написанные таким образом это уже ненормально.
|
|
|
|
25.06.2010, 01:07
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
для 291066.
С первой частью вашего сообщения целиком и полностью согласен.
Сообщение от 291066
|
|
Оператор присваивания одной и той же переменной, какого-то значения в одном случае хранит переменную в регистре, а в другом пишет в память. Полный бред!!!
|
Но это не изменяет логику работы программы. Это просто оптимальность компиляции/ оптимизации. И здесь всегда будут претензии к качеству. Но в этом и прелесть написания программы на Си, что мне всё равно где хранится та или иная переменная, мне всё равно, как она извлекается, и, более того, что мне всё равно вообще какой это процессор (в идеале) - главное что данный оператор будет выполнен и выполнен правильно.
А вопрос эффективности программы, на данном этапе, решается выбором процессора с запасом по производительности. Благо выбор сейчас большой и разница в ценах незначительна. Например не получается решить задачу на ATMEGA88 с производительностью 20 мипсов проц 8 бит - берём LPC1113 с производительностью 50 мипс проц 32 бита. Что в целом обеспечит рост производительности раз в 5-6. Первый проц стоит 1.15$, второй - 1.5$.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:18.
|
|