Здравствуйте, Alexey.Os, Вы писали:
AO>Я пытаюсь собрать информацию, оценить ”минусы” и “плюсы” и сравнить перспективу.
Если нужен кроссплатформенный GUI, то C++ и Qt. Но по времени выйдет в 3 раза дольше, чем на WPF.
Если ПО не завязано на супермегавычисления, то однозначно C#. В разы больше вещей, которые за Вас делает компилятор и .Net runtime и о которых не надо думать.
Если супермегавычисления (и хитрая оптимизация по памяти) нужны, то я бы сделал ядро на C++, а GUI и некритичные по ресурсам вещи — на C#. По трудозатратам выйдет огромная экономия.
AO>Например, C# требует .NET. Что здесь хорошего, а что плохого?
AO>Какие еще ключевые отличия C++ от C# ?
Плюсы плюсов:
* Кроссплатформенность (в т.ч. GUI с Qt). C# сносно работает на Linux и Mac, но с GUI там большие проблемы.
* При желании можно выжать из железа максимум производительности. Скажем, поиск по многогигабайтной хэш-таблице, сохраненной в файле, без чтения всего файла в память, элементарно делается на C++ и жутко коряво выглядит на C# (с десятками вызовов BitConverter-а). Можно альтернативно использовать unsafe, но там есть свои тонкости.
* Требует существенно меньше памяти
Минусы плюсов:
* Нет нормального garbage collector-а. Поэтому нужно постоянно держать в голове, что и когда удаляется. Всякие shared_ptr и т.п. частично эту проблему решают, но держать это в голове все равно придется. Простейший пример на C#:
myEventSource.LineReceived += myHandler.HandleLineReceived;
myEventSource.DoSomethingInBackround();
2 объекта, первый делает что-то в фоне, второй подписан на его события. Оба удалятся автоматически, когда станут не нужны.
На C++ вы тут же упретесь в то, что:
а) Нельзя просто так взять указатель на метод и автоматически увеличить reference count для объекта. Можно, используя шаблонную магию, но вы замучаетесь.
б) Если myHandler держит ссылку на myEventSource, то получается circular reference. Надо разруливать руками: или делать weak reference, или shutdown() который сбросит (опять же руками) всякие вспомогательные smart-указатели.
* Меньше синтаксического сахара. К примеру, вот такая строчка в C#
return m_Something?.SomethingElse?.SubSomething ?? "empty";
на C++ занимает в 3 раза больше места:
if (!m_Something || !m_Something->SomethingElse || !m_Something->SomethingElse->SubSomething)
return "empty";
return m_Something->SomethingElse->SubSomething;
и таких примеров много. Соответственно, одинаковый по функционалу код получается более громоздким и дорогим в поддержке.
* Нет reflection. В C# я могу объявить вот такую структуру:
struct MyStruct
{
int Score;
string[] Names;
}
и вызовом одного метода сбросить ее в XML:
<MyStruct>
<Score>123</Score>
<Names>
<string>Alice</string>
<string>Bob</string>
</Names>
</MyStruct>
Это позволяет эффективно разделять алгоритмы и данные, сохраняя всякие настройки, policy, и т.п. в легкочитаемой форме, которую можно зачекинить в git. Более того, форма не привязана к порядку и размеру полей внутри структур, т.е. добавив в середину новое поле, я не сломаю сохраненные файлы.
* Нет yield return, async/await, LINQ и прочих вещей, которые часто экономят сотни строк кода.
* Существенно дольше компиляция, если Вы часто редактируете header-ы. Можно частично побороть через precompiled headers, но все равно будет медленно.
Как-то так.