|
|
  |
фича компиляторв, инкремент переменной |
|
|
|
May 13 2007, 09:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Oldring @ May 13 2007, 11:19)  Проблемы с volatile. Чтение volatile переменной может обладать побочными эффектами, неизвестными компилятору, как и запись. Ну с этим все очень просто. Берем Help к компилятору и читаем, что нам обещано: Код An object may be declared with the keyword volatile. Such an object may be freely modified by the program, and its value also may be modified through actions outside the program. Про побочные эффекты, при чтениии это не забота volatile. Характеристика обьекта с модификатором volatile описана четко. Все остальное фантазии и пустые надежды на решение всех проблем одним махом. Цитата Поэтому компилятор не может по своей воле оптимизировать чтение volatile переменных. Может, с осторожностью: Код The keyword volatile indicates to the compiler that care must be taken when optimizing code referring to the object, so that the meaning of the program is not altered. An object that the compiler might otherwise have been able to keep in a register for an extended period of time will be forced to reside in normal storage so that an external change to it will be reflected in the program's behavior. Если вдруг существуют компиляторы налагающие более суровые ограниченя, не сочтите за труд назвать их. Очень полезно для общего развития.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2007, 09:27
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(zltigo @ May 13 2007, 13:15)  Может, с осторожностью: ... Компилятор - GCC. Не сочтите за труд, прочтите, в конце концов, стандарт языка, или хотя-бы нормальный учебник по языку программирования. Главное назначение volatile - работа с аппаратными регистрами. Например, получение данных из аппаратного FIFO. Изменение количества чтений из такой ячейки памяти приведет к некорректной работе программы. Поэтому атрибут volatile налагает очень жесткие ограничения на любой компилятор: каждое чтение volatile объекта является внешним эффектом программы, поэтому никакая оптимизация не имеет права изменить количество таких чтений. Даже удивительно, что мне приходится Вам излагать настолько базовые понятия. P.S. Убедитесь, пожалуйста, что Watcom поддерживает ANSI C, а не остановился в своем развитии на K&R C.
--------------------
Пишите в личку.
|
|
|
|
|
May 13 2007, 09:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Oldring @ May 13 2007, 12:27)  Не сочтите за труд, прочтите, в конце концов, стандарт языка Может я чего пропустил? Тогда пожалуйста сюда ссылочку из стандарта про главню задачу volatile: Цитата Главное назначение volatile - работа с аппаратными регистрами. Например, получение данных из аппаратного FIFO Цитата Даже удивительно, что мне приходится Вам излагать настолько базовые понятия. Удивительно другое, что Вы полагаете, что для решения описанных проблем достаточно volatile  Цитата P.S. Убедитесь, пожалуйста, что Watcom поддерживает ANSI C, а не остановился в своем развитии на K&R C. OpenWatcom поддерживает С99. А что в K&R упоминается volatile? Цитата Поэтому атрибут volatile налагает очень жесткие ограничения на любой компилятор Накладываемые ограничения: Цитата The standards encourage compilers to refrain from optimizations concerning accesses to volatile objects that it might perform on non-volatile objects. The C standard leaves it implementation defined as to what constitutes a volatile access. The C++ standard omits to specify this, except to say that C++ should behave in a similar manner to C with respect to volatiles, where possible. The minimum either standard specifies is that at a sequence point all previous accesses to volatile objects have stabilized and no subsequent accesses have occurred. Thus an implementation is free to reorder and combine volatile accesses which occur between sequence points, but cannot do so for accesses across a sequence point. The use of volatiles does not allow you to violate the restriction on updating objects multiple times within a sequence point.
Сообщение отредактировал zltigo - May 13 2007, 09:50
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2007, 09:55
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(zltigo @ May 13 2007, 13:38)  Может я чего пропустил? Тогда пожалуйста сюда ссылочку из стандарта про главню задачу volatile: Удивительно другое, что Вы полагаете, что для решения описанных проблем достаточно volatile  "Главная задача volatile" описана, безусловно, не в стандарте, а в учебниках по языку. Признаюсь, учебники по языку С я не читал с начала 90-х - но уже в то время все было подробно описано. В стандарте же написано следующее: Цитата An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine, as described in 5.1.2.3. volatile решает часть задачи работы с аппаратурой, которая касается компилятора. Остальное (например, настройка кеша) касается самой аппаратуры, а не компилятора. Нечего мне приписывать то, что я не писал. P.S. Есть еще такой документ - "Rationale for International Standard—Programming Languages—C" Цитата volatile No cacheing through this lvalue: each operation in the abstract semantics must be performed (that is, no cacheing assumptions may be made, since the location is not guaranteed to contain any previous value). In the absence of this qualifier, the contents of the designated location may be assumed to be unchanged except for possible aliasing. Цитата A static volatile object is an appropriate model for a memory-mapped I/O register. Implementors of C translators should take into account relevant hardware details on the target systems when implementing accesses to volatile objects. For instance, the hardware logic of a system may require that a two-byte memory-mapped register not be accessed with byte operations; and a compiler for such a system would have to assure that no such instructions were generated, even if the source code only accesses one byte of the register. Whether read-modify-write instructions can be used on such device registers must also be considered. Whatever decisions are adopted on such issues must be documented, as volatile access is implementation-defined. A volatile object is also an appropriate model for a variable shared among multiple processes.
--------------------
Пишите в личку.
|
|
|
|
|
May 13 2007, 10:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Oldring @ May 13 2007, 12:55)  В стандарте же написано следующее: Отлично. К первоисточникам припали  . Ну теперь будучи вооруженным, попробуйте обьяснить, в чем это компилятор провинился: Цитата А вот это явный глюк компилятор. Посмотрите в ассемблере - cколько он раз считывает значение переменной i. Ну и Ваши слова: Цитата каждое чтение volatile объекта является внешним эффектом программы, поэтому никакая оптимизация не имеет права изменить количество таких чтений. Цитата Нечего мне приписывать то, что я не писал. Да??? Были перечислены проблемы ображения к "железу" и сказано про volatile. При этом никакие другие средства не упоминались а в реальной жизни для решения этих проблем использования только volatile (без, например, разбиения на sequence points )недостаточно. Так-что как тогда надо было понимать? P.S. Да, и с "удивлением", пожалуйста поокуратнее.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2007, 10:26
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(zltigo @ May 13 2007, 14:12)  Отлично. К первоисточникам припали  . Ну теперь будучи вооруженным, попробуйте обьяснить, в чем это компилятор провинился: Да? Уж больно "удивление" выказано было  Да я Вам с самого начала постоянно кидал ссылки на первоисточники - а в ответ получал лишь "жираф большой - ему видней." Провинился Watcom тем, что абстрактная C машина считывает volatile объект два раза - а код, порождаемый компилятором, содержит одно чтение из объекта. Такая оптимизация нарушает требование стандарта, которое я процитировал в предыдущем посте. Кстати. Вы дописали в конце цитату утверждения, что компилятор имеет право комбинировать volatile обращения между соседними sequence point. Так вот, это явный бред. Вы не привели ссылку на источник цитаты - гугл в качестве источника дает документацию на GCC. Это утверждение - явная самодеятельсность авторов GCC. Потому что она противоречит приведенной ранее мною цитате из стандарта. Переупорядочивание обращений к этому не относится. А вот комбинирование может привести к тому, что побочные эффекты от обращения будут потеряны, вместо того, чтобы быть завершены к следующей sequence point.
--------------------
Пишите в личку.
|
|
|
|
|
May 13 2007, 10:37
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Oldring @ May 13 2007, 13:26)  Провинился Watcom тем, что абстрактная C машина считывает volatile объект два раза - а код, порождаемый компилятором, содержит одно чтение из объекта. Такая оптимизация нарушает требование стандарта, которое я процитировал в предыдущем посте. Цитата ..компилятор имеет право комбинировать volatile обращения между соседними sequence point. Так вот, это явный бред. Это утверждение - явная самодеятельсность авторов GCC. Потому что она противоречит приведенной ранее мною цитате из стандарта. Ну как-бы я все понял и осознал - существует только одно правильное толкование "стандарта" и оно принадлежит Oldring. Aвторы компиляторов дружно "отдыхают", ну а остальные фоне этого вообще никто и звать их никак.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2007, 11:03
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(zltigo @ May 13 2007, 14:37)  Aвторы компиляторов дружно "отдыхают", ну а остальные фоне этого вообще никто и звать их никак. Я и говорю: "жираф большой - ему видней". Ладно. Продолжать мне скушно. Адью.
--------------------
Пишите в личку.
|
|
|
|
|
May 13 2007, 12:03
|
Участник

Группа: Новичок
Сообщений: 70
Регистрация: 27-03-07
Пользователь №: 26 533

|
Цитата(zltigo @ May 13 2007, 14:37)  Ну как-бы я все понял и осознал - существует только одно правильное толкование "стандарта" и оно принадлежит Oldring. Aвторы компиляторов дружно "отдыхают", ну а остальные фоне этого вообще никто и звать их никак. Вообще то известно, что авторы компиляторво делают ошибки в полный рост. Для этого достаточно почитать этот форум. Ну а то что в этом случае i не надо читать два раза очень удивительно слышать от человека, который занимается разработкой для микропроцессоров. Тут таких случаев навалом. То что это не так в ваткоме говорит о том, что этот компилятор практически не используется для написания совты связанного с работой с железом и такие ошибки не ВЫЛЕЗЛИ у пользователей.
|
|
|
|
|
May 13 2007, 13:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(vromanov @ May 13 2007, 15:03)  Вообще то известно, что авторы компиляторво делают ошибки в полный рост. Удивительно другое, что volatile-"правильный" компилятор пока найти не удалось  . Цитата Ну а то что в этом случае i не надо читать два раза очень удивительно слышать от человека, который занимается разработкой для микропроцессоров. Человек, "который занимается" умеет четко выражать свои мысли посредством vоlatile и разбиения инструкций на sequence point. При этом меня абсолютно устраивает минимально-необходимо-достаточная трактовка volatile присутствующая во всех известных мне компиляторах и процитированная ранее по Watcom-овскому хелпу и документации к GCC. При этом такая трактовка volatile не отметает оптимизацию на корню. Цитата То что это не так в ваткоме говорит о том, что этот компилятор практически не используется для написания совты связанного с работой с железом и такие ошибки не ВЫЛЕЗЛИ у пользователей. Ну то, что я использую под 186 и не только, и то, что IBM-PC это тоже железо - забудем? Но что делать с GCC там ведь вообще "явный бред": Код The standards encourage compilers to refrain from optimizations concerning accesses to volatile objects that it might perform on non-volatile objects. The C standard leaves it implementation defined as to what constitutes a volatile access. The C++ standard omits to specify this, except to say that C++ should behave in a similar manner to C with respect to volatiles, where possible. The minimum either standard specifies is that at a sequence point all previous accesses to volatile objects have stabilized and no subsequent accesses have occurred. Thus an implementation is free to reorder and combine volatile accesses which occur between sequence points, but cannot do so for accesses across a sequence point. The use of volatiles does not allow you to violate the restriction on updating objects multiple times within a sequence point. Так вот, я с этим "бредом" полностью согласен. Нормальная, сбалансированная реализация. Не вырубающая оптимизацию полностью при обращении к Random Access (RAM в том числе) обьектам. "Проблемы" c, например, FIFO должны решаться явным образом разбиением обращений на sequence point. Обращение к FIFO (кстати, как там дела c существованием FIFO в "абстрактной С машине" поминаемй с стандарте дела обстоят? ) не должно висеть тяжким грузом на всем остальном.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|