Visual Studio vNext中的C++/CLI智能感知

最近莫森和克雷格谈到 C++开发中的文艺复兴 托尼说 重建我们的开发者沟通 围绕C++,这两个视频触及了一个主题,即围绕我们为什么要做事和我们计划什么提供更真实的世界性的讨论。这篇文章是我们计划在未来几个月里制作的一系列文章中的第一篇,我们想问你关于C++开发工具中需要什么,以及我们对下一个Visual C++版本的建议。为了为这些讨论奠定基础,我们将提供一些关于我们如何以及为什么就产品特性做出某些特定决定的见解。对于一些新事物,我们将分享我们是如何看待问题空间的,以及我们是如何思考解决问题的。

null

我们期待着听到您对这些功能的想法,以及我们如何最好地利用开发人员资源,以便在即将推出的产品中为您提供最大价值(理想情况下,我们希望能够满足您100%的需求,但是,正如您所知,有时您必须做出权衡,因此我们期待您的帮助来做出正确的选择)。

我们希望听到的第一个特性是C++/CLI智能感知。让我们提供一些背景说明,然后讨论我们正在做什么。

为什么我们在VisualStudio 2010中没有包含C++ + CLI智能感知

当我们接近VisualStudio 2010 SP1的最终版本时,最重要的问题之一是C++中的智能感知缺失。当我们去年12月发布SP1测试版时,这个问题成为了投诉最多的问题,因为它被宣布将不会成为SP1的一部分。在这篇文章中,我们将解释一下C++智能感知支持的演变,以及大家问的两个问题之一:为什么Visual Studio 2010中的C++/CLI项目不支持它?

C++语言中智能感知的一种简要演进

从Visual Studio的最早版本开始,那些开发人员知道智能化已经被用于本地和托管C++。那么,为什么今天只对本地人开放呢?IntelliSense是一个强大的功能,必须满足某些目标:

  • 准确度 :所有建议必须在您所在的上下文中,仍然包含完整相关项目的最新版本(即头文件中的更改)。
  • 速度 :和你的指尖一样快。因此,实施必须基于时间紧迫的方法。

我们的第一个C++智能实现是在Visual C++ 6中实现的,我们通过创建一个支持文件,臭名昭著的NCB来完成这一任务,它包含编译器生成的合并引用和定义。IntelliSense相当有限,但仍然被认为是一个突出的功能,因为当时没有其他IDE提供类似的功能。NCB文件包含一组丰富的信息,包括类成员、全局变量等,但是我们没有完整的信息来描述诸如名称空间和异常之类的构造。这一缺陷以及这些文件变得如此庞大、复杂和偶尔损坏的事实(谁不记得通过删除.NCB文件并重建它来修复IntelliSense问题),我们需要更改底层实现。

随着项目变得越来越复杂,出现了其他问题,如“多模块”问题。当头文件包含在具有不同上下文(如差异宏)的多个翻译单元中时,就会出现此问题。使用NCB方法,我们只记住头文件的一个上下文,在不同的上下文中,您将看到IntelliSense的错误结果。还有一个问题,当共享头被更改时,我们需要重新编译许多文件。在某些情况下,这可能会导致IDE冻结(如果更改了编译选项,例如从DEBUG切换到RELEASE,也会发生这种情况)。为了解决这个问题,我们不仅需要更好地理解源代码中包含的信息,还需要更有效、更可靠地存储这些数据。我们还希望确保IDE尽可能响应。最初,我们使用后台编译线程、空闲时间检测和优先级队列等技术来实现这一点,但最终我们意识到需要一个完整的IntelliSense重新架构。对于VisualStudio2010,我们开始了这项工作,并决定使用IntelliSense的实时模型,同时将存储(仍用于“浏览”功能)从.NCB文件更改为SQLServerCompactEdition。这有助于提高性能,同时减少内存消耗。我们还想解决如何为IntelliSense解释代码和如何为最终编译产品解释代码之间的差异问题。这个问题表现在一些事情上,比如出现在IntelliSense引擎中的语言特性,而不是出现在编译器中,反之亦然。

2010年的困境

在VS2010之前,我们使用命令行编译器的修改版本来实现IntelliSense。当我们在语言中添加新的特性时,只需很少的工作就可以让它们实现智能感知。作为VS2010中IntelliSense/IDE重新架构的一部分,我们决定为IntelliSense使用一个新的编译器代码库。这个决定提供了很多好处,但是我们只是低估了在这个代码库中实现C++或CLI所需要的工作量,并且我们在实现它的时候不能改变我们的计划。

除了这些意想不到的工作量之外,客户还要求提供许多新功能,例如:

  • 改进的IntelliSense错误报告。
  • 更快的编译和更优化的代码生成。
  • #包括 自动完成。
  • 以特定编译器和库为目标的能力。
  • 新的MFC特性,如类向导或重启管理器。
  • 提供更好的诊断、可扩展性和集成的构建平台。
  • 改进C++标准遵守。
  • 支持库和工具的并行编程(调试等)
  • 标准库改进。
  • Windows 7技术的可用性(如Direct3D 11等)

即使有了这个限制,我们也确实希望在VS 2010中为C++提供CLIGISIDENCE,我们研究了几种替代方案和缓解措施,但是没有什么能满足我们的时间表,并为我们的用户提供了真正的价值。我们考虑尝试启用旧的智能感知机制(即NCB)用于C++ + CLI项目,但这也将是一个巨大的工作量。我们也考虑过尝试侵入一些东西,但我们在调查后也拒绝了。我们不可能在任何导入的元数据上提供IntelliSense,这将使IntelliSense对大多数人来说毫无用处。

最后,在处理现实世界中的资源和日程限制时,这是你必须做的一个艰难的削减。结果发现,这项工作也太多,无法适应SP1。一旦我们封装了VS 2010,我们就开始了C++ + CLI智能感知的工作,但是它没有及时准备好SP1。我们意识到这不是你想发生的事情,如果你受此影响,一个解释并不能帮助你完成工作,但我们希望你知道真相。

不过,好消息是,visualstudio2010中所做的所有架构更改都使我们能够提供更好的整体IntelliSense体验,并将使我们能够在未来提供许多其他功能。

VisualStudioVC++下的C++/CLI智能感知

希望这能让你了解我们为什么要做这些决定。

好消息是C++ + CLI智能感知将在VisualStudio的下一版本中。我们已经做了大量的工作来实现这一点,除非出现重大的不可预见的复杂情况,您应该期望在最终产品中看到它。一如既往,这是有一定风险的,但我们想把这些信息摆在你面前供你评论。

在我们关于这个主题的下一篇文章中,我们将深入探讨我们的计划,并请您对我们的想法发表评论。敬请期待。

工具书类

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