Языка С/C++ не существует

f0a505d4ca4a6faaad0733e17c5a6bb4.png

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

  1. Языки несовместимы и уже давно. Они развиваются параллельно (хотя про развитие стандарта С не знает ничего даже гугл, но он есть, добавили дженерики и хотят лямбды…)

  2. Громадная часть С кода хоть и компилируется в С++, но является undefined behavior. В первую очередь из-за того, что все типы в С являются тупым набором байт и никакая эмуляция полиморфизма здесь не поможет. Язык позволяет относится со всем как с байтами, тогда как в С++ все типы это объекты инкапсулирующие свою логику через конструкторы и деструкторы, есть понятие лайфтайма, относится как к байтам можно только к тривиально копируемым объектам и то не всегда и не везде, только в С++20 валидно было бы реинтерпретировать байты как int, а в С коде это происходит повсеместно.

    Согласно стандарту С++ программа с undefined behavior не является программой на С++, а значит как только вы скомпилировали сишный файлик скорее всего ваша программа перестала быть С++ кодом.

  3. Самое главное — языки требуют абсолютно разных умений и подходов к разработке.

С — фактически императивный язык структурного программирования (да и с этим можно поспорить из-за обилия goto в некоторых проектах). Он не предполагает никакой декларативности, полиморфизма, инкапсуляции, иммутабельности и прочих модных слов. Его сфера использования это места, где нет С++ компилятора (глубокий наколеночный эмбед)

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

Эти подходы (декларативный и императивный) фактически противоположны, поэтому разработчик на С++ будет с трудом писать на С, а разработчик на С, как показывает практика, вообще не сможет писать в стиле С++

И это не абстрактные рассуждения в вакууме, если компания ищет С/С++ разработчиков, то она не знает чего хочет и найдёт посредственных специалистов или команду абсолютно несовместимых людей, у которых не получится вместе что-то разрабатывать.

Давайте уже одумаемся.

© Habrahabr.ru