我们的立场

人工智能可以帮你编写 C++ 代码,但
验证代码是你的职责。

而且每天需要检查的内容越来越多。Visual Assist 基于确定性解析器运行——这种工具从不进行猜测。无论在哪台机器上,查询某个符号的位置,答案都完全相同。

大型 C++ 代码库的详细示意图。从一个 QUERY 节点出发,一条绿色路径清晰地解析到标记为 SAME ANSWER 的单个端点,而几条红色路径则分散到标记为 RUN 1、RUN 2、RUN 3 的不同端点。
同样的问题,映射到真实的代码库中。一条绿色路径指向同一个答案;红色路径则分散开来——每次运行都会得到不同的结果。

人工智能工具赢得了它们的地位。

这并非反对人工智能。我们自己也在使用人工智能。VA Intelligence在 Visual Studio 中运行本地模型,而这种可调用的、作用域限定的人工智能对于读取和修改 C++ 代码确实非常有用。

也很难责怪任何人依赖这些工具。它们能消除从零开始的枯燥工作,快速解释不熟悉的代码,而且对于早期原型设计确实非常有用。速度是一项实实在在的优势,而行业也因此为其定价。

问题在于,人们常常把速度误认为确定性。

两者如何契合

两者,都是故意的

整个模型可以用一句话概括:AI 生成草稿,解析器进行验证,最终由您决定。这是两项不同的任务,而 Visual Assist 的设计初衷就是为了完成验证工作,与您已使用的任何 AI 系统配合使用。

人工智能世代擅长 验证:解析器性能良好
解释不熟悉的代码精确导航至任何定义
起草实施方案完整参考文献检索——每次使用均被记录
初步解决方案和样板安全、项目范围的重构
概括一个代码块的功能确定性理解——每次运行都得到相同的结果
ONE WORK SESSION → MODEL invoked when you ask drafts drafts context context PARSER always on · your code's ground truth
解析器会在整个会话期间运行;模型仅在您调用它时才会出现,并从调用该行获取上下文。您始终是工程师——没有任何自动应用。
确定性的定义

解析器确切知道什么

Visual Assist 会解析你实际的 C++ 代码(符号、作用域、类型),并在你输入时实时更新画面。它所报告的所有内容都是关于你当前代码的真实情况,而非预测。

查找参考文献

每一条引用都被统计在内。总数就是总数,不是样本。

重命名

它会提及每一个相关内容,或者告诉你它无法提及。不会有任何疏漏。

转到定义

即使在宏密集的代码或正在编辑的代码中,也能准确定位到定义。

一个具体的

让模型查找所有用法MAX_PLAYERS,你会得到一个看似合理但并不完全可信的列表,而且下次查询时列表可能还会改变。Visual Assist 返回了746 个用法,分布在 69 个文件中。明天再查询,结果仍然是 746 个。

视觉辅助查找参考结果显示,符号 MAX_PLAYERS 在 69 个文件中共有 746 个参考。
在包含 700 多个文件的游戏代码库中查找单个符号的引用:在 69 个文件中找到了 746 个引用。每次都能完整统计。
尝试使用视觉辅助工具
30 天免费试用 · 无需信用卡
引擎

底层原理:并行解析器

这是我们要深入探讨细节的部分——解析器是 Visual Assist 中我们很少公开谈论的部分,也是实现确定性的关键所在。

并行+增量

VA 会在各个核心上运行自己的解析器,并在您输入时重新解析。索引会随着每次按键保持最新。

专为代码智能而打造

它不需要构建你的代码,只需要理解它——因此它跳过了导致编译器崩溃的部分,并继续解析碎片化的、无法编译的代码中的符号。

算法,而非模型

无需采样,无需测量温度。相同的代码给出相同的结果,所以这是一个可以验证的事实,而不是猜测。

IntelliSense 依赖于编译器前端:在代码干净的情况下精准可靠,但在代码混乱时则脆弱且速度缓慢。Visual Assist 多年前就做出了相反的判断——这就是为什么在虚幻引擎和着色器代码尚未获得官方支持之前,开发者就已经开始使用它们的原因。人工智能并没有改变这一判断,只是提高了风险。

VA Intelligence 的发展方向正是基于同样的解析器——它具有更多上下文感知功能,解析器能够为模型提供对项目更全面的理解。

阅读退伍军人事务部情报部门的立场

另一条路

“可能”一词未经证实。

模型会给出最可能的代码。但“可能”并不等同于“正确”,而 C++ 中的问题就出在这里。以下就是一个经常让实际团队头疼的例子:

// 代码库中存在两个重载:
void log( const std::string& message);
void log( bool ok);

// 这段代码由人工智能编写,编译通过,可以发布了吗?
log( "连接丢失" );

// 字符串字面量是 const char*,并且
// const char* -> bool 比 const char* -> std::string 更好。
// 所以这里调用了 log(bool)。你刚刚记录的是 `true`。
这是一个典型的重载解析陷阱。调用看起来完全正确,编译也无误,但却执行了错误的函数。“转到定义”会跳转到实际解析的重载版本——只需点击一下即可发现问题。

错误的过载

编译无误。调用了你不想调用的函数。

糟糕的一生

审核时看起来不错,但生产时却问题重重。

安静的演员

构建过程没有任何警告。凌晨 2 点破坏状态。

简单来说

法学硕士(LLM)非常擅长猜测。他能准确地告诉你初稿需要什么,也能准确地告诉你接近最终稿件时不需要什么。

阅读:哪些是真材实料,哪些是炒作,以及 C++ 的定位

支持性证据

验证工作正在增加

人工智能并没有取代质量把控工作,而是将其转移到了下游,转移到了那些负责查看差异的人身上——而且这类工作量明显增加了。

约20%
更快——他们预料到了
测量值↓
约19%
慢点——发生了什么

在METR于2025年开展的随机试验中,经验丰富的开发人员在使用人工智能处理他们熟悉的代码时,完成任务的速度比不使用人工智能时慢了19%——尽管他们自认为速度更快。浪费的时间都花在了代码审查、纠错和重新提示上。这说明的重点并非“人工智能很慢”,而是验证工作是一项真实存在且日益繁重的工作。

来源:METR.org — 随机对照试验,16 位开发者,246 项任务

复习主要意味着能够准确地回答简单的问题:

  • 谁调用这个函数?
  • 这个符号现在还在使用吗?
  • 这项改变究竟影响到哪些方面?

这些问题都有确切的答案。你接收的生成代码越多,你的代码审查就越依赖于那些不靠猜测的工具。

整个推销策略:再问一遍。

把可视化助手应用到你最大的项目中,然后连续两天问同一个问题。你永远都会得到相同的答案。绝对保证。

尝试使用视觉辅助工具
30 天免费试用 · 无需信用卡
Visual Studio Marketplace 上的安装量超过 150 万次

常见问题解答

这个页面是反人工智能的吗?

不。我们开发人工智能功能,并希望您继续使用您喜欢的任何助手。这个问题其实更具体一些:生成和验证是不同的任务,验证需要一个每次都能给出相同答案的工具。

视觉辅助功能会取代副驾驶功能吗?

不,它不会尝试这样做。VA 和 Copilot 在 Visual Studio 中并行运行。Copilot 负责生成草稿;VA 的解析器用于检查草稿是否正确。

这里“确定性”究竟是什么意思?

对于同一段代码,解析器每次运行、每台机器、每个会话都会生成相同的模型——相同的引用、定义和重命名作用域。没有采样,没有温度,没有差异。

人工智能模型在理解 C++ 代码时出现错误的例子是什么?

bool常见错误包括:当有多个重载版本匹配时选择错误的重载(例如,优先使用字符串字面量std::string而不是其他类型),建议使用该类型中不存在的成员或 API,错误处理智能指针的所有权导致某些元素被释放两次或从未释放,以及“更新”对来自不同库版本的函数签名的调用。这些错误在差异对比中看起来都完全合理。

如果代码能够编译,那不就没问题了吗?

不。在 C++ 中,编译通过仅表明语法有效,并不代表行为正确。释放后使用、悬空引用、整数溢出和简单的逻辑错误都能顺利编译,但会在运行时暴露出来——通常只有在高负载下才会出现。“编译通过”这种说法并不准确。

我难道不能直接让人工智能找出某个符号的所有用法吗?

你可以这样做,但你无法确定列表是否完整。模型返回的是一个可能的集合,可能会遗漏宏、模板或它未检查的文件中的用法——而且下次运行可能会返回不同的集合。解析器会遍历整个翻译集,并给出完整的计数,每次运行的结果都相同。