C++得到Squiggles!

大家好,我是Visual C++编译器团队的开发者Mitchell Slep。  我非常兴奋地告诉你VisualStudio 2010中的一个新特性——C++智能感知现在可以在你浏览和编辑代码时显示编译器质量语法和语义错误!

null

图片[1]-C++得到Squiggles!-yiteyi-C++库

我们在代码中的错误位置显示波浪下划线或“波形”。  将鼠标悬停在曲线上会显示错误消息。  我们还在错误列表窗口中显示错误。  波形图非常适合显示当前正在查看或编辑的代码中的错误,而“错误列表”窗口可以帮助您在翻译单元的其他地方查找问题,而无需进行生成。

设计功能

在设计这个特性时,我们考虑了两个场景。  其中一个当然是生产力——能够在错误发生时进行修复非常方便,而不是等到构建后才发现错误,这可以节省大量时间。  我们还想改善智能感知不起作用时的体验。  智能感知一直是一个黑匣子——它通常工作得很好,但如果没有,你就不知道为什么了。  现在,IntelliSense有一个强大的反馈机制,允许您采取纠正措施—通过修复代码中的错误或确保项目配置正确。

在设计这个特性时,我们必须做的一个决定是在编辑代码时更新错误的频率。  如果我们不经常这样做,错误很快就会过时,变得无关紧要。  但是,太频繁地这样做也会导致不相关的结果,比如当你正在键入“vector”时,在“vect”下面出现一个扭曲的曲线!  我们也不想占用你的CPU与不断的背景分析。

我们发现,一个好的平衡是在编辑或导航到代码的新部分后等待1秒空闲时间,然后再开始更新错误。   在本例中,“idle”表示您没有键入任何内容,也没有导航到代码的其他部分。

我们还尝试了一些不同的设计,以便在您进行编辑和新更新的错误可用之间的短时间窗口内处理现有错误。  例如,我们尝试的一种设计是在编辑后立即清除屏幕上的所有扭曲,然后在新错误可用时重新绘制。  我们还考虑了一种只清除线条上扭曲的变体 在……下面 编辑的位置(因为进行编辑通常只会影响后面显示的代码)。这些设计的优点是你永远看不到过时的波形,但是在可用性研究中,我们发现这产生了一种恼人的闪烁效果,而且对于波形消失是因为它被修复了,还是因为它只是暂时被更新,也有一些混淆。  我们采用的设计是在编辑之后将现有的波形保留在适当的位置,然后在新的错误可用时将其替换为新的错误。  由于更新速度非常快,这一点非常有效。

技术挑战

这项功能的技术挑战之一是速度。  正如你们中的许多人所知道的,大型C++项目通常需要几个小时才能建立起来。  我们解决这个问题的方法之一是让IntelliSense一次只关注一个翻译单元(翻译单元是一个.cpp文件及其包含的所有头文件)。  然而,即使这样,对于像squiggles这样的实时编译特性,也没有给我们想要的那种响应能力。

为了获得更好的性能,我们开发了一些创新的增量解析技术,可以最大限度地减少需要解析的代码量。  这使得IntelliSense解析代码的速度比实际构建所需的时间(甚至比编译单个.cpp文件所需的时间)要快得多。  这些想法很简单,但是在一个复杂的、上下文敏感的语言如C++中实现是有挑战性的。

当您第一次打开一个文件时,我们只解析足够的代码来构建一个全局符号表,跳过许多只引入局部符号的代码(比如函数体)。  一旦我们建立了符号表,我们就懒散地解析跳过“按需”的代码。  例如,我们只在实际在屏幕上查看函数体时解析函数体的内部。  如果在函数体中进行更改,我们就可以重新分析该函数体。  当然,所有这些都只发生在空闲时间,如上所述。  这些解析技术允许我们向您显示快速的、相关的错误,即使在您编辑大型、复杂的代码库时也是如此。

外部构建系统

如果您的解决方案已经使用visualstudio构建,那么在您浏览和编辑代码时,IntelliSense会立即报告准确的语法和语义错误,这将使您受益匪浅。  但是这个特性对于那些使用外部构建系统的人来说也是个好消息。  “错误列表”窗口中的IntelliSense错误可以指导您使用准确的IntelliSense设置解决方案。  例如,如果加载为外部生成系统配置的解决方案,您可能会看到如下内容:

图片[2]-C++得到Squiggles!-yiteyi-C++库

现在您知道需要调整Include路径。  对您的解决方案进行这些调整将极大地提高使用外部构建系统获得的IntelliSense的质量。

在这个特性上工作很有趣,尤其是在狗粮中工作——不用一直做构建工作真是太好了!  你可以在beta1中预览这个特性,我期待在评论中听到你的反馈。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享