Search
Write a publication
Pull to refresh
757.76
BotHub
Neural Network Aggregator: ChatGPT, Claude, Flux

Топ AI-моделей для генерации кода: Claude, ChatGPT, Qwen — сравниваем гигантов

Level of difficultyEasy
Reading time11 min
Views7K

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

Всё чаще ИИ даёт советы, которые оказываются лучше, чем изначальная задумка. Claude, ChatGPT, Qwen — эти модели уже не просто угадывают следующее слово, а демонстрируют понимание логики, стиля и даже контекста проекта. Они объясняют свои решения, исправляют баги, пишут тесты и даже помогают новичкам (и не только) разобраться в чужом коде.

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

Пора разобраться. Сравниваем трёх гигантов современного AI-программирования: Claude от Anthropic, ChatGPT от OpenAI и Qwen от Alibaba Cloud — в реальных сценариях, которые знакомы каждому разработчику.  

Приятного прочтения!  

Каким будет наше приложение? 

Мы создадим простой консольный калькулятор на C++ — минималистичный, но с полным набором базовых операций: сложение, вычитание, умножение и деление. Приложение будет поддерживать ввод с клавиатуры, обработку ошибок (например, деление на ноль) и цикл выполнения, чтобы пользователь мог выполнять несколько операций подряд без перезапуска.

Код должен быть чистым, читаемым, включать комментарии и, по возможности, разделять логику на функции. Эти критерии позволят нам оценить, насколько хорошо каждая модель понимает не только синтаксис, но и архитектуру, реализует безопасность и удобство кода. 

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

Наш промпт будет таким: 

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

Если вы тоже хотите попробовать какую-то модель из моего обзора, то переходите по этой ссылке и пользуйтесь не только ими, но и многими другими нейросетями без использования VPN

Claude Sonnet 4 

Самый длинный код написала нейросеть Claude Sonnet 4 — вышло 122 строки кода.

Калькулятор получился довольно удобный, не нужно запускать заново для нового вычисления (да-да, такое здесь будет), поддерживает все операции, которые описаны в промпте. Есть обработчик ошибок при делении на ноль или неверном вводе. 

Разбор кода 

Claude подключил две библиотеки: iostream и limits.

  • <iostream> — стандартная библиотека для ввода/вывода (cin, cout);

  • <limits> — нужна для доступа к numeric_limits, чтобы очистить буфер ввода. 

void clearInputBuffer() { 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 

Если пользователь ввёл что-то не то (например, буквы вместо числа), cin «ломается» — устанавливается флаг ошибки.

double getNumber(const string& prompt) { 
    double number; 
    while (true) { 
        cout << prompt; 
        if (cin >> number) { 
            break; 
        } 
        else { 
            cout << "Ошибка: введите корректное число!" << endl; 
            clearInputBuffer(); 
        } 
    } 
    return number; 
} 

Данная функция запрашивает у пользователя число до тех пор, пока ввод не станет корректным, иначе — выводит ошибку.

char getOperation() { 
    char operation; 
    while (true) { 
        cout << "Введите операцию (+, -, *, /): "; 
        cin >> operation; 
 
        if (operation == '+' || operation == '-' || 
            operation == '*' || operation == '/') { 
            break; 
        } 
        else { 
            cout << "Ошибка: введите корректную операцию (+, -, *, /)!" << endl; 
            clearInputBuffer(); 
        } 
    }  
    return operation; 
} 

Здесь вводится одна из четырёх операций, проверяется, что символ допустимый, и возвращается правильный символ операции.

double calculate(double num1, double num2, char operation) { 
    switch (operation) {  
    case '+': 
        return num1 + num2; 
    case '-': 
        return num1 - num2; 
    case '*': 
        return num1 * num2; 
    case '/': 
        if (num2 != 0) { 
            return num1 / num2; 
        }
        else { 
            cout << "Ошибка: деление на ноль!" << endl; 
            return 0;  
        }  
    default: 
        cout << "Ошибка: неизвестная операция!" << endl; 
        return 0; 
    } 
}

Функция 1) выполняет арифметическую операцию в зависимости от символа, 2) проверяет, не делится ли на ноль, 3) при неизвестной операции выводит ошибку и 4) возвращает результат. 

int main() { 
    cout << "=== Простой калькулятор ===" << endl; 
    cout << "Поддерживаемые операции: +, -, *, /" << endl; 
    cout << "Для выхода введите 'q' в любой момент" << endl << endl; 

Вначале нас информируют о всех функциях калькулятора, НО… калькулятор предлагает ввести q для выхода из него, а данной команды нет в коде — она обрабатывается как ошибка.

 char continueChoice;

  do {

      // Ввод первого числа

      double num1 = getNumber("Введите первое число: ");

      // Ввод операции

      char operation = getOperation();

      // Ввод второго числа

      double num2 = getNumber("Введите второе число: ");

      // Выполнение вычисления

      if (operation == '/' && num2 == 0) {

          cout << "Результат: Невозможно выполнить деление на ноль!" << endl;

      }

      else {

          double result = calculate(num1, num2, operation);

          cout << "Результат: " << num1 << " " << operation << " "

              << num2 << " = " << result << endl;

      }

Здесь происходит ввод двух чисел и ещё одна проверка деления на ноль до вызова функции calculate(). Она лишняя, так как calculate() уже этим занимается. 

while (true) {

        cout << "Хотите выполнить еще одно вычисление? (y/n): ";

        cin >> continueChoice;

        if (continueChoice == 'y'  continueChoice == 'Y' 

            continueChoice == 'n' || continueChoice == 'N') {

            break;

        }

        else {

            cout << "Введите 'y' для продолжения или 'n' для выхода." << endl;

            clearInputBuffer();

        }

    }

    cout << endl;

} while (continueChoice == 'y' || continueChoice == 'Y');

cout << "Спасибо за использование калькулятора!" << endl;

return 0;

Калькулятор спрашивает, хочет ли пользователь продолжить пользоваться калькулятором, принимает Y/N и либо продолжает цикл, либо завершает программу.

ChatGPT 5: мощь экосистемы OpenAI и её подводные камни

После самого длинного кода идёт самый короткий, написанный ChatGPT 5.

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

Здесь можно сразу ввести нужное выражение, без отдельного выбора первого/второго числа и математического знака. Насколько оно удобно — решает каждый сам для себя, но мне больше нравится вариант ввода, который предоставили Claude Sonnet 4 и Qwen3 Coder.

Разбор кода

Начинается всё с приветствия и небольшой инструкции к приложению:

int main() {

    std::cout << "Простой калькулятор (+, -, *, /)\n";

    std::cout << "Введите выражение в формате: a op b\n";

    std::cout << "Пример: 12.5 * 3\n";

Объявляет переменные, пытается считать с консоли верный ввод, иначе выдаёт ошибку.

double a, b;

char op;

if (!(std::cin >> a >> op >> b)) {

    std::cerr << "Ошибка ввода.\n";

    return 1;

}

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

double result;

switch (op) {

case '+':

    result = a + b;

    break;

case '-':

    result = a - b;

    break;

case '*':

    result = a * b;

    break;

При делении появляется проверка второй переменной — не является ли она нулём.

case '/':

    if (b == 0.0) {

        std::cerr << "Ошибка: деление на ноль.\n";

        return 1;

    }

    result = a / b;

    break;

Если никакая операция не подошла, то выводит ошибку.

default:

    std::cerr << "Неизвестная операция: " << op << "\n";

    return 1;

}

Вывод результата.

std::cout << "Результат: " << result << "\n";

    return 0;

}

Qwen3 Coder: азиатский подход к масштабу и локализации

И последняя нейросеть на рассмотрении у нас — Qwen3 Coder.

Имеет 62 строки кода. Так же как и калькулятор от ChatGPT 5, приходится запускать заново для новой операции.

Разбор кода

Qwen начинает писать код с объявления переменных: два дробных числа для операций, одно для результата и символ самой операции.

int main() {

    double num1, num2, result;

    char operation;

Выводится текст и запрашивается первое число через оператор cin.

cout << "Простой калькулятор\n";

cout << "Введите первое число: ";

cin >> num1;

cin.fail() — проверяет, был ли ввод корректным (например, если пользователь вместо числа ввёл букву).

Если ввод некорректен, выводится ошибка и программа завершается с кодом 1 (стандартный код ошибки).

// Проверка на корректность ввода числа

if (cin.fail()) {

    cout << "Ошибка: Введено некорректное значение.\n";

    return 1;

}

Дальше идёт то же самое, но с вводом операции и вторым числом. 

При вводе операции, если пользователь введёт несколько символов для операции (например, ++), будет обработан только первый символ (+), остальные останутся в буфере. Однако это некритично, так как следующий ввод (num2) пропустит лишние пробелы/символы.

cout << "Введите операцию (+, -, *, /): ";

cin >> operation;

cout << "Введите второе число: ";

cin >> num2;

// Проверка на корректность ввода числа

if (cin.fail()) {

    cout << "Ошибка: Введено некорректное значение.\n";

    return 1;

}

И последний штрих — switch. Здесь происходят все вычисления, а также запрещается делить на ноль.

switch (operation) {

    case '+':

        result = num1 + num2;

        cout << "Результат: " << num1 << " + " << num2 << " = " << result << endl;

        break;

    case '-':

        result = num1 - num2;

        cout << "Результат: " << num1 << " - " << num2 << " = " << result << endl;

        break;

    case '*':

        result = num1 * num2;

        cout << "Результат: " << num1 << " * " << num2 << " = " << result << endl;

        break;

    case '/':

        if (num2 != 0) {

            result = num1 / num2;

            cout << "Результат: " << num1 << " / " << num2 << " = " << result << endl;

        }

        else {

            cout << "Ошибка: Деление на ноль невозможно.\n";

        }

        break;

    default:

        cout << "Ошибка: Неверная операция. Пожалуйста, используйте +, -, * или /.\n";

        break;

    }

Стиль, структура, безопасность: как нейросети пишут код по-разному

Когда мы просим разные ИИ-модели написать один и тот же код, мы получаем не просто разные реализации — мы видим разные идеи программирования, заложенные в их обучении. Давайте глубже погрузимся в то, как Claude, ChatGPT и Qwen подходят к созданию кода, анализируя не только функциональность, но и качество написания.

Стиль программирования и структурные различия

Claude Sonnet 4 демонстрирует академический подход к коду с четким соблюдением принципов чистого кода и разделением ответственностей. Модель создает функции вроде getNumber и clearInputBuffer, но добавляет избыточные проверки вроде двойной обработки деления на ноль. 

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

Claude Sonnet 4 создает полноценное приложение с архитектурой:

  • четкое разделение на функции;

  • обработка состояния приложения;

  • поддержка пользовательского сеанса;

  • цикл событий с возможностью выхода. 

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

Вот как Sonnet 4 описал сгенерированный код:


ChatGPT 5 выбирает «трушный» C++-стиль, с использованием std::-префиксов и строгим следованием стандартам языка. 

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

ChatGPT предлагает алгоритмическую реализацию:

  • весь код в одной функции;

  • нет поддержки сеанса;

  • линейная обработка.

Решение скорее подходит как фрагмент кода для встраивания в другое приложение, чем как самостоятельный инструмент.

Особенностей своей программы ChatGPT не выдал :(
Особенностей своей программы ChatGPT не выдал :(

Qwen3 Coder использует «практичный» стиль программирования, объединяя всю логику в одной функции main() без излишней модульности, и обработка ввода и логика приложения переплетены в одном блоке.

Такой подход эффективен для быстрого прототипирования и простых утилит, но не подходит для сложных проектов, требующих поддержки и расширения.

Qwen занимает промежуточную позицию:

  • простая структура без дополнительных функций;

  • базовая обработка ошибок;

  • отсутствие поддержки сеанса.

Такой код напоминает тестовый проект, который написан для проверки работоспособности своей идеи. 

Сравнительный анализ

Анализируя все три подхода, можно сделать несколько практических выводов:

  • Для образовательных целей — Claude вне конкуренции: его код можно давать новичкам как пример правильной структуры и обработки ошибок. Но естественно, могут быть ошибки, как в нашем примере — избыточность проверок. 

  • Для быстрого прототипирования — Qwen идеален. Его код функционален, так как использует привычный интерфейс ввода (число, операция, число).

  • Для встраивания в другие проекты — ChatGPT выигрывает, благодаря своей лаконичности и чистому C++-стилю, без глобальных using

  • Для production-ready-решений — Claude снова в лидерах, благодаря многоуровневой обработке ошибок и поддержке пользовательского сеанса. 

Важно понимать: ни одна модель не «лучше» другой в абсолютном смысле: Claude перестраховывается, ChatGPT слишком минималистичен, Qwen слишком прост. Но именно эти различия делают их полезными в разных сценариях.

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

Таблица для тех, кто не любит читать 

Выводы

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

Тех, кто сегодня игнорирует ИИ-помощников, через год будут обгонять те, кто научился превращать запросы в готовые решения за минуты.

Если Вы считаете по-другому, или знаете более действенный способ генерации кода, то пишите в комментарии! 

Спасибо за прочтение! 

Tags:
Hubs:
+9
Comments9

Articles

Information

Website
bothub.chat
Registered
Founded
Employees
2–10 employees