Каковы различия между C, С# и С++ с точки зрения реального приложения

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

Примечание:

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

Ответ 1

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

С

  • Программное обеспечение уровня ядра.
  • Драйверы аппаратных устройств
  • Приложения, в которых требуется доступ к старому, стабильному коду.

C, С++

  • Разработка приложений или серверов, в которых управление памятью должно быть точно настроено (и не может быть предоставлено универсальным решениям для сборки мусора).
  • среды разработки, требующие доступа к библиотекам, которые плохо взаимодействуют с более современными управляемыми языками.
  • Хотя управляемый С++ может использоваться для доступа к платформе .NET, это не плавный переход.

С# предоставляет модель управляемой памяти, которая снова добавляет более высокий уровень абстракции. Этот уровень абстракции добавляет удобство и улучшает время разработки, но усложняет доступ к API более низкого уровня и затрудняет специализированные требования к производительности.

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

Синтаксис С#, безусловно, менее требовательный (и подверженный ошибкам), чем C/С++, и для инициированного программиста имеет более мелкую кривую обучения.

С#

  • Разработка быстрых клиентских приложений.
  • Высокопроизводительная разработка сервера (например, StackOverflow), которая извлекает выгоду из платформы .NET.
  • Приложения, которые требуют преимуществ платформы .NET на языке, на котором он был разработан.

Johannes Rössel делает правильный вывод о том, что ключевые слова С#, Unsafe и Unchecked пробивают слой абстракции, на котором построен С#. Я хотел бы подчеркнуть, что тип программирования является исключением для большинства сценариев разработки С#, а не фундаментальной частью языка (как в случае с C/С++).

Ответ 2

Имейте в виду, что я говорю ASFAС++ B.:) Сначала я поставил наиболее важный дифференцирующий фактор.

Коллекция мусора

Сбор мусора (GC) является единственным важным фактором в дифференциации этих языков.

В то время как C и С++ могут использоваться с GC, это связано с запозданием и не может быть сделано для работы (самый известный здесь) - он должен быть "консервативным", что означает, что он не может собрать всю неиспользуемую память.

С# разработан с нуля, чтобы работать на платформе GC, а также со стандартными библиотеками. Это имеет принципиальное значение для производительности разработчиков, о чем нужно подумать.

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

Существует также распространенное мнение о том, что GC можно заменить на shared_ptr, но он не может; ирония заключается в том, что в многопоточной программе shared_ptr работает медленнее, чем система на базе GC.

Есть среды, которые настолько экономны, что GC непрактичен - но они все реже. У сотовых телефонов обычно есть GC. CLR GC, который, как правило, работает на С#, по-видимому, является самым современным.

С момента принятия С# около 18 месяцев назад я прошел несколько этапов чистой настройки производительности с помощью профилировщика, и GC настолько эффективен, что практически не виден во время работы программы.

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

Undefined Поведение

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

Почти все, что связано с С++, касается поведения undefined. Даже очень интересные возможности, такие как лямбда-выражения, могут быть легко использованы как удобный способ повредить стек (захватить локальный по ссылке, позволить экземпляру лямбды пережить локальный).

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

(Там небезопасный режим, который имеет указатели и, следовательно, поведение undefined, но это настоятельно не рекомендуется для общего использования - считайте его аналогичным встроенному языку ассемблера.)

Сложность

С точки зрения сложности, С++ должен быть выделен, особенно если мы рассмотрим очень скоро будущую стандартизованную новую версию. С++ делает абсолютно все, что может, чтобы сделать себя эффективным, не считая GC, и в результате у него есть потрясающая кривая обучения. Разработчики языка объясняют это тем, что "эти функции предназначены только для авторов библиотек, а не для обычных пользователей", но для того, чтобы быть действительно эффективными на любом языке, вам необходимо создать свой код в виде многоразовых библиотек. Поэтому вы не можете убежать.

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

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

Обратите внимание, что не все новые функции языка приравниваются к дополнительной сложности. Некоторые языковые функции описываются как "синтаксический сахар", поскольку они являются сокращением, которое компилятор расширяет для вас. Это хороший способ подумать о многих усовершенствованиях С# в последние годы. Стандарт языка даже указывает некоторые функции, предоставляя перевод длинным, например. using выражается в try/finally.

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

Библиотеки

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

Кроме того, стандартная библиотека чрезвычайно проста - С++ имеет полный набор структур данных и способ представления строк (std::string), но это все еще минимально. Существует ли стандартный способ поиска списка файлов в каталоге? Удивительно, нет! Существует ли стандартная поддержка библиотеки для синтаксического анализа или генерации XML? Нет. Как насчет доступа к базам данных? Будь серьезен! Написание веб-сайта на базе? Ты сумасшедший? и др.

Итак, вам нужно отправиться на охоту дальше. Для XML попробуйте Xerces. Но использует ли std::string для представления строк? Конечно, нет!

И у всех сторонних библиотек есть свои странные обычаи для классов и функций именования? Ты дочери!

Ситуация в С# не может быть более разной; основы были с самого начала, поэтому все прекрасно взаимодействует (и потому, что основы предоставляются CLR, существует поддержка на разных языках).

Это не все идеально; дженерики должны были быть на месте с самого начала, но не были, что оставляет видимый шрам на некоторых более старых библиотеках; но обычно тривиально исправлять это извне. Также ряд популярных библиотек переносится с Java, что не так хорошо подходит, как только оно появляется.

Закрытие (анонимные методы с локальным захватом переменных)

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

Забавная вещь о С++ заключается в том, что ее стандартная библиотека была спроектирована так, как будто закрытие было доступно на языке (типы контейнеров, <algorithm>, <functional>). Затем прошло десять лет, и теперь их наконец добавили! Они будут иметь огромное влияние (хотя, как отмечено выше, они пропускают недофинансированное поведение).

С# и JavaScript являются наиболее широко используемыми языками, в которых замыкания "идиоматически установлены". (Основное различие между этими языками заключается в том, что С# статически типизирован, а JavaScript динамически типизирован).

Поддержка платформы

Я поставил это последнее только потому, что он, похоже, не различает эти языки так сильно, как вы думаете. Все эти языки могут работать на нескольких ОС и машинных архитектурах. C является наиболее широко поддерживаемым, а затем С++ и, наконец, С# (хотя С# можно использовать на большинстве основных платформ благодаря реализации с открытым исходным кодом под названием Mono).

Мой опыт портирования программ на С++ между Windows и различными ароматами Unix был неприятным. Я никогда не пробовал переносить что-либо очень сложное на С# на Mono, поэтому я не могу прокомментировать это.

Ответ 3

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

С++ - это C с добавленными классами, а затем целая куча других вещей, а затем еще несколько вещей. Он не держит вас за руку, но это позволит вам держаться за руку, с дополнительным GC, или RAII и смарт-указателями. Если есть что-то, чего вы хотите достичь, есть вероятность, что вы злоупотребляете системой шаблонов, чтобы дать вам относительно простой синтаксис. (moreso с С++ 0x). Эта сложность также дает вам возможность случайно создать десяток экземпляров себя и стрелять в них всех в ногу.

С# - это удар Microsoft по улучшению на С++ и Java. Тонны синтаксических особенностей, но не там, где сложность С++. Он работает в полностью управляемой среде, поэтому управление памятью выполняется для вас. Это позволяет вам "грязно" и использовать небезопасный код, если вам нужно, но это не значение по умолчанию, и вам нужно сделать какую-то работу, чтобы стрелять в себя.

Ответ 4

Мое мнение - С#, а ASP.NET - лучшая из трех для разработки, ориентированная на Интернет.

Я сомневаюсь, что кто-нибудь еще пишет новые веб-приложения на C или С++. Это было сделано 10 лет назад, и, вероятно, много устаревшего кода все еще используется, но они не особенно хорошо подходят, похоже, не так много (текущей) поддержки инструмента, и они, вероятно, имеют небольшой активный сообщество, которое делает веб-разработку (за исключением, возможно, для развития веб-сервера). Я написал много COM-объектов сайта С++ еще в тот же день, но С# гораздо более продуктивен, поскольку нет никаких убедительных оснований для кода C или С++ (в этом контексте), если вам не нужно.

Я все еще пишу С++, если это необходимо, но обычно для небольшого проблемного домена. например сообщение из С# через P/Invoke в старую dll d-стиля C - выполнение некоторых вещей, которые являются совершенно неуклюжими на С#, было легким для создания COM-объекта С++ в качестве моста.

Хорошая вещь с С# заключается в том, что вы также можете легко переносить записи Windows и консольных приложений и оставаться на С#. В Mono вы также не ограничены Windows (хотя вы можете ограничить использование библиотек).

В любом случае, это все с точки зрения веб-предвзятости. Если бы вы спросили о встроенных устройствах, я бы сказал C или С++. Вы можете утверждать, что ни одно из них не подходит для веб-разработки, но С#/ASP.NET довольно гладкий, он работает хорошо, есть куча онлайн-ресурсов, огромное сообщество и бесплатные инструменты для разработчиков.

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

Ответ 5

Из ваших других сообщений, я думаю, вы хотите изучить новый язык, чтобы получить новые навыки. Мой совет заключается в том, что язык не очень важен, важно качество его сообщества (советы, а также существующий код, который вы можете читать и учиться) и доступные библиотеки/рамки. В этом отношении я думаю, что "семья C" не лучший выбор для вас: веб-библиотеки и фреймворки немногочисленны, не переносимы и невелики, а стиль кодирования кода, который вы можете изучать, сильно варьируется и может сильно вас смутить. (Хотя C - мой любимый язык)

Я бы посоветовал просто изучить C и попытаться понять концепцию указателей, а затем перейти на другие языки, более адаптированные к сети (на ум приходит питон или javascript - или даже java). Кроме того, в семействе C Objective-C имеет лучшее сочетание мощности и простоты, на мой взгляд, но является игроком в нише.

Ответ 6

Для сырой скорости используйте C. Для питания используйте С++. Для совместимости .net используйте С#. Все они довольно сложны, поскольку языки идут; C через десятилетия постепенного наращивания, С++ через годы более быстрого улучшения и С# благодаря силе Microsoft.

Ответ 7

C - более старый язык программирования, который описывается как практический. Как программист, вы должны сказать программе сделать все. Также этот язык позволит вам делать почти все. Он не поддерживает объектно-ориентированный код. Таким образом, нет классов.

С++ - язык расширения как таковой C. В C-коде ++ означает приращение 1. Таким образом, С++ лучше, чем C. Он допускает высоко контролируемый объектный ориентированный код. Еще раз очень руки на языке, который идет в МНОГО подробно.

С# - полный объектный ошеломляющий код, напоминающий стиль кода C/С++. Это действительно ближе к JAVA. С# - это последняя версия языков стиля C и очень хороша для разработки веб-приложений.

Ответ 8

C - это основной язык, который наиболее близко напоминает и непосредственно преобразуется в машинный код процессора. Процессоры следуют инструкциям, которые перемещают, добавляют, логически объединяют, сравнивают, прыгают, толкают и поп. C делает это, используя гораздо более простой синтаксис. Если вы изучите разборку, вы можете научиться писать C-код, который так же быстр и компактен, как и сборка. Это мой предпочтительный язык на 8-битных микроконтроллерах с ограниченной памятью. Если вы напишете большую программу для ПК на C, у вас возникнут проблемы из-за ее ограниченной организации. То есть объектно-ориентированное программирование становится мощным. Способность классов С++ и С# содержать данные и функции вместе обеспечивает организацию, которая, в свою очередь, обеспечивает более сложную работу над C. С++ была необходима для быстрой обработки в прошлом, когда у процессоров было только одно ядро. Я начинаю изучать С# сейчас. По-видимому, его структура только класса обеспечивает более высокую степень организации, чем С++, что в конечном итоге приведет к ускоренному развитию и расширению обмена кодами. С# не интерпретируется как VB. Он частично компилируется во время разработки, а затем переводится во время выполнения, чтобы стать более дружественным к платформе.