IS C ++转换成MSIL?

时间:2009-03-27 03:03:25

标签: .net c++ compiler-construction cil

我一直是C#和.Net开发人员,并一直在玩学习c ++的想法。

我一直在考虑这个问题的一个主要原因是,使用.Net框架的应用程序可以比C ++快多少。但我是否正确地假设如果我在Visual Studio中编写C ++应用程序,和/或在C ++应用程序中引用.Net库,C ++在MSIL中转换(就像C#一样) - 因此我放弃了任何好处来自编码?

所以我的问题是这样的:应用程序的C ++组件是以“传统”方式编译的.Net程序集,还是编译成MSIL?

5 个答案:

答案 0 :(得分:26)

嗯,这比那复杂一点。 实际上有两个完全不同版本的.NET支持C ++。

旧的,C ++的Managed Extensions,是Visual C ++ 2002/2003中唯一可用的选项。它可以在选项/ clr:oldSyntax下的较新编译器中使用。它有点笨拙,因为它努力与标准C ++集成,因此所有新关键字(以及其中很多)都以双下划线为前缀等。此编译器生成的代码是本机和MSIL代码的混合,被称为IJW“it只是工作“。

这个名为C ++ / CLI的新语言是Visual C ++ 2005及更高版本中提供的一种干净的新语言。最重要的是,它支持几种代码生成模式。 / clr选项再次生成本机和MSIL代码的IJW混合。 / clr:pure导致仅托管程序集,尽管它可以将本机类型转换为相应的.net结构。因此,代码可能不是类型安全的,可以使用指针算法,非常类似于C#with / unsafe。 最严格的选项是/ clr:safe,它生成类型安全,可验证的MSIL-only程序集,就像C#编译器一样(没有/不安全,就是这样)。

有关MC ++和C ++ / CLI之间的差异,请参阅wikipedia

有关编译器开关的说明,请参阅MSDN

PS。 .NET字节代码称为MSIL(Microsoft中间语言)或CIL(通用中间语言)。 MIL可以代表媒体集成层,这是WPF和Vista桌面窗口管理器使用的未记录的低级库。

答案 1 :(得分:20)

将概念分开是个好主意。

首先,C ++是一种语言,并没有指定应该针对哪个平台的任何内容。原则上,直接C ++代码可以编译为本机x86汇编程序,Java字节码,MSIL或您需要考虑的任何其他内容。我相信Adobe最近制作了一个生成Flash字节码的C ++编译器。

其次,凭借典型的优柔寡断,微软已经创建了两种针对.NET的C ++派生语言。首先,他们制作了“C ++的托管扩展”。然后他们决定吮吸它,抛弃它并试图假装它从未存在过。

现在,对于.NET风格的C ++,最好的选择是C ++ / CLI,但它不是C ++ 。它以多种非标准方式扩展和改变语言。 (我相信C ++标准委员会要求他们更改名称以避免混淆。但他们没有)

Visual Studio 2005及更高版本支持C ++ / CLI。 (在“添加项目”中,它们列在Visual C ++ - > CLR)

然而(你觉得它不那么简单,不是吗?),微软再次做到了。指定C ++ / CLI后,实际上是一个设计合理的C ++与CLI集成的尝试,他们意识到几乎没有人使用它! 事实证明,即使是C ++程序员通常也喜欢在.NET工作时使用C#,而在其他情况下则使用适当的原生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 ++会更快,可能是错误的。 可以,因为它可以让你获得更多控制权。但通常情况下,这只意味着编译器无法避免您在代码中创建的低效率。

答案 2 :(得分:6)

This对托管与非托管C ++的讨论非常好(如果过时)。

在坚果shell中,C ++可以是托管(编译为MIL)或非托管(编译为本机代码)。

答案 3 :(得分:2)

无论你想学习C ++的理由如何,了解更多语言总是好的,因为它拓宽了你的思维,所以学习C ++本身就是一个宝贵的教训。

使用C ++,您可以将其作为.NET应用程序C ++ / CLI或本机运行。它只是Visual Studio中的编译器开关,但两者之间存在很多语法差异。我个人认为学习两种口味都很有用。

在您的项目中选择哪一项取决于要求,例如如果您的程序需要与其他托管模块(如用C#编写的模块)进行交互,则最好使用C ++ / CLI来避免托管和非托管代码之间的某些开销切换。

答案 4 :(得分:1)

C ++组件不能轻易引用.Net程序集(您需要使用COM)。托管C ++编译为CIL,与C#具有相同的性能配置文件。

对于大多数代码来说,对于相同级别的光学化,C ++的速度提高了大约10%,但C#花费了一半的时间来编写和调试,所以在相同的时间内我认为你可以实现的优化将使C#更快。 ..