Transcript
00:00:00Vassel только что выпустили новый язык программирования под названием Xero, и, судя по всему,
00:00:03его главное отличие в том, что он изначально создавался для совместной работы
00:00:07людей и ИИ-агентов над небольшими нативными программами. Но разве мы все и так этим не занимаемся?
00:00:12Так чем же этот язык лучше, хорошая ли это вообще идея, или это просто очередной пет-проект,
00:00:16о котором через пару месяцев все забудут? Давайте выясним.
00:00:25Xero — это системный язык вроде Rust или Zig, так что, возможно, когда-нибудь на него перепишут BUN.
00:00:30И, насколько я понял, вся суть в том, что нынешние языки создавались для людей.
00:00:34Поэтому мы читаем сообщения об ошибках, предупреждения и трассировки, но ИИ работает куда лучше,
00:00:38когда имеет дело со структурированными данными. В Xero весь тулчейн построен с учетом этого,
00:00:43а значит, всё, что выдает компилятор, может быть выведено в формате JSON.
00:00:46Конечно, судя только по этим пунктам и по явно написанным нейросетью предложениям на их сайте,
00:00:51я всё еще довольно скептически отношусь к тому, зачем это нужно и насколько хорошо это будет работать,
00:00:56но выводы приберегу на конец. Сперва давайте просто изучим сам язык,
00:00:59потому что, надо признать, штука все равно занятная. Начнем с классического проекта
00:01:03для знакомства с новым языком — вывода простейшей строки. Здесь почти всё интуитивно понятно.
00:01:08У нас есть публичная функция main в качестве точки входа в программу. Эта функция возвращает
00:01:12void, и внутри нее мы выводим строку. Но именно то, как эта строка
00:01:16выводится, подсвечивает первые особенности языка. Мы используем возможность “world” (мир). Она
00:01:21необходима для любых операций ввода-вывода (I/O), таких как работа с файлами, вывод текста, сетевые запросы —
00:01:26любых побочных эффектов ввода-вывода, и всё это часть принципа явности данного языка.
00:01:31Если функция обладает возможностью “world”, это сразу сигнализирует о наличии операций ввода-вывода,
00:01:37а если ее нет, то функция гарантированно не имеет побочных эффектов ввода-вывода.
00:01:40Возможность “world” также позволяет компилятору отклонять недоступные функции в зависимости от целевой платформы
00:01:45еще на этапе компиляции, а не во время выполнения. Так что, если вы попытаетесь обратиться к файловой системе
00:01:50внутри этой функции, а затем скомпилировать проект под WebAssembly, компилятор сразу выдаст ошибку,
00:01:54и вы не столкнетесь с неожиданным сбоем программы в продакшене.
00:01:57Помимо возможности “world”, в этой программе также используются ключевые слова.
00:02:00Например, здесь есть слово check, с помощью которого обрабатываются ошибки. Если функция может завершиться ошибкой,
00:02:05вы помечаете её словом raises, а затем используете check для проброса этой ошибки дальше. Это очень похоже
00:02:09на оператор знака вопроса в Rust, но только в виде ключевого слова. Вот и всё, что нам нужно знать
00:02:13для нашей первой программы на Xero, и мы можем запустить ее, выполнив команду “xero run hello.xero”.
00:02:19Обратите внимание, что .xero — это расширение файлов для этого языка. Если я сейчас нажму Enter,
00:02:23то увижу строку “hello, subscribe to Betastack”. Что вам обязательно стоит сделать.
00:02:26Идем дальше. Поскольку теперь мы все явно стали экспертами в Xero,
00:02:30в языке есть еще несколько примитивов для покрытия базовых потребностей вашего приложения.
00:02:34Я набросал тут небольшое приложение, которое просто классифицирует ввод как текстовый,
00:02:39числовой или смешанный. Как видите, здесь используются стандартные библиотеки,
00:02:43присутствуют перечисления (enums), а также структуры под названием “shapes” (формы). В остальном всё привычно:
00:02:47ожидаемые конструкции вроде операторов if, чуть ниже есть цикл while, также можно
00:02:52использовать циклы for, а ниже идет match, который по сути выполняет роль оператора switch.
00:02:56Так что ничего сверхнеобычного. Когда доходит до продвинутых концепций вроде памяти, в Xero
00:03:00опять же всё должно быть максимально явно. У нас есть изменяемые слайсы (mutable spans) для записи
00:03:05и обычные слайсы для чтения, а ниже расположен тип owned (владеемый). Он указывает на то,
00:03:10что значение принадлежит данной области видимости, и при выходе из нее нужно вызвать функцию drop.
00:03:14Мы сами определяем функцию drop для этой структуры, прописывая в ней логику очистки памяти.
00:03:18Другой способ добиться того же результата — использовать ключевое слово defer перед вызовом функции.
00:03:22По сути это означает: когда текущая функция завершится и выйдет из области видимости, выполни указанное действие.
00:03:26В общем, тут есть необходимый минимум для написания простейшего приложения. Имеются и другие фичи,
00:03:31но я не хочу превращать это видео в туториал по программированию. Хотя вы вполне можете указать
00:03:35в своем резюме, что у вас есть три минуты опыта работы с Xero. Теперь, когда с базой покончено,
00:03:39давайте сосредоточимся на главном коммерческом аргументе Xero — его тулчейне и заточенности под ИИ-агентов.
00:03:44Представьте, что ИИ-агент пишет код на Xero и допускает баги. Создатели утверждают,
00:03:49что в большинстве языков вы получите в ответ стену текста, так как сообщения об ошибках созданы для людей.
00:03:54В Xero вы тоже можете вывести человекочитаемый лог, и выглядеть он будет примерно так,
00:03:58но, как видите, это не структурированный вывод. Поэтому разработчики внедрили поддержку JSON
00:04:02в каждую часть инструментария. И если мы запустим ту же проверку, но добавим флаг JSON
00:04:07и перенаправим вывод в утилиту JQ, чтобы всё выглядело аккуратнее в терминале,
00:04:12то мы получим отлично структурированное сообщение об ошибке. Здесь есть диагностические данные:
00:04:16критичность, код ошибки и само сообщение. Указано место, где возникла проблема, ожидаемое и
00:04:21фактическое значения. Также есть подсказки для самой LLM и поле оценки безопасности автоисправления,
00:04:26которое сообщает, требуется ли ручная проверка, и дает инструкции по исправлению. То есть система
00:04:31пытается предоставить языковой модели достаточный контекст, чтобы она сама всё пофиксила. Еще одна команда,
00:04:35демонстрирующая этот подход, — “xero fix”. Я запускаю ее в режиме планирования с флагом JSON,
00:04:40снова прогоняя через JQ ради красивого форматирования. Нажав Enter, я по сути
00:04:44запускаю диагностику сломанного файла классификатора, и утилита выдает конкретный план:
00:04:49что именно нужно сделать для починки. На выходе получается структурированный объект с полями,
00:04:53которые нужны по большей части только LLM: уровни безопасности, режим, применимость правок. Ниже видны
00:04:58параметры политики автономного исправления. Далее идет блок диагностики, во многом похожий
00:05:03на то, что мы видели в команде “xero check”, а в самом низу приведено решение для данного кода ошибки.
00:05:07Как это обычно исправляется? Часть задумки, похоже, заключается в том, чтобы язык
00:05:12сам предоставлял необходимую документацию по запросу. То есть, если мы натравим LLM на этот новый язык,
00:05:17модели не придется искать мануалы или задействовать скрытые знания — она получит
00:05:21весь контекст напрямую из тулчейна прямо в момент сборки. Чтобы проверить это на практике, я скопировал
00:05:25наш сломанный файл в абсолютно пустую директорию, где нет никакого упоминания о языке Xero, и затем
00:05:30просто попросил Claude починить этот файл, предоставив лишь команду, необходимую для запуска
00:05:34диагностики, ведь модели все-таки нужно знать, как взаимодействовать с тулчейном. После этого
00:05:38мы можем посмотреть, справится ли Claude с задачей. И вот результат: спустя 31 секунду модель
00:05:43успешно исправила все ошибки в файле. Я намеренно добавил туда три бага, она обнаружила
00:05:47и пофиксила все три. Мы можем прокрутить логи вверх и посмотреть, как она это сделала. Она просто
00:05:51запускала ту самую команду “xero fix”, которую я ей давал. В конце мы получили статус “ok: true”, означающий,
00:05:56что ошибок больше нет. Если подняться еще выше, видно, что она внесла изменения в код, основываясь на данных,
00:06:00полученных на предыдущем шаге от утилиты “xero fix”, которая детально расписала пути решения,
00:06:05и проделала это для каждой из трех проблем. Повторюсь, у модели не было никаких предварительных знаний
00:06:10о языке Xero, она не использовала поиск в интернете для загрузки документации — она
00:06:14опиралась исключительно на структурированные данные из тулчейна. И это действительно
00:06:18впечатляет: совершенно новый язык, в котором LLM может успешно отлаживать код благодаря тому,
00:06:22как этот язык спроектирован. Однако у меня остался один вопрос: а так ли это ново? Я имею в виду,
00:06:28фишка со структурированным выводом ошибок и поддержкой JSON во всем тулчейне понятна,
00:06:31но сама концепция не нова — структурированные сообщения об ошибках существуют уже десятилетиями.
00:06:37Посмотрите сами: у меня есть примерно такой же кривой классификатор, написанный на Rust, с похожими ошибками,
00:06:41и я точно так же могу запросить вывод логов в формате JSON. Я не уверен, что ради этой идеи стоило
00:06:46создавать целый язык. Возможно, было бы достаточно улучшить существующие инструменты, если в них
00:06:51не хватало информативности. Я также практически уверен, что если бы я взял этот сломанный код на Rust и попросил
00:06:55Claude исправить его, модель справилась бы без проблем, причем даже без использования структурированного
00:07:00вывода. По моему опыту, LLM отлично разбираются и в обычных текстовых логах, хотя, возможно,
00:07:05я просто не сталкивался со сложными случаями. К тому же не стоит забывать, что нейросети обучались
00:07:10на огромных массивах кода существующих языков вроде Rust, поэтому они отлично умеют их дебажить,
00:07:14имея массу примеров в обучающей выборке. А вот по Xero у них данных нет вообще. Конечно, это не значит,
00:07:19что не нужно пытаться создавать новые языки, просто для разработки комплексного приложения вы вряд ли
00:07:24выберете Xero. Впрочем, если честно, создатели и не позиционируют его для таких задач.
00:07:28В целом, я думаю, что это просто любопытный эксперимент, который как минимум доказывает, что можно
00:07:32создать новый язык и успешно передавать ИИ нужный контекст без предварительного обучения на нем.
00:07:37Но была ли в этом реальная необходимость — вопрос открытый. При этом я не утверждаю, что сам язык
00:07:42неинтересен. Как я уже говорил, он вполне приятен в использовании и компилируется в бинарники хорошего размера.
00:07:47Но я сильно сомневаюсь, что когда-либо предпочту его проверенным инструментам вроде Rust, Zig или Go.
00:07:51Уверен, на этот счет будет много разных мнений, так что делитесь своими мыслями в комментариях,
00:07:55подписывайтесь на канал, и, как обычно, увидимся в следующем видео.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video