大家好,Jim Springfield 又来了。本文讲述了我们目前从根本上改变IntelliSense的实现和为C + +代码在Visual Studio 10浏览所做的工作。之前我已经讲过了IntelliSense 的历史上,并概述了我们所面对的许多问题。可以参考http://blogs.msdn.com/vcblog/archive/2007/12/18/intellisense-history-part-1.aspx(翻译)获取更详细的资料。
Visual C + +已发展多年,一直以来具有对立性的是既要得到代码信息迅速性和又要具有准确性。我们已从快但不是很准确提高到在Visual Studio 2008的有些快速和准确。进展缓慢最主要的原因是,当头文件修改后,需要reparse cpp文件。大型工程项目都包含一些通用的头文件,这意味一旦头文件被修改或编译选项被配置就需要reparsing所有的文件。大部分我们都是准确的,除了分析的头文件在不同的CPP文件里有不同的定义时(如,不同的#defines,编译选项等) 。
对于Visual Studio 2008 下一版本Visual Studio 10,我们将会做很多不同的事情。首先,NCB文件要被淘汰。NCB文件和BSC非常相似,IDE需要一直加载在内存里面使用。在这种情况下加一个功能是非常困难的(如模板的支持),而且查找需要遍历大量的信息。为了代替这种方式,我们将使用SQL Server Compact做为数据存储。我们做了很多原型,以确保它是正确的选择,而且它超出了我们的预期。使用Compact将使我们能够方便地更改我们的架构,改变指标,并避免加载整个内容到内存中。目前我们已经做好了这个并一直关注性能的增强和降低内存使用量。
SQL Server Compact 是一个SQL的版本,使用一个文件来存储数据。它本来是为Windows CE开发,非常小,有效率,同时保SQL的留灵活性 。
此外,有一个新的解析器会加入这个方案。解析器将在解决方案中执行基于文件的解析,这种方式独立于任何配置或编译选项,而且不需要分析头文件的内容。正因为如此,如果头文件改变,不会造成reparse所有文件,这可避免的一个根本的问题。分析器还被设计的非常有弹性,能够处理不明确的代码,括号和语法不匹配,并支持一个“提示”文件。由于C / C ++宏的性质而且我们不用解析头文件,会有一些小的代码段会被误解。提示文件将包含为某些宏的定义,从根本上改变了以前的parsing方式,因此可以理解一个文件。提示文件会包含所有已知的宏,如Windows SDK,MFC,ATL等等。它可以被扩展和修改,我们希望能够定义在源代码里潜在的宏。我们将研究每一个头文件,并希望能够提出增补提示文件的建议。
不过,这种解析风格意味这我们不会在所有情况下获取完全准确的资料。这是可行的,尤其是在自动完成的智能提示,查看参数信息,快速信息时。处理好这个,我们可以在一个文件在IDE中打开时做完全的解析。这个解析工作将在最充分的意识下完成,尽可能将使用所有的编译选项和其他配置设置。所有的头文件将在真正的使用背景下被解析。我们相信我可以对大多数翻译单位做初步分析非常迅速,不会超过一秒或两秒。它可以在时间上和真正编译翻译单位的现在过程相比,虽然我们还没有做代码生成及优化,但速度一定会快。此外,这个解析工作将在后台处理将不会冻结住IDE的使用。每次CPP文件或头文件被修改,我们将跟踪所做的修改,并逐步reparsing那些必须剖析的bit。
基于文件解析后建立的数据库,将被用于ClassView, CodeModel ,Navbar和其他基于操作的浏览中。例如在“Find All References”操作里,该数据库将被用来找出最可能的候选指令,并全面分析确定哪些是真正的引用。我们也一直在此基础上思考一些较长远的构思。这包括使用完整的SQL Server来存储信息的源代码,可以让多人使用。它可让您查询代码,甚至不是你的机器上。例如,您可以做一个“转到定义“的操作,定位到的代码甚至不在你的机器上。这需要和TFS集成,保证每次Check In代码的时候能自动更新,甚至可让您查询过去的东西。另一个构想是,将你产品的全部构建信息加入SQL数据库。这将包括非常详细的信息(即像一个BSC的档案),但包括所有部分的应用都可以在每个人之间共享。这将是非常有用,因为你可以在修改代码时找到函数的所有调用者。
如果您对这类型的资料有什么意见, 通知我们!
Jim Springfield
Visual C++ 架构师