Является ли ориентация объекта плохой для встроенных систем и почему? - PullRequest
13 голосов
/ 18 июля 2010

Многие инженеры по встраиванию используют c ++, но некоторые утверждают, что это плохо, потому что это «объектно-ориентированный»?

Правда ли, что ориентация на объект делает его вредным для встраиваемых систем, и если да, то почему это действительно так?

Редактировать: Вот краткий справочник для тех, кто спросил:

поэтому мы предпочитаем, чтобы люди не использовали метод split ..., malloc ... или другие объектно-ориентированные практики, которые несут большие штрафы.

Я предполагаю вопросСчитаются ли объекты тяжеловесными в контексте встроенной системы?Некоторые ответы здесь предполагают, что это так, а некоторые - нет.

Ответы [ 10 ]

13 голосов
/ 18 июля 2010

Принимая вашу цитату за чистую монету, динамическое распределение памяти является совершенно отдельной концепцией от объектно-ориентированного проектирования программного обеспечения, поэтому оно полностью неверно. Вы можете иметь объектно-ориентированный дизайн и не использовать динамическое выделение памяти.

Фактически, вы можете делать OO в C до такой степени (это то, что делает ядро ​​Linux). реальная причина того, что многим разработчикам встраиваемых систем не нравится C ++, заключается в том, что он очень сложен, и в нем трудно писать прямой и предсказуемый код. У Линуса хорошая недавняя напыщенная речь о том, почему он не любит C ++ (я обещаю, что он лучше и более аргументирован, чем его старый ). Вероятно, большинство людей просто не очень хорошо формулируют это.

13 голосов
/ 19 июля 2010

Хотя я не уверен, что он отвечает на ваш вопрос, я могу суммировать причины, по которым исходный код моей предыдущей компании был чистым C.

Сначала стоит подвести итог ситуации:

  • мы хотели написать большой объем «базового» кода, который был бы легко переносим для большого числа встроенных систем ARM (в основном это мобильные телефоны среднего класса; как смартфоны, так и устройства с ОСРВ разных возрастов)
  • платформы обычно имели работоспособный компилятор C, хотя некоторые, например, не поддерживали "двойные" числа с плавающей запятой.
  • в некоторых случаях платформа имела разумную реализацию стандартной библиотеки, но во многих случаях - нет.
  • компилятор C ++ не был доступен на большинстве платформ, и там, где это было доступно, поддержка стандартной библиотеки C ++, STL или исключений сильно варьировалась.
  • отладчики часто были недоступны (последовательный порт, на который вы могли отправлять отладочные printfs, считался роскошью)
  • у нас всегда был доступ к разумному объему памяти, но часто не к разумной реализации malloc ()

Учитывая это, мы работали полностью на C, и даже тогда только на ограниченном наборе C 89. Полученный код был очень переносимым. Мы часто использовали объектно-ориентированные концепции.

В наши дни «встроенный» - это очень широкое определение. Он охватывает все: от 8-битных микропроцессоров без компиляторов ОЗУ или С, до тех, которые по сути являются высокопроизводительными ПК (хотя и не работают под управлением Microsoft Windows) - я не знаю, где находится ваш проект / компания в этом диапазоне.

6 голосов
/ 18 июля 2010

Что заставляет вас говорить, что C ++ является объектно-ориентированным? C ++ является мультипарадигмой, и не все функции, предоставляемые C ++, полезны для рынка встраиваемых систем из-за накладных расходов (Так что ... Только не используйте эти возможности! Проблема решена!)

4 голосов
/ 23 июня 2012

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

Разделение и динамическое распределение памяти являются врагами встроенных систем независимо от объектно-ориентированного, ориентированного на данные или процедурного программирования.Эти концепции могут или не могут быть использованы при реализации объектно-ориентированных проектов.

Object Oriented позволяет классу UART передавать экземпляры объектов Message, не зная содержимого объектов Message.Сообщение может быть базовым классом и иметь несколько классов-потомков.

Язык C ++ помогает продвигать безопасное кодирование во встроенных системах, позволяя конструкторам, конструкторам копирования и деструкторам, что запомнилось бы только во встроенных системах языка C с наивысшей дисциплиной.

Обработка исключений - это тоже боль при работе на языке Си.C ++ предоставляет лучшие возможности, встроенные в язык.

Язык C ++ предоставляет шаблоны для написания общего кода для обработки различных типов данных.Классическим примером является кольцевой буфер или круговая очередь.В языке C нужно было бы использовать «указатели на аннулирование», чтобы можно было передать любой объект.C ++ предлагает шаблон, чтобы можно было написать класс Circular_Queue, который работает с различными типами данных и имеет лучшую проверку типов во время компиляции.

Наследование позволяет улучшить совместное использование кода.Общий код делится на базовый класс, и дочерние классы могут быть созданы с одинаковыми функциями;через наследство.

Язык Си предоставляет указатели на функции.Языки C ++ предоставляют возможности для объектов функций (указатели на функции с атрибутами).

Извините, мне просто не нравятся люди, которые ограничивают встраиваемые системы языком C из-за слухов и небольшого количества знаний и опыта работы с C ++.

4 голосов
/ 18 июля 2010

Ничто в «объектно-ориентированном» не плохо для встроенных систем.ОО - это просто способ думать о программном обеспечении.

Что плохо для встраиваемых систем, так это то, что у них, как правило, есть менее сложные отладчики, а С ++ делает так много сумасшедших вещей, так сказать, за вашей спиной.,Эти труднодоступные коды сводят вас с ума.

3 голосов
/ 18 июля 2010

Объектно-ориентированный дизайн сам по себе неплох.Ответ лежит в вашей цитате.Особенно во встроенных системах реального времени вы хотите сделать свой код максимально легким и эффективным.Вещи, упомянутые в вашей цитате (объекты, деление, динамическое выделение памяти), являются относительно тяжелыми и обычно могут быть заменены более простыми альтернативами (например, использование битовых манипуляций для приблизительного деления, выделение памяти в стеке или со статическими пулами) для улучшенияпроизводительность в критичных ко времени системах.

2 голосов
/ 19 июля 2010

Как уже отмечалось, «встроенный» охватывает широкий и разнообразный набор аппаратных / программных опций.Но ...

Цитата, которую вы дадите, заставит микроконтроллер встраивать типы в дрожь.Динамическое распределение - нет-нет, если у вас есть ошибка, вы можете непредсказуемым образом вывести систему из строя.Деления сильно не поощряются, так как они занимают навсегда во время выполнения.Объекты не одобряются, поскольку они имеют тенденцию носить с собой множество «вещей», все эти «вещи» занимают место, а микроконтроллеры их не имеют.

Я думаю, что встроенные - это небольшие и специфичные проекты, вы не сильно беспокоитесь о расширяемости или переносимости.Вы пишете чистый код на C, который делает только то, что вы хотите, чтобы ваше устройство надежно.Вы выбираете одно семейство микросхем, чтобы вы могли перемещать свой (почти тот же) код среди различных аппаратных опций с незначительными изменениями в порт, который вы пишете, или инициализацией предохранителей конфигурации.

Таким образом, вам не нужно определять

  1. 4-х колесный транспорт
  2. Автомобиль
  3. Toyota

Так как вы работаете только на Toyotas.И разница в ускорениях между Camry и Corolla сохраняется как константа в регистре.

2 голосов
/ 18 июля 2010

C ++ был разработан с философией не платите за то, что вы не используете . Таким образом, кроме отсутствия хороших встроенных компиляторов, нет никакой реальной причины.

Возможно, CFront мог бы скомпилировать C ++ в C, который имеет множество компиляторов ...

Редактировать: Компилятор Comeau преобразует C ++ в простой C, поэтому аргумент без компилятора не сохраняется.

1 голос
/ 22 июня 2012

Как уже было сказано выше, именно то, что объектно-ориентированный / malloc / math делает за вашей спиной, несет штраф - как по размеру кода, так и по циклам ЦП, которых обычно не хватает во встроенном.

Как примерВключение функции sqrt () в цикл добавило так много накладных расходов в рекурсивных вычислениях, что нам пришлось удалить ее и быстро обойти ее, используя таблицу поиска, если я правильно помню.

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

1 голос
/ 18 июля 2010

Программирование всегда связано с использованием правильного инструмента для работы. Ответов нет, и это особенно верно во встроенном мире. Если вы хотите освоить встраиваемые разработки, вы будете так же глубоко знакомы с C, как и с C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...