关于微软.NET Native

亲,你是否还在为下载的游戏打开时出现 "未找到xxx.dll”的错误提示而纠结?你是否还在叹息为什么C#编写的程序在没有.net framework的机器上跑不起来,就像你兴致勃勃地用java写了一个盗别人QQ的木马,传给对方,却恍然大悟地想明白对方没有jre?你是否还在日夜羡慕着C,C++这样的非托管语言编写的代码不需要什么特殊的runtime?你是否还在为用C#开发WEB程序的时候,第一次启动页面总是很慢感到苦恼?

如你所知,JIT(just-in-time)实时编译器是CLR的重要组件,它的职责是将IL转换成本地CPU指令。

没错,亲,你用C#编写的代码在编译的时候不会一次性的编译成二进制代码,而是别编译成了一种叫做IL的中间代码,这种叫做IL的代码到了目标机器上后,在第一次运行的时候会被目标机器的CLR中的JIT真正编译成为二进制代码,因此目标机器才能正常执行,若缺少.net framework,则IL无法被进一步编译,于是你的刚下载的游戏就这样无情的崩了;(java语言编写的代码在初次编译的时候被编译成了ByteCode,到了目标机器需要用jre来进一步解释该代码,最终才能编译为二进制代码;因此缺少jre无法执行javadaid代码)。
C#的“第一春”:Ngen
Ngen:本地代码生成器。可以在一个应用程序安装到用户的计算机上时,将IL代码编译成本地代码。也就是说你在安装一个由C#编写的游戏的时候,在你安装的时候,该IL代码就开始被Ngen进一步编译为本地CPU的机器码,而不需要运行的时候才开始由JIT来编译。这样看上去有助于提升应用程序的性能。
为什么说是“看上去”有助于提升应用程序的性能呢?NGen.exe不能提高.NET应用程序性能吗?你看,NGen.exe可以减少JITComplier的验证和编译,这部分开销难道不是省掉了吗?
实际上NGen.exe仅仅是加快应用程序的启动速度,执行时的性能并不比JITComplier编译的代码快。主要原因是,编译代码时, NGen无法像JIT编译器那样对最终的执行环境作出许多假设,这会造成NGen.exe产生较差的代码。例如, NGen不能优化一些CPU指令, 对静态字段的访问需要间接的操作而不能直接访问,因为静态字段实际的地址需要在运行时刻才能知道。NGen到处插入代码来调用类的构造函数,因为它不知道代码执行的次序,不知道类的构造函数是否已经被调用。

C#的“第二春”:.NET Native

JAVA语言的出现,让开发人员明白,现在的硬件配置都很高,有时候牺牲一点硬件配置要求,提高开发效率,是值得的,IOS的出现,编译后运行的流畅度也是有必要的,于是微软终于开始踏出了这一步。

去年,微软在 MSDN 博客上宣布了 .NET Native 的开发者预览版。.NET Native 可以将 C# 代码编译成本地机器码。有了它,开发者将不仅能享受 C# 的高生产力,而且能拥有 C++ 般的性能,有了 NET Native,我们都可以兼得 C# 的生产力与 C++ 的战斗力。据说,使用 .NET Native 编译 Windows 商店应用程序,启动速度将会加快 60%,同时占用内存的内存也更少。
遗憾的是目前开发者可以使用该开发者预览版构建基于 ARM 或 x64 架构的 Windows 商店应用程序(很快就会支持 x86 架构,敬请期待)。.NET Native 很快将会实现跨设备的无
缝体验。今天的预览版只支持 Windows 商店应用程序,我们将继续努力改进 .NET Native 以支持所有 .NET 应用程序的本地编译。
根据微软提供的 FAQ,.NET Native 预览版目前只支持 C# 语言,用 .NET Native 编译的程序将作为独立的原生编译代码部署到目标机器上,运行不再需要安装 .NET Framework。

让我们期待.NET逐步走向开源,做得更好。本文到此也就结束了,同时感谢大神Jeff Wong 博主的一些技术资料.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值