Сравнение языков программирования
C против C++: где грань все еще имеет значение
C и C++ на досках объявлений выглядят взаимозаменяемыми, но на практике ведут себя по-разному. C — это переносимая версия машины: крошечная среда выполнения, стабильные ABI и язык, на котором написана каждая ОС и ядро интерпретатора, оплачиваемый узкой стандартной библиотекой и дисциплиной памяти, полностью возложенной на вас. В C++ добавлены такие абстракции, как RAII, шаблоны и STL, которые позволяют создавать большие системы без утечек повсюду, за что приходится платить временем компиляции, ошибками шаблонов и разрастанием функций. Строка, которую следует удерживать: ядра, драйверы, встроенное ПО и границы библиотек остаются C; приложения, настольное программное обеспечение и игровые движки работают на C++.
Главное
- Удобная стандартная библиотека C не является проклятием для встраиваемых систем: инструментальная цепочка для нового микроконтроллера сначала говорит на C, часто исключительно.
- C++ RAII заменяет целые классы ошибок: деструкторы в сочетании с получением ресурсов превращают ручной свободный код в код, предназначенный только для установки.
- Сохраняйте границы ABI C: каждая динамическая библиотека, подключаемая к языку сценариев, ядру или распределенному двоичному файлу, экспортирует C-образный интерфейс.
- Современный C++ (после 11) — это другой язык: умные указатели, семантика перемещения и STL отвечают на большинство жалоб «C с классами».
- Оба имеют неопределенное поведение, и оно доминирует в реальных системах гораздо больше, чем предполагают дебаты о функциях.
- Варианты, ориентированные на безопасность, существуют потому, что сертификация требует правил: MISRA C и AUTOSAR C++ — это форма этого требования, а не фольклор.
- Философия Страуструпа гласит: «Вы не платите за то, чем не пользуетесь»; меру, прежде чем отклонять это утверждение в любом направлении.
- Наем сотрудников четко разделен: специалисты по C++ работают в сфере финансов, игр и высокопроизводительных вычислений; Столы C во встроенных инструментах, пространстве ядра и системных инструментах. Выбирайте для своей отрасли.
Заметка из практики
Граница C/C++ в нашем магазине была установлена библиотекой, а не философией: каждая граница плагина и расширение Python, которые мы написали, сначала экспортировали плоский C ABI, и это правило устранило десять счетов страданий.
Частые вопросы
Является ли C++ просто C с дополнительными функциями?
Нет: C++ компилирует большую часть кода C, но это отдельный язык со своей семантикой, и идиоматический C++ генерирует другие машинные формы, чем идиоматический C.
Должен ли системный проект использовать «C, без классов» внутри C++?
Иногда; но если у вас есть набор инструментов C++, скомпилируйте его на C и соблюдайте честность границ, а не делайте ставку на диалект и не тестируйте сообщество.
Какая история с безопасностью памяти лучше?
Ни один из них не поставляется изначально, и именно поэтому Rust получает свое собственное сравнение. Современный C++ смягчает ситуацию с помощью RAII и дезинфицирующих средств; C полагается на дисциплину и инструменты (valgrind, UBSan).
Что на самом деле решает между ними?
Экосистема, к которой вы должны подключиться, и команда, которую вы можете нанять: прошивка и код, связанный с ядром, остаются C; большие приложения со сложной предметной областью работают на C++.
Как мы берём на себя сравнение языков программирования
Это то, чем мы занимаемся каждый день: Языки для работы системы, сценариев и сервисов, сравниваемые по тому, что действительно важно в производстве: гарантии безопасности, чистая скорость, кого вы можете нанять, и насколько болезненно развертывать и исправлять полученные сервисы. Наша услуга Администрирование серверов и Обслуживание сайтов закрывает задачу целиком — оценка, внедрение, круглосуточный мониторинг и экстренная реакция в течение 30 минут.