VC++ 和 Native .NET 编译器后端 C2 的更新介绍

来源:互联网 发布:杜兰特总得分最新数据 编辑:程序博客网 时间:2024/05/10 18:56

原文地址

          大多数开发者对C2 不胜了解,但它确是 Windows 开发过程中至关重要的一部分。它扮演着Windows 平台上 Visual C++, .NET 本地编译型代码, 编译型 T-SQL, 和 Objective-C 的编译器后端的角色。

        C++中的安全控制很难,这门语言天生就不太安全,因为可以操作内存,甚至有时候它只是因为一个野指针就可以造成很大的麻烦。为了避免这种危险的发生,微软为他们的编译器加入了一个新的编译开关叫做 /Guard 来改变虚函数的调用方式。这种改动涉及到编译器,链接器,和操作系统,所以这个开关只在 Windows 8.1 及以上的版本起作用。

        尽管CPU的性能逐年提升,但是这种原始时钟频率导致的性能提升并没有得到重视。所以C++需要提高对 resumable functions 的 支持,就是我们常说的协程。恢复和挂起的开销等价于一个普通函数调用,这就有允许我们以零开销的方式抽象现有的异步功能。

        控制流矢量化。如果C++的循环里面包含简单的if语句,编译器就可以加速循环的执行。最近的测试显示程序性能提升了229%到600%。

        像这样的性能提升会伴随着构建时间的增加。但是随着整个应用程序的增量编译,实际的构建时间反而减少了几个百分点甚至数量级。这种实现是通过缓存VC++在编译过程中产生的AST(抽象语法树)从而反馈到整个编译流水线中来达成的。

        你可以使用 /debug:fastlink 开关来切换到新的PDB格式 来进一步提升编译速度。生成PDB文件为的是做调试,这个是构建中最费时的过程。在新的PDB格式下,编译器就不用每次都重新生成整个PDB文件,而只要查询和修改表就可以了。

        .NET 开发人员可能对这些不太关心,但是在 Windows 10 / 统一应用模型下,所有的 .NET 应用在被发布到用户手中时都被编译成了本地机器码。所有的这一切都是通过在流水线上把 IL 中间代码 传递到 VC++ 后端 编译器C2上来完成的。

        C2 也被用来在Windows上编译 Objective-C 。想看更多与此相关的主题,请看接下来的文章:用Visual Studio把 Objective-C 编译成 C++ 或者观看第九频道视频 Compiling Objective-C Using the Visual Studio 2015 C++ Code Generation that Builds Windows, SQL, .Net, and Office.


0 0
原创粉丝点击