C ++ конвертируется в MSIL? - PullRequest
       16

C ++ конвертируется в MSIL?

12 голосов
/ 27 марта 2009

Я долгое время был разработчиком на C # и .Net, и играл с идеей изучения c ++.

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

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

Ответы [ 5 ]

26 голосов
/ 27 марта 2009

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

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

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

Различия между MC ++ и C ++ / CLI см. wikipedia .

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

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

20 голосов
/ 27 марта 2009

Вероятно, неплохо бы разделить понятия.

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

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

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

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

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

Итак, теперь они сосредоточены на том, чтобы сделать взаимодействие между native 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 ++ будет быстрее. Это может быть, потому что это дает вам немного больше контроля. Но обычно это просто означает, что компилятор менее способен спасти вас от неэффективности, которую вы создаете в своем коде.

6 голосов
/ 27 марта 2009

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

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

2 голосов
/ 27 марта 2009

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

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

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

1 голос
/ 26 января 2010

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

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

...