Jump to content

    
Sign in to follow this  
Dx!

Последовательность действий - побитовая инверсия и сдвиг

Recommended Posts

И что, от этого компилятор будет генерировать вычисление выражений по-другому? Будет приводить к 8-битному int?

да.

Share this post


Link to post
Share on other sites
Все верно. Но бывают случаи, когда несоответствие стандарту дает лучшие результаты, чем соответствие. В частности, стандарт требует при выполнении операций приводить операнды к типу int. Может это и хорошо когда размер int соответствует естественному размеру переменной на данной платформе. Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода.
Стандарт не запрещает компилятору выкинуть в процессе оптимизации действия, не влияющие на результат. Что мы и видели на примере выражения PORTB = (PIND^0xFF) >> 4; То, что он не пришел к такому же коду на других выражениях - говорит лишь о несовершенстве оптимизатора, но никак не о кривости стандарта. Если компиляторы соответствуют стандарту - результат работы скомпилированного на любом из них кода будет одинаков (оптимальность кода стандарт не оговаривает). А вот если компиляторы нарушают стандарт - счастливой отладки и забудьте о переносимости.

 

Share this post


Link to post
Share on other sites
(оптимальность кода стандарт не оговаривает).

Вот и плохо! Можкт для обычных программ оптимальность и не важна, но для микроконтроллеров это самый главный параметр.

А вот если компиляторы нарушают стандарт - счастливой отладки

Я некоторое время программировал на кейле для 51-го - очень приятный компилятор несмотря на несоответствие стандарту. Просто к нарушению стандарта нужно подходить с умом.

и забудьте о переносимости.

Какая переносимость, о чем вы?! Все носятся с этим флагом, хотя прекрасно понимают, что никакой переносимости сейчас нет и она никому не нужна. Даже перенести с WinAVR на IAR вы не сможете - библиотеки, специфичные для контроллера, никто не стандартизировать не собирается. Да и куча мелких фич типа обращения к программной памяти или к отдельным битам порта у всех делается по-разному. Или может вы собираетесь в некотором устройстве поменять AVR на ARM и перенести туда свою программу? Это еще смешнее. Тут вообще о переносимости нет смысла говорить, это будет совершенно другая программа.

Давайте уж честно скажем себе: единственное, для чего нужен язык высокого уровня - для облегчения программирования. Чтобы при программировании думать об алгоритме, а не о регистрах, методах адресации и их ограничениях. А раз так, то он должет быть максимально приспособлен под платформу, а не под абстрактный стандарт.

Share this post


Link to post
Share on other sites
Какая переносимость, о чем вы?! Все носятся с этим флагом, хотя прекрасно понимают, что никакой переносимости сейчас нет и она никому не нужна. Даже перенести с WinAVR на IAR вы не сможете - библиотеки, специфичные для контроллера, никто не стандартизировать не собирается. Да и куча мелких фич типа обращения к программной памяти или к отдельным битам порта у всех делается по-разному. Или может вы собираетесь в некотором устройстве поменять AVR на ARM и перенести туда свою программу? Это еще смешнее. Тут вообще о переносимости нет смысла говорить, это будет совершенно другая программа.

Давайте уж честно скажем себе: единственное, для чего нужен язык высокого уровня - для облегчения программирования. Чтобы при программировании думать об алгоритме, а не о регистрах, методах адресации и их ограничениях. А раз так, то он должет быть максимально приспособлен под платформу, а не под абстрактный стандарт.

 

Полнейшая чушь.

 

Переносимость не то что ВАЖНА, а без неё в принципе никак нельзя. Слишком узко мыслите, в рамках своих локальных задач. Посмотрите на успешные проекты различных кроссплатформенных операционок, различных сетевых стеков, всевозможных библиотек и т.д.. Без стандарта реализация подобных проектов была бы немыслима. Если следовать стандарту С и писать код на чистом как слеза С, то 99% вероятностью, код скомпилируется и заработает на любой платформе (1% на hardware features). Например мы сейчас имеем код который работает на 5 различных архитектурах (AVR, AVR32, ARM7, Cortex, x086) и собирается без проблем двумя компиляторами IAR и GCC.

А ещё забыл, на писишке ещё в Visual Stidio всё собирается, но это так баловство было, для теорет. исследований.

Share this post


Link to post
Share on other sites
Просто к нарушению стандарта нужно подходить с умом.

Не нужно подходить к нарушению стандарта и даже думать об этом. Тогда получаем то. что надо: на любой платформе Ц есть Ц, неподдерживаемые прагмы игнорируются.

Какая переносимость, о чем вы?! Все носятся с этим флагом, хотя прекрасно понимают, что никакой переносимости сейчас нет и она никому не нужна.

Пример. Пусть у Вас есть проектик, такой себе никакой - готовый девайс №1 на одной платформе, для которого надо только софта, и контроллер №2 на другой платформе, который общается с №1 по уарту. Протокольная часть - общая, во избежание ошибок и чтобы побыстрее - пишется один раз. Если не будет переносимости, будет ПЦ в отладке и как минимум двойные трудозатраты.

ЗЫ уже давно хочется например, чтобы исчезли (вернее, не появлялись) квалификаторы для eeprom flash - чтобы описания шли типа того

const char str1[];// во флеше - это какбы понятно
volatile const char str2[]; // в еепроме - если он имеется, иначе опять же во флеше

Share this post


Link to post
Share on other sites

Всё это очень интересно, но обсуждалось уже многократно.

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

Тему закрываю.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this