Python в JavaScript за 4 часа: секреты портирования с GPT-5.2 и Codex CLI

Python в JavaScript за 4 часа: секреты портирования с GPT-5.2 и Codex CLI

Проблема JustHTML: зачем переносить Python в JS?

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

Давайте разберёмся, почему объектом эксперимента стал именно JustHTML. Это проект Эмиля Стенстрема — парсер HTML5, написанный на чистом Python. Его главная особенность заключается в строгом следовании спецификациям.

Десять лет назад спецификация HTML5 совершила революцию. Она не просто описала новые теги, но и точно определила, как браузеры должны обрабатывать невалидный код. Раньше поведение при ошибках в верстке было "неопределенным" (undefined behavior), что приводило к головной боли фронтендеров. Теперь же правила обработки сломанного HTML стандартизированы, но они невероятно сложны.

  • Сложность правил: Логика обработки ошибок занимает огромную часть спецификации.
  • Тесты: Существует проект html5lib-tests — золотой стандарт для проверки совместимости парсеров.
  • Задача: JustHTML проходит все эти тесты на Python. Цель эксперимента — создать аналог на JavaScript, который также пройдет эти тесты, но с минимальными усилиями со стороны человека.

Этот кейс интересен не просто фактом перевода. Это проверка того, способен ли искусственный интеллект понять сложную логику обработки граничных случаев (edge cases) и корректно перенести её в другую среду исполнения.

Вместо того чтобы тратить недели на ручное написание конечных автоматов для парсинга, разработчик решил использовать связку GPT-5.2 code conversion и инструментов автоматизации. Ниже мы рассмотрим, как именно это происходило ↓

Инструменты будущего: как GPT-5.2 и Codex CLI переводят код

Схема: Как GPT-5.2 и Codex CLI переводят Python в JavaScript
Схема: Как GPT-5.2 и Codex CLI переводят Python в JavaScript

Для реализации задачи использовалась мощная комбинация: языковая модель нового поколения GPT-5.2 и интерфейс командной строки Codex CLI. Важно понимать, что это не просто "чат-бот", в который вы копируете куски кода. Это система, интегрированная в процесс разработки.

Codex CLI: мост между кодом и ИИ

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

Ключевые особенности работы через CLI:

  1. Контекст проекта: Инструмент может считывать структуру директорий и содержимое файлов, понимая связи между модулями.
  2. Итеративность: Вы можете настроить цикл "генерация -> тестирование -> исправление".
  3. Кэширование: При работе с большими объемами кода (как в случае с парсером) очень важно не отправлять одни и те же данные модели повторно.

В ходе эксперимента система использовала механизм кэширования токенов (cached tokens). Это позволило модели "помнить" огромные куски спецификации и исходного кода Python без необходимости каждый раз заново их обрабатывать.

GPT-5.2: Мощность модели

Модель GPT-5.2 в данном контексте выступала не как простой переводчик синтаксиса, а как инженер, понимающий семантику. Python в JavaScript переводится нестрока в строку. Модель должна была:

  • Понять логику работы классов в Python.
  • Найти эквивалентные конструкции в JavaScript (например, замена кортежей на массивы или объекты).
  • Сохранить поведение при прохождении тестов.

Статистика использования токенов поражает: в процессе работы было задействовано более 1 миллиона входных токенов и почти 100 миллионов кэшированных токенов. (по данным оригинальной статьи) Это говорит о том, что модель удерживала в "памяти" колоссальный объем контекста, что невозможно для старых версий вроде GPT-3.5 или даже GPT-4.

Хотите освоить программирование с нуля? Запишитесь на бесплатный вебинар Эльбрус Буткемп и узнайте, как стать разработчиком за 3 месяца!

Пошаговый план: стратегия мгновенного портирования за 4 часа

Пошаговый план: Стратегия портирования JustHTML за 4 часа
Пошаговый план: Стратегия портирования JustHTML за 4 часа

Успех этого эксперимента зависел не столько от "магии" нейросети, сколько от грамотной подготовки, которую называют "mise en place" (термин из кулинарии, означающий подготовку всех ингредиентов перед готовкой).

Вот алгоритм, который позволил перенести библиотеку за один вечер:

1. Подготовка тестовой среды (Mise en place)

Самым важным шагом было не написание промптов, а настройка тестов. Разработчик взял набор тестов html5lib-tests (JSON-файлы с примерами HTML и ожидаемым деревом DOM) и написал скрипт на JavaScript, который умеет их запускать.

  • Без тестов ИИ просто галлюцинировал бы код.
  • С тестами ИИ получал мгновенную обратную связь: "Твой код упал на строке 50, вот ошибка".

2. Первичный промпт (The Instruction)

Разработчик дал Codex CLI четкую инструкцию: "Создай JavaScript-версию этого Python-кода". Важно, что он не просил переводить всё сразу. Работа велась модульно.

Примерная логика промпта выглядела так (концептуально):

# Концептуальная команда, не прямой синтаксис
codex-cli convert ./pythonsrc/parser.py --target ./jssrc/parser.js \
  --reference "Используй стиль кода без зависимостей" \
  --test-command "npm test"

3. Цикл обратной связи (The Loop)

Это "секретный соус" продуктивности. Процесс выглядел так:

  1. Codex CLI генерирует черновик функции на JS.
  2. Автоматически запускаются тесты из набора html5lib-tests.
  3. Если тесты падают, вывод ошибки (stack trace) скармливается обратно модели.
  4. Модель анализирует ошибку и присылает патч.

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

4. Результат

В итоге была создана библиотека justjshtml. Она не имеет внешних зависимостей (dependency-free) и проходит 9 200 тестов из официального сьюта. Весь процесс занял около 4 часов, в течение которых разработчик успевал заниматься домашними делами, пока JustHTML превращался в JS-библиотеку.

Подводные камни: как ИИ справился с типами данных и разницей в экосистемах

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

Давайте посмотрим, с чем пришлось столкнуться ИИ и как он это решил.

Типизация и структуры данных

Python богат на структуры данных, которых нет в JS "из коробки" в том же виде:

  • Tuples (Кортежи): В Python (1, 2) — это неизменяемый список. В JS такого типа нет. ИИ корректно заменял их на массивы [1, 2] или объекты, в зависимости от контекста использования.
  • Sets (Множества): Работа с set в Python синтаксически лаконична (a | b). В JS до недавнего времени работа с Set была более громоздкой. Модель генерировала вспомогательные функции для операций над множествами.
  • Unicode: Парсинг HTML тесно связан с кодировками. Python 3 обрабатывает строки как Unicode по умолчанию, но методы работы с суррогатными парами отличаются от JS. GPT-5.2 смог учесть эти нюансы, чтобы парсер не ломался на эмодзи или редких символах.

Управление состоянием (State Management)

Парсер HTML — это сложная машина состояний (state machine).

  • В Python часто используются классы с методами, меняющими внутренние атрибуты self.
  • В JavaScript контекст this работает иначе и часто вызывает ошибки при передаче методов как колбэков.

Модель успешно адаптировала объектно-ориентированный стиль Python к прототипному наследованию и классовому синтаксису ES6+ в JavaScript, избежав классических проблем с потерей контекста.

Отсутствие "Undefined Behavior"

Как упоминалось ранее, главное требование к парсеру — строгая обработка ошибок. Если бы ИИ просто перевел синтаксис, логика обработки невалидных тегов могла бы нарушиться из-за разницы в булевом приведении типов (truthy/falsy values).

Например:

  • Python: пустой список [] — это False.
  • JavaScript: пустой массив [] — это true.

Это критическое различие для условных операторов. Удивительно, но GPT-5.2 code conversion учитывал эти моменты, добавляя явные проверки .length > 0 там, где это было необходимо.

Оценка: во сколько раз ИИ ускорил работу разработчика?

Результаты эксперимента с JustHTML демонстрируют тектонический сдвиг в методологии разработки. Давайте оценим эффективность инструментария.

Время и ресурсы

Традиционное портирование такой библиотеки вручную заняло бы у опытного разработчика от нескольких дней до недели кропотливой работы (учитывая отладку 9 200 тестов).

  • Ручной труд: ~40-60 часов.
  • С использованием ИИ: ~4 часа.

Ускорение составило более чем в 10 раз. При этом разработчик не писал код построчно, а выступал в роли архитектора и ревьюера.

Качество кода

Полученная библиотека simonw/justjshtml проходит тот же набор тестов, что и проекты уровня браузерных движков (например, Servo). Это доказывает, что ИИ способен писать production-ready код, если у него есть:

  1. Качественный исходник (reference implementation).
  2. Строгий набор тестов (test suite).
  3. Достаточный контекст (через Codex CLI).

Стоимость токенов

Важно отметить, что такой метод не является "бесплатным" с точки зрения вычислительных ресурсов. Прогон миллионов токенов через модель уровня GPT-5.2 стоит денег. Однако, если сравнивать стоимость API со ставкой сеньор-разработчика за неделю работы, экономия получается колоссальной.

Вывод для разработчика

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

Вам больше не нужно бояться задач по миграции легаси-кода или портированию библиотек. Если у вас есть надежные тесты, современные инструменты вроде Codex CLI позволяют выполнить эту работу за один вечер, сохраняя высокое качество и совместимость. Главное — уметь правильно поставить задачу и настроить окружение.