Или C++ OK только если некоторые особенности языка (например, RTTI, исключения и шаблоны) исключены?
Хорошо, что вы думаете об этом. Сложность компиляции - это не большая проблема, но сложность выполнения имеет стоимость ресурсов.
С ++ облегчает класс/пространство имен модульности (например метод foo()
более чем в одном контексте) и модульность экземпляра (поле членом bar
, принадлежащее к более чем одному объекту), оба из которых являются большим преимуществом в разработке программного обеспечения. Существуют также такие функции, как const
, ссылки, статические приведения и шаблоны, которые могут помочь в обеспечении ограничений и почти не требуют затрат времени исполнения.
Я бы не исключая шаблоны. Они сложны в том, чтобы думать, и вам нужен компилятор, который хорошо их обрабатывает, но стоимость ресурсов - это почти все время компиляции - то, что будет стоить вам, - это тот факт, что каждый раз, когда вы используете шаблон с разными параметрами класса, вы создаете новый набор кода для создания экземпляров функций-членов. Но вам почти наверняка придется делать то же самое без шаблонов. Кроме того, шаблоны позволяют создавать и тестировать библиотеки для общих обстоятельств, в отдельных файлах, которые создаются во время компиляции, а не времени ссылки. Просто уточнить, что: шаблоны позволяют вам иметь файл A.h, который вы тестируете. Затем вы используете его с файлом B.h или B.c для его экземпляра во время компиляции. (Библиотека будет связана, а не скомпилирована, и это делает ее менее гибкой - методы шаблонов могут быть оптимизированы, поэтому они не будут выполнять вызов функции.) Я использовал шаблоны во встроенных системах для реализации кода CRC и исправления, point math: я могу проверить общий код, поместить его в управление версиями, а затем повторно использовать его несколько раз, написав простой класс, который происходит из шаблона или имеет поле члена шаблона. Классическим примером, конечно же, является STL.
RTTI и исключения: они добавляют сложность во время выполнения.Я не очень хорошо разбираюсь в стоимости ресурсов, но я ожидаю, что RTTI будет довольно простым (просто добавляет тег типа, который требует дополнительного пространства), тогда как исключения, вероятно, зверски, включая разворачивание стека.
виртуальные функции: Я использовал, чтобы исключить их из-за затрат памяти + executiontime (минимальные, но все же есть), а также сложность отладки, но они позволяют отделить объекты друг от друга. Если вы не используете виртуальные функции, когда экземпляр одного класса (например, Foo) должен выполнить код, связанный с экземпляром другого класса (например, Bar), тогда первому классу нужно знать все о втором (компилировать Foo вам нужно иметь статическую привязку ко всем методам в Bar) - это добавляет много жесткой связи.
динамическое распределение памяти: это еще одна важная вещь (то есть и в C), которую мы избегаем, как чума в моей компании, - не только возникают всевозможные ошибки, которые могут возникнуть, но и большие стоимость выполнения - это распределитель/деллалокатор, и вы должны быть готовы и знать, что это такое, и принять его.
редактировать: Я бы любовь использовать Java вместо C++ во встроенном мире. К сожалению, мои варианты ограничены, а затраты ресурсов времени выполнения (размер кода, размер памяти, ограничения времени сбора мусора) слишком высоки в пространстве, в котором я работаю. Моя причина для использования Java меньше из-за его свойств времени выполнения и больше для факт, что его дизайн программного обеспечения намного чище, а инструменты намного лучше (OMG! refactoring! woohoo!) ... ключ ко мне, похоже, лежит в двух вещах, что делает C/C++ очень неудобным в сравнении:
что все является объектом, и все методы являются виртуальными, поэтому вы можете сильно опираться на абстракции интерфейсов.
Разделение интерфейса/реализации в Java не является этим неуклюжим уродливым .c/.h
файлом, делящим вещи, что делает компиляторы такими медленными. В constrast я использую Java в Eclipse, и он автоматически компилирует код, когда я его редактирую. Это огромно! Я нахожу большинство своих ошибок сразу. В C/C++ я должен ждать целого цикла компиляции.
Когда-нибудь я надеюсь, что будет язык между C/C++ и Java, что обеспечивает преимущества Java для разработки программного обеспечения, не требуя колокола и свистки, которые делают Java настолько привлекательными для настольных приложений/серверов, но непривлекательными большую часть встроенного мира.
Не только вы должны выбрать язык, вам нужно выбрать средства разработки, которые наилучшим образом поддерживают вашу целевую платформу. Некоторые рекомендации: Metaware, Greenhills и Microsoft Visual Studio (версии, которые включают MS Embedded visual C или C++). Кроме того, вам может потребоваться операционная система: ThreadX, Nucleus, VRTX, WindRiver и MS Embedded (Platform Builder). Если ваша система достаточно велика, вам также может понадобиться файловая система. –