Наша позиция

Искусственный интеллект может написать ваш код на C++.
Проверка — ваша задача.

И каждый день приходится проверять всё больше и больше. Visual Assist работает на основе детерминированного парсера — инструмента, который никогда не гадает. Спросите, где находится символ, и ответ будет одинаковым каждый раз, на любом компьютере.

Подробная схематическая карта большого кода на C++. От одного узла QUERY один зеленый путь ведет к одной конечной точке с меткой SAME ANSWER, в то время как несколько красных путей расходятся к разным конечным точкам с метками RUN 1, RUN 2, RUN 3.
Тот же вопрос, рассмотренный на примере реального кода. Один зеленый путь приводит к единственному ответу; красные пути разбросаны — при каждом запуске получается разный результат.

Инструменты искусственного интеллекта заслужили свое место.

Это не аргумент против ИИ. Мы сами его разрабатываем. VA Intelligence запускает локальные модели внутри Visual Studio, и вызываемый, ограниченный областью видимости ИИ действительно полезен для чтения и изменения кода C++.

Также сложно кого-либо винить за то, что он полагается на эти инструменты. Они избавляют от работы с нуля, быстро объясняют незнакомый код и действительно полезны для прототипирования на ранних этапах. Скорость — это реальное преимущество, и в отрасли это соответствующим образом оценено.

Проблемы начинаются тогда, когда скорость ошибочно принимают за уверенность.

Как эти два аспекта взаимосвязаны

Оба, намеренно

Вот вся модель в одной строке: ИИ создает черновик, парсер проверяет, вы принимаете решение. Это две разные задачи, и Visual Assist создан для выполнения функции проверки, наряду с любым уже используемым вами ИИ.

Искусственный интеллект для будущих поколений преуспевает в следующем: Проверка. Парсер хорошо справляется с...
Объяснение незнакомого кодаТочная навигация к любому определению
Разработка плана реализацииПолный поиск ссылок — каждое использование учитывается
Первоначальные решения и шаблонные решенияБезопасная рефакторизация всего проекта.
Вкратце, что делает блок.Детерминированное понимание — один и тот же ответ при каждом запуске.
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.

Визуальная помощь. Поиск ссылок. Результаты показывают 746 ссылок в 69 файлах для символа MAX_PLAYERS.
Поиск ссылок на один символ в коде игры, насчитывающем более 700 файлов: 746 ссылок в 69 файлах. Полный подсчет каждый раз.
Попробуйте визуальную помощь
30-дневная бесплатная пробная версия · Кредитная карта не требуется
Двигатель

Под капотом: параллельный парсер

Это тот раздел, где мы углубляемся в детали — парсер — это та часть Visual Assist, о которой мы редко говорим открыто, и именно он обеспечивает такую ​​уверенность.

Параллельный + инкрементальный

VA запускает собственный парсер на нескольких ядрах, выполняя повторный анализ по мере ввода текста. Индекс остается актуальным в зависимости от нажатия клавиши.

Создано для интеллектуального анализа кода.

Ему не нужно компилировать ваш код, достаточно лишь его понимать — поэтому он пропускает то, что вызывает сбой компилятора, и продолжает разрешать символы в фрагментированном коде, который не компилируется.

Алгоритм, а не модель.

Нет отбора проб, нет измерения температуры. Один и тот же код дает один и тот же ответ, поэтому это факт, который можно проверить, а не предположение.

IntelliSense опирается на интерфейс компилятора: он точен в чистом коде, но ненадежен и медленен в неряшливом. Visual Assist много лет назад сделал противоположную ставку — именно поэтому разработчики использовали его в Unreal Engine и шейдерном коде еще до того, как в них появилась официальная поддержка. Искусственный интеллект не изменил эту ставку. Он поднял ставки.

Именно в этом направлении развивается 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 часа ночи происходит повреждение состояния.

Простым языком

Обладатель степени магистра права очень хорошо умеет угадывать. Это именно то, что нужно для первого черновика, и именно то, чего не нужно для работы, которая вот-вот будет сдана.

Читайте: что реально, что — шумиха и какое место занимает C++.

Подтверждающие доказательства

Объем работы по проверке растет.

Искусственный интеллект не убрал работу по обеспечению качества. Он переложил её на тех, кто читает изменения в коде, — и этой работы стало заметно больше.

≈ 20%
быстрее — они ожидали
измерено ↓
≈ 19%
медленнее — что произошло?

В рандомизированном исследовании METR 2025 года опытные разработчики, использовавшие ИИ для проверки хорошо знакомого им кода, выполняли задачи на 19% медленнее, чем без него, — при этом считая, что работали быстрее. Время ушло на проверку, исправление и повторное напоминание. Вывод не в том, что «ИИ медленный», а в том, что проверка — это реальная, постоянно растущая работа.

Источник: METR.org — РКИ, 16 разработчиков, 246 задач

Анализ результатов в основном подразумевает уверенный ответ на простые вопросы:

  • Кто вызывает эту функцию?
  • Используется ли этот символ где-нибудь до сих пор?
  • На что именно повлияет это изменение?

На эти вопросы есть точные ответы. Чем больше сгенерированного кода вы получаете, тем больше ваш анализ опирается на инструменты, которые не строят предположения.

Суть всего предложения: спросите ещё раз.

Установите Visual Assist на свой крупнейший проект и задайте один и тот же вопрос два дня подряд. Вы всегда получите один и тот же ответ. Гарантировано.

Попробуйте визуальную помощь
30-дневная бесплатная пробная версия · Кредитная карта не требуется
Более 1,5 млн установок на Visual Studio Marketplace.

Часто задаваемые вопросы

Эта страница направлена ​​против искусственного интеллекта?

Нет. Мы разрабатываем функции ИИ и ожидаем, что вы продолжите использовать любого помощника, который вам нравится. Аргумент более узкий: генерация и проверка — это разные задачи, и для проверки нужен инструмент, который каждый раз дает один и тот же ответ.

Заменяет ли функция визуального ассистента функцию «Военный пилот»?

Нет, и он этого не пытается сделать. Visual Studio и Copilot работают параллельно. Copilot создает черновики; парсер Visual Studio — это то, с чем вы сравниваете черновик.

Что на самом деле означает здесь слово «детерминированный»?

При наличии одного и того же кода парсер создает одну и ту же его модель — с теми же ссылками, определениями и областью переименования — при каждом запуске, на каждой машине, в каждой сессии. Никакой выборки, никакой температуры, никакой вариативности.

Приведите пример того, как модель ИИ допускает ошибки в C++.

Распространенные ошибки: выбор неправильной перегрузки при совпадении нескольких ( классический boolпример — предпочтение строкового литерала std::string), предложение члена или API, которого нет в данном типе, некорректная обработка владения умным указателем, из-за чего что-то освобождается дважды или никогда, и «обновление» вызова сигнатуры из другой версии библиотеки. Каждая из них может выглядеть вполне разумной в сравнении версий.

Если код компилируется, разве это не хорошо?

Нет. В C++ чистая компиляция означает, что синтаксис верен, а не что поведение корректно. Использование освобожденной памяти, висячие ссылки, переполнение целочисленных переменных и обычные логические ошибки компилируются без проблем и проявляются во время выполнения — часто только под нагрузкой. Компиляция некорректна.

Разве я не могу просто попросить ИИ найти все возможные варианты использования символа?

Вы можете это сделать, но не будете знать, является ли список полным. Модель возвращает правдоподобный набор и может пропустить случаи использования в макросах, шаблонах или файлах, которые она не рассматривала, — и в следующий раз она может вернуть другой набор. Парсер проходит по всему набору переводов и предоставляет вам полное количество, одно и то же при каждом запуске.