2009-03-27 3 views
9

Я долгое время работал разработчиком C# и .Net и играю с идеей изучения C++.IS C++ преобразован в MSIL?

Одна из основных причин, о которых я думал об этом, заключается в том, насколько быстрее C++ может быть над приложениями с использованием .Net framework. Но правильно ли я предполагаю, что если я напишу приложение C++ в Visual Studio и/или справочные библиотеки .Net в приложении C++, что C++ преобразуется в MSIL (как и C#), и поэтому я потеряю любую выгоду от кодирования в нем?

Так что мой вопрос в самом деле таков: это компоненты на C++ приложения, ссылающиеся на сборники .Net, скомпилированные в «традиционном» виде, или компилируемые в MSIL?

ответ

25

Ну, это немного сложнее, чем это. На самом деле есть две совершенно разные версии .NET-поддержки C++.

Старая, управляемые расширения для C++, была единственным вариантом, доступным в Visual C++ 2002/2003. Он доступен в новых компиляторах по опции/clr: oldSyntax. Это довольно неуклюжий, поскольку он пытается интегрироваться со стандартным C++, поэтому все новые ключевые слова (и их много) имеют префикс с двойными подчеркиваниями и т. Д. Код, сгенерированный этим компилятором, представляет собой смесь родного и MSIL-кода, получившего название IJW "it просто работает ».

Новый, называемый C++/CLI, представляет собой чистый новый язык, доступный в Visual C++ 2005 и более поздний. Самое главное, он поддерживает несколько режимов генерации кода. Опция/clr снова генерирует смесь IJW кода native и MSIL. /clr: чистый результат в сборке только для управления, хотя он может переводить родные типы в соответствующие .net-структуры. Поэтому код не может быть безопасным для текста и может использовать арифметику указателя, в значительной степени похожую на C# с/unsafe. И самый строгий из возможных вариантов:/clr: safe, который создает надежную, проверенную MSIL-сборку, точно так же, как компилятор C# (без/небезопасно, то есть).

Для отличий между MC++ и C++/CLI см. wikipedia.

Описание переключателей компилятора см. MSDN.

PS. Байт-код .NET называется либо MSIL (Microsoft Intermediate Language), либо CIL (Common Intermediate Language). MIL может поддерживать Media Integration Layer, недокументированную низкоуровневую библиотеку, используемую WPF и Vista Desktop Window Manager.

6

This - довольно хорошее (если датировано) обсуждение управляемых и неуправляемых C++.

В оболочке ореха C++ может управляться (скомпилирован в MIL) или неуправляемым (скомпилирован на собственный код).

+5

В «сетчатой ​​оболочке» :) –

2

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

С C++ вы можете запускать его как .NET-приложение C++/CLI или native. Это просто компилятор в Visual Studio, но между ними существует довольно много синтаксических различий. Я лично считаю, что изучение обоих вкусов полезно.

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

19

Возможно, это хорошая идея, чтобы отдельные понятия были разделены.

Во-первых, C++ - это язык, и он не указывает ничего о том, на какой платформе должен быть нацелен. В принципе, прямой код на C++ может быть скомпилирован на собственный ассемблер x86, байт-код Java, MSIL или что-нибудь еще, о чем вы думаете. Я считаю, что Adobe недавно создала компилятор C++, который генерирует байт-код Flash.

Во-вторых, с типичной нерешительностью Microsoft создала два языка C++, предназначенные для .NET. Во-первых, они создали «управляемые расширения для C++». Затем они решили, что он сосать, бросил его и попытался притвориться, что он никогда не существовал.

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

Visual Studio 2005 и новее поддерживает C++/CLI. (в разделе «Добавить проект» они перечислены в Visual C++ -> CLR)

Однако (вы не думали, что все так просто, не так ли?), Microsoft сделала это снова. После указания C++/CLI, который на самом деле является разумно продуманной попыткой интеграции C++ с CLI, они поняли, что практически никто его не использует! Оказывается, что даже программисты на С ++ обычно предпочитают использовать C#, когда они работают в .NET, и, собственно, родной C++.

Итак, теперь они сосредоточены на создании взаимодействия между родным C++ и .NET более простым и мощным. Однако C++/CLI вряд ли исчезнет. Он работает, и в некоторых случаях это полезно. Это просто не C++ - убийца, на который они изначально надеялись.

Visual Studio (с тех пор навсегда) также поддерживает собственные приложения на C++, скомпилированные для машинного кода x86, незанятые .NET. Они перечислены в диалоговом окне «Добавить проект» в Visual C++ -> Win32.

Итак, если вы хотите изучить C++, у вас есть два варианта: Изучите C++/CLI, который ограничивает вас только языком MS, который да, генерирует MSIL вместо собственного машинного кода и требует .NET для запуска, и вообще не стоит беспокоиться, потому что если вы собираетесь зависеть от .NET в любом случае, почему бы не написать в C#?

Или изучите надлежащий C++, который полностью отделен от .NET и не может напрямую ссылаться на сборки .NET.

Ключевым моментом является то, что они являются отдельными языками. Либо вы компилируете как C++/CLI, что означает, что компилятор позволит вам ссылаться на сборки .NET, и будет генерировать код MSIL, или вы компилируете как C++, и в этом случае мир .NET не существует.

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

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

http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx и сообщения в блогах, ссылки на них заслуживают внимания для тех, кто интересуется производительностью аналогичного кода, написанного на двух языках.

Существует только одна область, где приложения C++ будут последовательно быстрее, и это во время запуска. .NET-приложение, возможно, придется загрузить платформу .NET и JIT-код MSIL, где начинается собственное приложение ... только начинается.

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

1

Компоненты C++ не могут легко ссылаться на сборки .Net (вам необходимо использовать COM). Управляемый C++ скомпилирован в CIL и имеет тот же профиль производительности, что и C#.

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

Смежные вопросы