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

Как и предполагали люди, вы можете использовать трубы. Но я думаю, что вы забыли главное преимущество ООП (которое не может быть использовано в Javascript, но реализовано в Typescript). И это классовое наследство! :)

Запомните основы:

class base {
    variable1;
    constructor() {
       this.variable1 = 1;
    }
}
class child extends base {
    variable2;
    constructor() {
        super();
        console.log(this.variable1);
    }
}

И то же самое относится и к членам класса в качестве методов и свойств. Благодаря Typescript это стало возможным.

39
задан Community 23 May 2017 в 11:47
поделиться

6 ответов

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

C

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

C, C++

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

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

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

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

C#

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

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

64
ответ дан Mohsen 27 November 2019 в 02:01
поделиться

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

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

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

14
ответ дан Eclipse 27 November 2019 в 02:01
поделиться

Примите во внимание, что я говорю ASFAC ++ B.:) Я поместил самый важный фактор дифференциации сначала.

Сборка "мусора"

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

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

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

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

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

Существуют среды, которые так скромны, что GC не практичен - но они все больше редки. Сотовые телефоны обычно имеют GC. GC CLR, на котором обычно работает C#, кажется, является современным.

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

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

Неопределенное поведение

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

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

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

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

Сложность

С точки зрения сложности C++ должен быть выбран, особенно если мы полагаем, что very-soon-to-be стандартизировал новую версию. C++ делает абсолютно все, что он может для создания себя эффективным, за исключением принятия GC, и в результате он имеет потрясающую кривую обучения. Разработчики языка извиняют большую часть этого путем высказывания, что "Те функции только для авторов библиотеки, не обычных пользователей" - но быть действительно эффективными при любом языке, необходимо создать код как допускающие повторное использование библиотеки. Таким образом, Вы не можете выйти.

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

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

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

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

Библиотеки

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

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

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

И все эти сторонние библиотеки имеют свою собственную причудливую таможню для классов идентификатора и функций? Вы betcha!

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

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

Закрытия (Анонимные методы с получением локальной переменной)

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

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

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

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

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

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

70
ответ дан Daniel Earwicker 27 November 2019 в 02:01
поделиться

Мое мнение является C#, и ASP.NET был бы лучшим из трех для разработки, которая является смещенной сетью.

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

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

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

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

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

5
ответ дан Robert Paulson 27 November 2019 в 02:01
поделиться

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

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

4
ответ дан Colas Nahaboo 27 November 2019 в 02:01
поделиться

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

1
ответ дан MarkusQ 27 November 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: