Написать загрузчик на C или C ++? - PullRequest
17 голосов
/ 27 октября 2009

Я пишу программу, в частности загрузчик, для встроенной системы. Я собираюсь использовать библиотеку C для взаимодействия с некоторыми аппаратными компонентами, и у меня есть выбор написать ее на C или C ++. Есть ли какая-то причина, по которой я должен выбрать один над другим? Мне не нужны объектно-ориентированные возможности C ++, но у него более сильная система типов. Может ли он иметь другие языковые функции, которые сделают программу более надежной? Я знаю, что некоторые люди избегают C ++, потому что он может (но не всегда) генерировать большие образы прошивки.

Ответы [ 10 ]

26 голосов
/ 27 октября 2009

Это не очень простой вопрос для ответа. Это зависит от ряда факторов, в том числе:

  • Как вы предпочитаете размещать код.
  • Имеется ли для вашей цели компилятор C ++ (и любые другие цели, на которых вы можете использовать загрузчик).
  • Насколько критичен размер кода для вашего приложения (возможно, речь идет о дополнительных 10%, а не мегабайтах, как предполагает другой ответ).

Лично мне очень нравятся классы как способ выкладывания моего кода. Даже когда я пишу код на языке C, я склонен хранить все в модульных файлах со статическими функциями области файлов, «имитирующими» функции-члены и (несколько) статических переменных области файлов, чтобы «имитировать» переменные-члены. Сказав это, большинство моих существующих встроенных проектов (все они относительно небольшого масштаба, до 128 КБ флэш-памяти, включая загрузчик, но обычно меньше), как правило, написаны на C. Теперь, когда у меня есть компилятор C ++, Я определенно думаю о переходе на C ++.

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

Если у вас есть компилятор C ++ (даже если он только g ++), стоит выполнить код через него только для дополнительной проверки типов, чтобы вы могли уменьшить количество проблем в вашем коде. Компилятор C ++ может уловить несколько вещей, которые даже инструменты статического анализа не заметят.

Хорошее обсуждение многих недопустимых причин, по которым люди отвергают C ++, см. Статья Дэна Сакса на Embedded.com .

12 голосов
/ 27 октября 2009

Для загрузчика очевидным выбором является C, особенно во встроенной системе. Сгенерированный код должен быть близок к металлу и очень прост в отладке, вероятно, путем перехода на сборку, которая быстро становится сложной без заботы в C ++. Также цепочки инструментов C гораздо более распространены, чем цепочки инструментов C ++, что позволяет использовать ваш загрузчик на большем количестве платформ. Наконец, сгенерированные двоичные файлы, как правило, меньше и используют меньше памяти при написании стиля C.

11 голосов
/ 27 октября 2009

Если вам не нужно использовать объектную ориентацию, используйте C. Простой выбор там. Это проще и проще, выполняя ту же задачу.

Некоторые харды не согласятся, но OO - это то, что делает C ++> C, и наоборот во многих обстоятельствах.

10 голосов
/ 27 октября 2009

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

Используйте самый простой инструмент, который выполнит работу.

7 голосов
/ 27 октября 2009

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

4 голосов
/ 27 октября 2009

Большинство предыдущих ответов предполагают, что ваш загрузчик маленький и простой, как правило, так; однако, если он становится более сложным (т. е. вам нужно иметь возможность загружаться с порта Ethernet, USB-порта или последовательного порта ... вам необходимо проверить код, который загружается, прежде чем стирать существующий код, и т.д.) вы можете рассмотреть C ++.

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

3 голосов
/ 27 октября 2009

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

1 голос
/ 05 ноября 2009

Перейдите на C ++ и выберите нужные языковые функции. У вас все еще есть полный контроль над выходным объектным кодом, если вы понимаете используемые вами абстракции C ++.

Использование ОО все еще может работать хорошо, если вы избегаете использования виртуальных функций. Избегайте неизменных типов объектов, которые требуют большого копирования для передачи значений, таких как std :: string. Но вы все равно можете использовать такие функции, как шаблоны, без какого-либо реального влияния на производительность во время выполнения.

1 голос
/ 27 октября 2009

Используйте C с µClibc . Это сделает ваш код проще и уменьшит его площадь. Можно найти в: www.uclibc.org .

0 голосов
/ 27 октября 2009

Для такой специфической задачи, как загрузчик, я бы точно не использовал C ++. Я думаю, что стандартная библиотека c ++ занимает по крайней мере пару МБ, а не то, что вам нужно в загрузчике. Перейти с C.

...