VS 2015 Update 1 中带微软代码生成的Clang

[原文发表地址]Clang with Microsoft CodeGen in VS 2015 Update 1 [原文发表时间] 2015/12/4 7:17 PM [这篇博客的作者是Dave Bartolomeo 和Clang/C2 团队的组员] 在开发和维护跨平台C++代码方面,其中一个改变就是针对不同平台的不同编译器的问题。 你写的一些针对Windows平台的代码,用Visual C++编译器可以编译成功,但那时你针对安卓平台的编译就会失败,那是因为Clang的标准规格更为严格,你的代码恰好是按照比较宽容的Visual C++编写的。又或者你针对iOS用了一些新的代码,Clang可以编译成功,但是才发现这些新的C++语言,Visual C++是还无法支持的,你只能想办法重新实现这个方法而不用这个新的语言特性,或者生成一个单独的能够用Visual C++编译的Windows实现方式。 为了能够更加方便的进行跨平台代码的开发,使在Windows 和其他平台更好的工作, 我们为Visual Studio单独发布了一个额外的编译工具集, 叫带微软代码生成的Clang编译器。这个编译器为C语言和C++语言使用开源的Clang解析,还有Visual C++ 编译工具的代码生成器和优化器。像对其他平台一样,你可以为Windows使用相同的Clang解析你的跨平台代码,还能够充分利用Visual C++优化器先进的优化功能。因为针对非Windows平台,新的工具也使用的是一样的Clang解析,你不需要在代码里写满令人讨厌的#ifdefs,只需要为不同的编译器说明下即可。同时你的代码中可以使用那些还没有被Visual C++ 编译器所支持的语言特性, 包括C99 复杂类型和C++ 14 扩展的constexpr的支持。因为基于Clang的编译器会长生和Visual C++编译器一样格式的调试的信息,所以你能感受到同样很棒的Visual Studio 调试器体验。 用新的编译工具所编译的代码能够和Visual C++ 2015 C和C++编译器所编译的其他代码相链接。通常,你可以使用带微软代码生成的Clang编译器来编译跨平台代码,用普通的Visual C++ 工具集来编译特定的Windows代码(例如,你的UI)。 请注意,带微软代码生成的Clang编译器现在是一个预览功能。 我们知道在很多方面它还不够完善,仍存在一些漏洞。我们希望你可以尝试使用这个新功能,明白它如在应用在你的代码工作上,并给我们反馈。 安装 在Visual Studio 2015 Update 1中,Visual Studio安装时开始进行功能选择时的UI界面,你会看到在“跨平台和手机开发\Visual…

0

VS GDB 调试扩展说明

[原文发表地址]Announcing the VS GDB Debugger extension [原文发表时间]2015/12/18 今年初我写了一个关于如何在Linux系统上调试Visual Studio 上的C++代码的文章,虽然有一点复杂繁琐,但是是可行的。今天我们发布Visual Studio GDB 调试器扩展预览。这将启用调试远程Linux目标包括物联网设备。 为了使用这个扩展,你需要有Visual Studio 2015 community或以上的版本和安装用于安卓的Visual C++工具。这些工具使用了开源MIENngine,它支持Visual Studio调试器去使用GDB和LLDB也使用的机器接口。GDB调试器扩展了那些表面附加项目的属性,使您可以连接到GDB的Visual Studio调试器,用本地或远程的方式,引进一个新的项目类型包括远程Linux目标。 从VS Gallery开始下载GDB调试器扩展并安装它,这篇文章将会详细介绍如何使用这些扩展,从项目创建到F5包括如何为SSH配置您的windows和Linux环境。我将会在下周的一篇文章中讲如何和Raspberry Pi使用它。 项目创建 在你安装完这些扩展后,创建一个新项目,你会发现在Visual C++,Cross Platform下有一个Makefile Project GDB的新模板。 当我们选择上图的选项,并创建一个新的项目就可以得到一个新的空的解决方法与一些支持文件和readme文件。readme文件介绍了一些内容,但更多的是图片。 如果我们快速的浏览项目的属性,你会看到在调试选项卡的下面我们已经添加了远程和本地GDB调试器选项。我们将在下面详细的介绍这些选项。 一旦配置完成,你就可以点击任何你设置的任何断点并按照你的习惯体验正常的VS调试器:监视,查看,设置和移除断点,等等。 配置SSH 本地SSH客户端 首先你需要获得一个本地SSH客户端,你可以根据你的选择去使用SSH客户端,例如Win32端口的OpenSSH,PuTTY,MinGW或者Cygwin。SSH客户端将用于安全地传输命令从机器接口到一个远程执行GDB。 对于PuTTY,你需要使用plink.exe作为SSH的可执行文件。为了复制文件到你的Linux机器中,你可能需要完整的putty.exe客户端和pscp.exe。你将需要puttygen.exe创建你的私钥用来SSH访问。在Win32 OPenSSH 端口和Putty中,这些工具可以被VS中NMake使用来构建。注意, 基于SSHMinGW/Cygwin,有利于SSH的可执行,但是不能用于在VS中构建,因为我们不知如何在这儿启动。 在Window上创建你的密钥 在这个时候,我们还不能支持有一个密码短语的证书。 要想使用ssh-keygen工具生成Win32 的公/私密钥,如下所示: ssh-keygen.exe –t rsa –f yourkey. 你的私钥将在上方指定的文件中像yourkey,而公钥将在文件yourkey.pub中。 对于PuTTY,你需要通过运行puttygen和单击生成,来创建一个可用于SSH身份验证证书。 保存好公钥和私钥在随后的步骤中使用。 在Linux机器上添加你的公钥 在Linux机器上,你需要将公钥添加到~/.ssh/authorized_keys文件中。如果它不存在就看看下面说明如何创建。每个公钥应该单独一行。一旦该文件存在,你可以按照下面指示来做。 nano ~/.ssh/authorized_keys…

0

引入C ++实验编辑工具!

[原文发表地址]Introducing C++ Experimental Editor Tools! [原文发表时间]2015/11/4 1:00 PM 你好C ++ 世界! 在C++ IDE开发周期的不同时间,我们的开发人员开始开发一些功能,我们认为这些功能可以给客户带来很多价值。但是有时我们自己只是没有足够的数据,来搞清楚是否我们开发的功能会为更多的用户服务。 与其等着收集每一个场景,我们决定在VS2015 Update 1 RC(点击这里下载)上使用“实验”机制,这样当你决定尝试一下的时候就可以很容易地打开和关闭这些功能。你可以通过: 工具–> 选项–>文本编辑 –>C/C++ –>实验来找到这个页面 (或者使用Ctrl+Q并键入“实验”快速导航) 。   需要澄清的是:该功能被列为“实验性”并不意味着 “有意把它列为低质量的功能推放到产品中而且没有任何改进计划。” 它只是意味着我们不能完全肯定,如果当前的质量将充分满足客户的广泛需求。把它们当作“功能原型”,以及巨大的机会让你们去尝试使用它们,并给我们反馈,并把它塑造成优质功能,将来帮助您开发工作流程! 下面列出了每一种实验性功能的简要亮点: 启用新的数据库引擎 – 这应该奇迹般地加快数据库的人口,使用附加功能可以使所有数据库操作更快(无精度损失)例如找到定义和查找所有引用。(只需关闭并重新打开您的解决方案来应用这个功能,不需要重新启动VS!) 成员列表 点 — 箭头 — 当需要查看成员列表时用‘->’取代 ‘ . 启用提取功能 – (通过快捷键 [Ctrl+.] 进行访问) 提取选择的代码到它自己的函数,并且通过调用这个新的函数替代以前的代码。 启用更改签名– (通过快捷键 [Ctrl+.]进行访问)添加,重新排序, 删除函数的参数,并让这些更改在所有调用的地方都起作用。 启用展开作用域 – 尝试把一段代码用大括号括起来,当并不需要它的时候仅仅插入右括号使插入括号自动完成?但不可否认细微工作流程的变化,你可以选择一段代码,然后在选择的代码处键入大括号 { 把代码用 {…

0

Visual C++ 2015 中的可视化调试工具

[原文发表地址]Debug Visualizers in Visual C++ 2015 [原文发表时间] 2015/09/28 10:27 PM 当调试本地应用程序时,通常查看内存中具体对象的值非常有用,不论是自定义的字符串格式,甚至或是对数据执行操作,使其更有意义和更容易解释。自 VS2012,Visual Studio 提供了 .natvis 可视化工具设计来为不同类型的C/C++ 类型声明自定义可视化。可视化的类型改变了对象在本地表达式计算器的显示方式,包括在监视和变量窗口以及调试数据提示。额外关于表达式计算器的信息,参考这篇文档和这篇博客. 编写简单的可视化工具 让我们从创建一个本地的Volcano类开始: Using Namespace std; class Volcano { private:       string m_EnglishName;       string m_nativeName;       string m_meaning;       int m_elevation; //…rest of class definition } Natvis 项目模板 在VS2015中很容易用内置模板添加一个新的.natvis文件到一个工程,可以发现在添加新项目-实用 > 下-> 调试器可视化文件 (.natvis): 为了使我们Volcano对象更容易调试,我们将让显示字符串等于英文名字由于它是关联volcano对象中最好识别的实体。然后我们将创建一个扩展视图以显示所包含的成员。要删除前两个字符串的引号我们将在母语和英语的名字上应用到格式说明符,但会使它失去成员意义因为在调试时引号标记将有助于区分定义。因为我们整数 m_elevation 已经是清晰可读,我们将简单地列出这类变量,而无需修改。 下面是简单.natvis 可视化用于调试时根据需要在…

0

Visual Studio中对安卓平台的Java调试和语言支持

[原文发表地址]Java debugging and language support in Visual Studio for Android [原文发表时间]2015/11/6 12:13 PM 作为我们持续努力的一部分使 Visual Studio成为一个高效的工作环境来开发移动应用程序,我们很高兴地宣布Visual Studio 2015 update1 RC增加调试你的安卓项目中Java源文件 (与扩展的帮助) 在编辑器中对这些文件获取智能感知和浏览辅助。 这篇文章向您展示了如何开始使用新添加的 Java 支持,以及在Update1中有哪些支持是值得期待的。 生成 Java 源代码 支持生成 Java 文件已经是Visual Studio 2015 RTM 版本的一部分。ANT 构建系统默认选取所有在”src”文件夹下的.java 文件进行编译。如果您在 安卓项目中包含这些文件,它们也很容易参与 Visual Studio 内置源代码管理集成。 要在您的安卓项目中开始使用Java,您可以执行下列任一操作: • 创建一个新的项目开始于基本的应用程序模板(在新建项目对话框中C++>Cross-Platform 节点下) • 从一个随Java源码提供的C++ Android代码库示例开始 • 导入一个已经包含 Java 文件的Eclipse安卓项目(安装 Java 支持扩展后,在文件 >…

0

Visual C++ 生成工具2015公告——生成环境中独立的C++工具

[原文发表地址] Announcing Visual C++ Build Tools 2015 – standalone C++ tools for build environments [原文发表时间]2015/11/2 12:04 PM 在Visual Studio 2015 Update 1 RC 发布可用的同时,我们也宣布了一种获得C++工具的新方式:作为一个独立安装包仅包含生成C++工程需要的工具,而不用安装Visual Studio IDE。这意味着在你的生成环境中和连续的集成系统中C++生成工具实现了更高效的交付。 当与你们交谈时,这是最迫切的需求之一,希望新的安装程序将会减少安装时间,并在实验环境下或你没有做C++开发但的确需要这个工具生成C++代码的情况下提供更简单的生成系统。 在Update1 中我应该期望什么? 在Update 1 中,我们正在做这个安装包的预发布,希望听到它是否满足你的需求和可以改进的方式,请通过下面的评论或Connect提交你的反馈信息。 下载Visual C++生成工具 2015(预发布版) Update 1 安装包将会安装以下组件: · Visual C++编译器(针对×86, X64和ARM) · Visual C++ 头文件&库文件(CRT&STL) · Visual C++生成脚本(针对Windows 桌面) · Microsoft 生成工具 2015(MSBuild) ·…

0

Visual C++ 2015中的内存分析

[原文发表地址] Memory Profiling in Visual C++ 2015 [原文发表时间] 2015/10/21 3:33PM 正如在之前的博客中公布的,Visual Studio 2015中发布了一系列新的内存分析工具,帮助定位和解决您应用程序中的内存问题。这个新的调试实时分析器在您的调试阶段运行,您可以在任何时间捕获快照,例如在一个断点上,您也可以在任何暂停状态查看堆内容。当您在想要分析您的应用程序堆状态时,此工具提供更精确和灵活的体验。 准备开始 在VS2015中第一次启动调试器时,呈现在您面前的是新的诊断工具窗口,它能让您看到您正运行的应用程序调试器事件、内存使用率,以及CPU利用率。您可利用内存使用率图来监控调试过程中的总体内存消耗,当您需要更多信息时,您也可以开启堆数据分析并捕获快照来得到更为详细的内存分配分析。 内存分配跟踪及总览 内存分析器可以在应用程序运行中实时收集分配事件数据,然后将这些数据以类型信息形式映射到您的PDB中。由于对VS2015 (v140) 编译器的技术性依赖,类型信息只显示那些使用此版本或更高版本编译器来编译的目标。在一个应用程序调试的过程中收集内存分配事件数据是有内在开销的,因此快照功能默认是关闭的。如要激活堆快照,在诊断工具窗口中打开内存使用率分页并点击堆分析按钮,按钮图标就变为黄色。自VS2015 Update 1 CTP预览版起,堆分析的开启可以无需重启调试器。发生在开启快照前的分配将不会被跟踪,因此您要确保在开启堆分析之后您有一个合适的基线可以重启调试器,或者在设计阶段按F11来开始调试和跳出第一条指令。注意如果您关闭堆快照功能,此项设置将会在终止现有的调试会话之后起作用。 捕获快照 一旦开启快照功能,快照将会在点击“捕获快照”按钮时获取并显示在快照表中。每张快照列出了捕获快照时的执行时间、分配总数和千字节的堆大小。您可以通过点击每一列(内存分配数或堆大小)左边的总数链接打开这个堆快照的完整视图。选择每一列右边的+/-链接可以看到快照差异,并且打开的快照是以此数值排序显示的。 堆检查 类型视图 当您打开一张快照,最初是以在内存中包含的所有对象类型列表显示的。每一个数据类型的总数和内存占用是以降序默认列出的。您可以通过点击相应列的顶部单元格来实现以对象类型名称、数量或大小来排序。在类型视图中不确定类型是默认隐藏的,但是它可以通过点击查询框左边的过滤器图标并取消“隐藏不确定类型”被轻松地显示。 实例视图 双击或者右击一行,选择一个类型“查看实例”,您就可以导航到这个类型的实例并查看单个对象以及它们完整的分配调用堆栈。选择调用堆栈的一行,它将链接到对应的源代码上。您可以通过悬停在一行实例上来激活调试数据提示,这样就能很方便地查看对象的内容,如下在CTrackerChannel 这个实例上的演示: 堆栈视图 在类型页中视图选择框中选择“堆栈”,就可以轻松地通过堆栈帧查看调用树了。您可以通过选择窗口右上角的按钮来根据调用和被调用收集堆栈帧。所有的分配都源于被标记为[self]的当前函数。您可以用右上角的搜索框搜索调用堆栈,很容易地就会搜索到您想找的帧: 从调用树中选择一个堆栈帧,源于此堆栈帧的所有分配和他们的类型就会出现在窗口下部的面板中。展开分配,它的分配调用堆栈将显示在下面。 支持定制分配器 发布的Windows 附带一个ETW提供者,它能在Windows堆中进行事件跟踪分配和重新分配。我们可以把提供者配置成:每个事件包含一个堆栈跟踪。标签__declspec(allocator)可以使编译器确定一个函数调用是对一个分配器的调用,也就是说,一个函数返回新的堆分配内存。在每一次调用分配器函数时,调用点的地址、调用指令的大小和新对象的typeid发送到一个包含在PDB文件里的新的S_HEAPALLOCSITE符号 。当Windows堆代码对一个分配发出一个带有调用堆栈的ETW事件时 ,内存工具在调用堆栈中寻找一个与S_HEAPALLOCSITE符号相匹配的返回地址。符号中的类型typeid决定了分配的运行时类型。 在CRT(新建,分配内存,……)和Windows SDK中的分配器已经在源代码层被标记,这样它们的分配数据可以被捕获并映射到相应的符号。 任何代码想要支持在堆分析期间显示分配的类型信息, 需要v140编译器(或者更高的版本)来编译 。为了提高内存分析的准确性,可以利用__declspec(allocator),确保任何函数返回一个指向新分配的堆内存的指针,正如 myMalloc(size_t size)这个例子: __declspec(allocator) void* myMalloc(size_t size); VS2015 Update 1 CTP上的新功能 支持“附加到进程”分析 Visual…

0

Visual Studio 2015 Update1 候选版发布

[原文发表地址]Visual Studio 2015 Update 1 RC Available [原文发表时间]2015/10/29 4:43PM 你好, Visual Studio 2015 Update1 候选版本(已知的问题)已经可用使用了。它包含很多对C++开发者有用的东西, 在我们了解它之前,Visual C++ 团队想感谢在过去的一年为我们提供反馈的各位。你们的意见和建议(以及批评)帮助我们改进了计划以及优化了我们所提供的一些功能特性。谢谢! 下面是一些不错的新功能: 编译器的改进。 C++编译器以及标准库增加了对C++11 和 C++14特性的支持。同时也包含对C++17标准 某些特性的初步支持。最显著的变化是对关键字contexpr 和 部分SFINAFE表达式的支持。 另外,有200多个编译器bug被修复,包括很多用户通过Microsoft Connect所提交的bug。 跨平台 C++ 手机应用开发。安卓开发者在生成安卓应用的同时也可以调试他们的Java代码,只需点击从VSGallery下载,就可以享受到很好的Java编辑体验。对X64和arm64目标平台的支持也已经加入到Android和iOS开发里。 Android开发者既可以感受到并行编译的好处,也可以很容易将他们的Eclipse工程导出。 重要: 当他们使用Visual Studio 2015 Update1 候选版时,Visual Studio 安卓模拟器和微软测试管理员还不能获取在线许可。因此,如果你需要用到这些产品功能,我们建议你不要安装这个Update1 候选版。 我们的iOS开发者将会感受到很大的升级体验,那就是在Visual Studi里可以操作调试目标和配置文件。想分享你的体验吗?参加这个调查吧! 代码编写。 很多正在试验中的功能也已经被添加进去来改进代码编写的体验包括启用一个新的数据库引擎(来提升一些功能的速度诸如跳转到定义和查找所有引用),成员列表点到箭头,析出函数,修改签名,展开作用域,展开优先顺序。提升GPU使用。新增加的时间轴观察进程可以让你调查线程的CPU和GPU工作流。Fence信号在时间轴窗口高亮可见,这使得寻找匹配信号和等待时间变得更加容易。你可以在这个页面下找到:工具—>选项—>文本编辑—>C/C++—>实验。 更多信息,以及一些关于VS 产品集的文本编辑功能,请参阅此处MSDN页面。 内存诊断。在调试程序中使用诊断工具窗口(Ctrl+Alt+F2)的内存使用工具来获取堆快照。栈观测允许你看到调用的调用树,以及搜索栈里面的被调用函数。链接到另外一个正在运行的进程,获取堆快照,通过比较获取感兴趣的内存位置。 调试。 支持在调试器表达式和可视化工具中的智能指针操作。 Visual C++ 生成工具2015(预发布). 如果你的电脑上没有安装Visual Studio…

0

VS2015 Update 1 的/DEBUG:FASTLINK选项介绍

[原文发表地址] /Debug:FASTLINK for VS2015 Update 1 [原文发表时间] 2015/10/16 8:02 AM 从Visual Studio 2015 Update 1 CTP 开始,我们对/DEBUG:FASTLINK做了一些改变。/DEBUG:FASTLINK旨在改善 Visual Studio的增量开发循环的链接时间,为中等至大型工程提供了2倍的增速。目前,链接器会参与到PDB的生成过程,合并类型信息,修改私有标识符的类型索引,生成全局符号是PDB生成的主要时间组成部分。使用/DEBUG:FASTLINK链接器生成的PDB不会包含任何私有标识符,调试信息被分配到输入对象和库文件中,PDB仅仅用来作为一个索引数据库。DIA APIs已被修改,以允许Visual Studio 调试器提供一个无缝的调试(仅)体验,并且,通过使用这个选项可以提供更快的链接时间且对整体调试体验没有或有很小的影响。这会让使用Visual Studio进行开发的人员感觉非常好。今天,对于Universal工程模板,/DEBUG:FASTLINK已作为链接器->调试属性的默认值(仅Debug配置,如下图 )。 当在不同的机器上用生成的PDB和PE调试时,或换句话说,当你想共享PDB和PE给你们团队的同事时,你可能会遇到以下错误信息。 正如上面提到的,这是因为当指定了/DEBUG:FASTLINK后,链接器生成的只是部分PDB。基于我们收到的反馈信息,我们正试图改进这个错误信息。新的错误信息将更加详细,如包括哪个二进制文件,哪个OBJ文件,哪个OBJ属于哪个静态LIB,哪个编译器生成的PDB文件是缺失的。 针对调试使用共享PDB的情形,现有的方法是设置链接器->调试属性页的“生成完整程序数据库文件”选项,在共享之前生成完整的PDB(如下图)。指定此选项为“是”后,将会执行一个最小化生成,这将再次链接并用完整的PDB覆盖部分PDB,未来,替代重新链接,一个新的工具将会被触发,收集并执行所有输入OBJs,静态LIBs,编译器生成的PDBs中的调试记录,然后覆盖链接器指定/DEBUG:FASTLINK后生成的部分PDB。这将比重新链接快很多,并且,生成的PDB会包含二进制文件需要的所有相关调试信息,这就好像是指定了/DEBUG链接一样。另外,在未来的更新中,我们将会支持具体指定对象文件的路径,但目前发布的版本是不支持的。 为了获得更快的链接时间,接下来计划将/DEBUG:FASTLINK指定为所有工程模板的默认选项,因此在实施之前,我们希望得到你的反馈信息。

0

恢复活力的微软C/C++编译器

[原文发表地址] Rejuvenating the Microsoft C/C++ Compiler [原文发表时间] 2015/9/25 1:00AM 我们的编译器源代码处还有1982年微软最早开始编写编译器的注释代码,这些都比较陈旧。注释代码的人(Raplh Ryan) 给我了一篇他于1985年出版的名为”The C Programming Language and a C Compiler”的文章。内容非常有趣,许多文章中描述的代码至今仍然在使用。作者提到过编译C程序需要两张软盘已经192K的内存(推荐硬盘以及256K的内存)。在这种环境下就可以运行也意味着你一次不能在内存中保存太多内容。编译器设计为扫描程序转换声明与表达式为IL中间语言,并把转换后的中间语言一次写入硬盘,这个过程不需要把整个函数装载到内存。实际上,编译器还没有扫描到表达式的结尾就已经开始生成IL中间语言了。这意味着你可以在微型机上编译相对庞大的程序。 注意: 我们的编译器包含两块(编译器前端, 编译器后端)。编译器前端读取源代码,词汇,段落,进行语法分析并且生成IL。编译器后端读取IL中间语言并执行代码生成和优化。在下文中所用的”编译器“仅适用于编译器前端。 对于C代码(尤其是K&R C),这种运行机制很好。你不需要函数的原型,微软也使C 6.0 7.0可以支持C++的代码,这个功能发布于1989 1992年。 C++编译器共享了很多C编译器的代码, 现今仍然是这样,虽然编译器有不同的二进制文件 (c1.dll和c1xx.dll) ,它们分别由C和C++使用, 但是它们之间还是共享许多代码。 首先, 这种老式设计使C++编译器可以正常工作。然而,当出现模板时,就需要新的工作机制。新的机制会选择先对模板进行一些最小化解析, 然会捕捉整个模板作为一个字符串类型的语法符号(这很像编译器处理宏的方法)。然后,当模板正在实例化时,那些语法符号流会被解析器解析,模板参数会被替代。这种方法导致我们的编译器没有使用两个解析器进行查询。 但当你想保留程序的更多信息时,编译器可能不会如你所愿。当我们在编译时添加/analyze选项, 编译器也会在代码中添加相应代码,这些代码包含在#if结构中,我们将生成单独的二进制文件(c1ast。dll和c1xxast。dll)。过一段时间, 会导致生成超过6000个#if预处理区块。 静态分析工具通过捕捉编译器解析器中的解析段落来为整个函数构建一个AST。然而, 这样捕捉后的AST使用方式与与编译器对数据结构的使用有本质区别,经常会导致不一致性。当引入新的语法时,许多AST也需要实现两次, 先是编译器, 然后才是静态分析。 三年前, 我们就开始重构编译器底层代码。我们想修复一直存在的问题,就像新特性constexpr需要新的工作机制。目标是从根本上改变我们编译器解析分析代码的方式。 我们从几个关键准则来引导我们的开发过程。最重要的准则是所有的更新工作将会在同样的开发分支进行。我们不想出现有分歧的代码,而且那样会难以恢复。我们也想更快的看到实现后的价值。 第一阶段的工作最终实现在Visual Studio 2015。我们修改了很多编译器内部机制, 虽然直接可视的部分并不多。但最有价值的改变是c1ast.dll和c1xxast不再存在。对于编译过程中的静态分析和代码生成,它们使用同样的二进制文件。超过6000的#if区块不复存在,减少了200次分析过程的运行时检查。这些变动较大的改变导致RC版本的C++编译器取消的代码分析功能,因为我们将这些#if区块从源代码中分离,并在它们原来的位置构建新的架构。 现在我们可以生成一个完整的功能树,可以使用同样的数据结构去生成代码并进行静态分析。这些功能树也可以用来评估constexpr函数,这个新特性已经随新版本的发布而发布。我们也可以追踪所有构造过程的源代码信息,源代码位置。现在我们不再使用列中的信息,但是我们在未来会提供更好的诊断功能。 由于这部分的变动, 我们在修复新bugs并且实现新特性时尽量使编译器拥有较好的向后兼容性。我们的自动化系统Gaunelet由50多台机器组成, 它们同时在32位,64位 ARM交叉平台上的不同编译器上运行大量的测试用例。所有Gaunelet上的测试通过后我们才能签入新的代码。同时我们也定期地运行大量的集合测试,这些测试都是上线产品中正在使用代码, 包含visual…

0