Найти в Дзене
Алеша Лушкие

Что же лучше, C++, С, С#?

Оглавление

Полазив по сайтам я нашел:

Это плюсы и минусы С++.

  • Поддержка объектно-ориентированного программирования (ООП). ООП помогает сделать код проще, и его быстрее писать.
  • Высокая скорость.
  • Возможности для работы с данными на низком уровне — то есть на уровне, близком к аппаратному. Благодаря этому на С++ можно писать драйвера, микроконтроллеры.
  • Популярность:
  1. Для С++ создано много библиотек и компиляторов.
  2. С++ используется практически везде (несколько примеров мы уже привели выше).
  • Синтаксис С++ похож на синтаксис C, С# и Java, так что переключаться между этими языками достаточно легко.
  • Совместимость с C благодаря тому, что С++ создавался на его основе.

Минусы

  • Небезопасность: С++ даёт большую свободу действий, но и не удержит вас от ошибок. А лёгкий доступ к памяти делает его уязвимым не только во время хакерских атак, но и при неосторожной работе.
  • Зависимость от платформы: написать на С++ портативный код (такой, который бы работал на разных платформах) очень сложно.
  • Синтаксис строгий и «многословный»: код читается хуже, чем в некоторых других языках (например в Python).
  • Сложность: у С++ сложный синтаксис и маленькая стандартная библиотека, а ещё надо разбираться в указателях и работе с памятью, поэтому учить его нелегко, особенно с нуля.

Спорные стороны

  • Указатели: для многих разработчиков они очень важны. Некоторые языки не позволяют с ними работать, что однозначно даёт С++ преимущество. С другой стороны, при программировании на С++ работа с указателями неизбежна, то есть разбираться с ними придётся волей-неволей. Неправильное использование указателей может привести к неприятным последствиям, как, например, крах программы или искажение памяти.
  • Нет автоматической сборки мусора: программисту приходится всё делать самому. Иногда возможность управлять ресурсами полезна, но в некоторых случаях это создаёт лишние сложности. В любом случае на это придётся тратить дополнительное время.
  • Маленькая стандартная библиотека по сравнению с другими языками (например c Java).

О языке С:

Основное отличие «С++» от «С» — в нем реализуется поддержка объектно-ориентированного и обобщенного программирования. Помимо этого, обеспечиваются самые важные свойства объектно-ориентированного программирования. Это инкапсуляция, наследование и полиморфизм. Произошло это за счет добавления новых возможностей – классов. Так же в «С++» еще появились перезагрузка функций и операторов, наследование классов и пользовательский контроль над управлением памятью.

ТАК МЫ ВИДИМ ОНИ ОТ ДРУГ ДРУГА ОТЛИЧАЮТСЯ НЕ СИЛЬНО.

Сsharp:

C# — мощный язык с кучей возможностей

Корная либа достаточно богатая — из коробки ты в дотнете получаешь тысячи утилит, структур данных, и всяких таких вещей. Решать стандартные задачи здесь действительно легко — все есть, обо всем подумали за тебя. Хороший интероп с плюсами докидывает сверху кучу плюсовых либ, обернутых в дотнетные — на случай, если тебя заставят молотить байты в каком-нибудь софте, связанном с видео или звуком.

Язык достаточно современный, все самые популярные фичи на рынке в нем или есть, или планируются. Синтаксис полегче чем в Java, потяжелей чем в совсем современных языках вроде Котлина. Шарповый код при компиляции превращается в промежуточный язык, который выполняется JIT-компилятором на клиентской машине — в этом есть свои преимущества, но такой принцип работы не оставляет шансов писать настолько же быстрый код, как на плюсах или голанге. Но C# все ещё достаточно быстрый в своей категории. Если просто сесть и писать незамудренный код, очень долго не будешь упираться в какие-то неожиданные проблемы в производительности самого языка.

Язык не супер быстрый — но есть огромное пространство для оптимизаций. Структуры — чтобы хранить данные на стеке, АПИ сборщика мусора, чтобы оптимизировать его работу в конкретных кейсах, есть unsafe — чтобы поработать с указателями и оптимизировать какой-то ботлнек. Богатые инструменты для параллелизма. Есть интринсики, для оптимизаций под конкретные процессоры. Короче, если заморачиваться — скорость работы можно прокачать на раз.

В C# мощная поддержка ООП — тут любой код лежит в классах, полный суппорт наследования, а теперь и множественного наследования через дефолтную реализацию интерфейсов. Куча различных модификаторов доступа, возможность разделять ответственность модулей на уровне сборок. Типизация строгая статическая — всё что можно тайпчекается на этапе компиляции, всё что нельзя — метаинфа о типах едет в рантайм, и может быть прочекана там. Сам дизайн языка как будто специально сделан так, чтобы фигачить архитектуру по Бобу и Фаулеру. В C# очень легко объяснить компилятору, какие части системы делают это, а какие то, и кто из них о ком знает.

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

Но основную проблему языка это только усугубляет. Для современного ЯПа C# слишком многословный. Они завозят новые функциональные фичи, но огромное количество необходимых синтаксических надстроек не позволит их использовать так же изящно, как в каком-нибудь OCaml. Тут чем дальше, тем хуже. Страшный груз обратной совместимости легко разруливается создателями языка на техническом уровне, но всегда выливается в ещё одно утяжеление синтаксиса. Мне немного стыдно, когда я вижу код минимально рабочей программы на C# — язык буквально отказывается освобождать меня от написания очевидного.

Дотнет — для ентерпрайза

Если ты решил прийти, чтобы изобретать новые подходы — тебе тоже не сюда. В дотнете на все есть практики, и все им следуют. Даже скобочки тут придётся форматировать именно так, как принято. Это даже не минус — так со всеми взрослыми языками, и от этого никуда не уйдешь. Самое дурацкое — очень легко стать шарповой боевой единицей, но момент, когда ты точно понимаешь, как работает твой код — наступит оооочень не скоро. В платформе, принципах её работы — масса нюансов, которые по щелчку не выучатся.

Дотнет объективно хорош тем, что на нем можно делать почти все. Бекенды, десктопы, мобильные приложения, сервисы, машинное обучение, ботов. Но это дома можно. Работу ты все равно найдешь только бекендером — других вакансий тупо не бывает.

Что касается рыночных мотивов — тут все просто. В СНГ неплохой рынок на дотнет, зп именно что средние, работенка непыльная. Если хорошо знаешь английский — тогда все круто меняется. В мире много мест, где за дотнетчиков платят полновесным золотом — в том числе и за удаленных. Беда тут одна — культура собесов в дотнете — настоящая жопа. Тут принято мучить кандидатов десятками вопросов на знание деталей платформы, которыми никто не пользуется -их придется именно что учить. Добавьте к этому стандартную дрочь на бекендерском собесе, и получите эталонное шарповое интервью. Тяжелое, и непроходимое без подготовки для спецов любого уровня.

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

А если в плане поэкспериментировать дома — самое то. Ничего не надо изучать и настраивать, скачал IDE, написал мобильное приложение, веб-приложение, ML модуль. Быстро и просто.

Если вам надо делать Игрушки, легкие программы выбирайте, и приложения среднего класса, и т.п выбирай Сsharp.

А если что-то серьёзное, то выбирай С++, с него иожно перескочить на С.