Для приложения реального времени, который лучше C или C ++? - PullRequest
6 голосов
/ 18 декабря 2009

Я инженер-электронщик с опытом работы с языками C и C ++ (я написал с C для микроконтроллера и с C ++ я написал для Windows с Borland C ++ Builder)

Моя компания разрабатывает продукты для управления двигателями, и мы работаем с STM32 и IAR-компилятором.

Я признаю технические различия между языками, меня интересуют перспективы разработки и стоимость обслуживания кода:

  1. Является ли время разработки кода C ++ длиннее, чем C?
  2. Является ли стоимость обслуживания кода C ++ дешевле, чем C? (Я знаю, что всегда будут изменения в коде)
  3. Легко ли документировать код на C ++ против C? (Документы, которые описывают, как работает код)

Ответы [ 11 ]

17 голосов
/ 18 декабря 2009

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

Но ваш пробег может значительно отличаться, в зависимости от тонны дополнительных факторов. Например, если ваша команда программистов имеет больше опыта работы с C, чем C ++, то, возможно, не стоит делать это на C ++.

9 голосов
/ 18 декабря 2009

Является ли время разработки C ++ код длиннее C?

Это будет полностью зависеть от ваших программистов. Они лучше пишут на C или C ++?

Является ли стоимость обслуживания кода C ++ дешевле, чем С? (Я знаю что всегда будут изменения в коде)

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

Легко ли документировать код на C ++? против С? (Документы, которые описывают как работает код)

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

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

5 голосов
/ 18 декабря 2009
  1. Зависит от опыта команды. С C ++ у вас есть доступ к более богатому набору библиотечных функций (но будьте осторожны с их использованием при внедрении).

  2. Хорошо разработанный код C ++ будет проще поддерживать, чем код C, поскольку он допускает некоторый синтаксический сахар (конструкторы, деструкторы, RAII).

  3. Стоимость документации примерно одинакова.

4 голосов
/ 20 декабря 2009

Резюме

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

Если нет, то вам придется сбалансировать кривую обучения, сложность проекта (которая будет устранена адаптивностью языка) и доступные компиляторы.

Кривая обучения

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

Фактически, может быть легко иметь очень неэффективный код на C ++. Не потому, что «язык медленный», а потому, что разработчики иногда будут кодировать его неправильно (обычно игнорируя не-C части языков C ++, такие как ссылки и т. Д.). Это часть проблемы "кривой обучения".

Но как только «кривая обучения» закончится, мы сможем взглянуть на особенности языка ...

Языковая адаптивность

С довольно тупой. Либо вы используете встроенные конструкции Си, и это будет легко (например, добавление двух целых чисел ...), либо нет, и это будет подвержено ошибкам, а также потенциально неэффективно.

C ++ позволяет легко избежать утечек ресурсов, переполнения буфера, повреждения памяти или стека. В C это может происходить почти в каждой строке кода.

Благодаря встраиванию и инкапсуляции C ++ упрощает эффективную и безопасную работу с любым типом (т. Е. Определяемыми пользователем типами). С помощью шаблонов и ООП C ++ очень просто расширяет некоторые типы с помощью дополнительной функции.

Конечно, все это предполагает, что C и C ++ будут иметь одинаково эффективные компиляторы ...

Составители

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

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

Заключение

1 - Является ли время разработки кода C ++ длиннее, чем C?

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

2 - Стоимость обслуживания кода C ++ дешевле, чем C? (Я знаю, что всегда будут изменения в коде)

Опять же, это зависит от размера / сложности проекта. Чем он сложнее, тем больше архитектуры вам потребуется, и, следовательно, вам потребуется больше поддерживаемых языком функций, а затем используйте C ++.

3 - Легко ли документировать код на C ++ против C? (Документы, которые описывают, как работает код)

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

Это зависит от того, сколько функций вы используете. Например, использование строки C ++ вполне естественно по сравнению с эквивалентным кодом в C. На самом деле, использование сложных структур намного проще в C ++, чем в C ...

MyMatrix A, B, C ; // My Matrix is an user-defined object
// etc.
C = A * B ;        // If you believe this is anything but a
                   // multiplication of two matrices, then
                   // you need serious medical help.

Нет необходимости документировать этот код. Все знают, что такое матрица и что такое умножение. Тот же код на C был бы более многословным ...

Но тогда C ++ тоже может быть довольно многословным. Без foreach (например, Boost.FOREACH) написание цикла для итерации каждого элемента в контейнере STL может быть весьма впечатляющим:

for(std::map<int, std::string>::iterator it = myMap.begin(), itEnd = myMap.end() ;
    it != itEnd ;
    ++it)
{
   // Do something quite complicated...
}

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

: -)

То есть все зависит от знаний C ++ среди ваших разработчиков.

Мой личный вывод?

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

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

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

Post Scriptum: Используется ли C ++ в критически важных приложениях?

Очевидно, C ++ используется в F-35 ("F-22 lite"). Следующий документ интересен тем, что показывает, какие функции C ++ действительно имеют нулевую стоимость (и, следовательно, оказывают положительное влияние), и какие функции C ++ могут оказать негативное влияние на программное обеспечение:

http://www.stroustrup.com/JSF-AV-rules.pdf

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

: -)

3 голосов
/ 20 декабря 2009

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

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

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

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

Все эти пункты касаются разработчиков, а не самого языка.

2 голосов
/ 18 декабря 2009

Вы упомянули слово readtime, которое, как я понимаю, означает, что производительность критична для вас. По этому вопросу я могу сказать, что C ++ не дает снижения производительности по сравнению с C и C ++ и может использоваться в ядрах операционных систем (Symbian).

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

Когда дело доходит до удобства сопровождения, нужно также помнить, что системным программистам, вероятно, будет более комфортно работать с C, чем с C ++.

1 голос
/ 18 декабря 2009

Из-за более строгой типизации данных и ограничений объектов вам обязательно следует использовать C ++:)

1 голос
/ 18 декабря 2009

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

конкретные ответы:

  1. Нет, это обычно зависит от Уровень опыта разработчика с языки. Если он / она больше комфортно с С, то он будет писать C быстрее, чем C ++ (и Тиски-Versa).
  2. То же, что и ответ выше. Техническое обслуживание так же много о качество кода изначально написано а иногда качество документация.
  3. Синтаксис документации одинаков для двух языков.
1 голос
/ 18 декабря 2009

Выбор языка очень мало связан с тремя заданными вами вопросами. Выберите язык, на котором вы более опытны, и это позволит вам быть более выразительным.

0 голосов
/ 18 декабря 2009

Я думаю, что все три упомянутых вами момента зависят от поддержки инструмента. Так как C ++ намного сложнее анализировать, а также анализировать статически, может оказаться, что некоторые инструменты доступны только для C.

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