2014-01-28 2 views
2

Какова связь между C++/CX и C++/CLI из синтаксисов и компиляции представления процесса? https://softwareengineering.stackexchange.com/questions/162168/what-are-c-cx-and-c-cli-and-how-do-they-relate-to-c-and-winrt не является исчерпывающим. У кого-нибудь есть дополнительная информация?Зависимость C++/CX и C++/CLI

+0

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

ответ

3

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

Внутренне, когда Windows, объявила о том, что они были построив Windows Runtime, и было решено, что одна из главных целей DevDiv заключалась в поддержке этого API и предоставлении полезных прогнозов на разных языках, была создана небольшая команда разработчиков, чтобы посмотреть на уникальные проблемы и возможности, представленные это для команды C++. Я стал одним из тестеров компилятора, назначенных этой функции, которая в то время мы называли «MoCOM» (Modern COM). Для контекста важно отметить, что я не был в команде разработчиков языка, но я был посвящен некоторым из ранних проектов проекта.

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

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

В конце концов, это означало, что существующий синтаксис C++/CLI соответствовал концепции WinRT достаточно близко, и уже решил многие из более философских проблем, как представлять все эти же понятия таким образом, который был совместим (в той или иной степени) с синтаксисом C++. Это также имело то преимущество, что оно уже реализовано в компиляторе с большим банком существующих тестов. Наконец, команда intellisense в то время работала над реализацией C++/CLI intellisense, поэтому мы могли получить Intellisense C++/CX для небольших дополнительных затрат (по крайней мере, по сравнению с совершенно новым синтаксисом).

Однако, хотя синтаксис был одинаков, фактическое генерирование кода было совершенно иным. В .NET время выполнения делает много тяжелой работы для вас; язык определяет типы и MSIL для выражений, но во время выполнения делает много тяжелой работы: макет типа, родной генерации кода, сбор мусора и т.д.

Несколько примеров:

  • В родной мир C++/CX,^был концептуально и синтаксически подобен C++/CLI^(он представляет собой указатель на интерфейс или класс), но был в реализации совсем другой. Где в C++/CLI вы просто сказали runtime, что это был управляемый указатель определенного типа (a * в MSIL), а среда выполнения «сделала магию», в C++/CX, a^был умным указателем, где требовался компилятор для добавления AddRefs и выпусков в соответствующие моменты времени (например, когда он вышел из сферы действия).
  • «gcnew» в C++/CLI стал простой, единственной строкой MSIL. «ref new» в C++/CX необходимо будет определить подходящую фабрику, создать экземпляр фабрики, а затем попросить фабрику создать экземпляр базового класса.
  • В C++/CLI вы просто должны сделать вызов функции указателем класса, в C++/CX, если у вас есть указатель на класс, вам нужно было определить соответствующий интерфейс, на который была запрошена функция, QI для этого интерфейса, а затем вызывать функцию против результата QI.

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

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

Если вы хотите узнать больше о том, что происходит на самом деле, Deon Brewis, один из дизайнеров и главный разработчик расширения языка, дал прекрасные подробные сведения о мучениях реализации на Build 2011: http://channel9.msdn.com/Events/Build/BUILD2011/TOOL-690C. (Я парень за клавиатурой.)

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