Вопрос, который задаёт Zero
Посылка Zero простая: когда код читает, пишет и чинит не только человек, но и ИИ-агент — как сам язык хотел бы выглядеть?
Существующие языки проектировали задолго до того, как агенты научились писать код. Их приоритеты — лаконичный синтаксис, выразительные идиомы, библиотечная хитроумность — имеют смысл для человека, который печатает в редакторе. Они толерируют неоднозначность и неявные преобразования, потому что человек хорошо умеет заполнять пробелы. Агенты так не умеют. Они генерируют точный текст из распределений вероятностей и платят за каждую размытую кромку языка неправильным токеном где-то ниже по тексту.
Zero начинает заново с перевёрнутым ограничением: проектируем под агентов в первую очередь, принимаем, что код будут читать и люди, и смотрим, что из этого выйдет.
Принцип 1: маленькая регулярная поверхность
Большинство языков программирования со временем растут. Каждый новый релиз добавляет небольшое удобство — новый оператор, новую синтаксическую форму, новый способ выразить то, что язык уже умеет. Каждое добавление окупается человеческой эргономикой. И каждое же добавление стоит чего-то агенту: ещё одного варианта, который надо выучить, и ещё одного способа ошибиться.
Zero намеренно держит поверхность крошечной:
- Одна форма привязки (
let). - Одна форма функции (
fun, при желанииpub). - Один цикл сегодня (
while). - Один способ моделировать product-типы (
shape). - Один способ моделировать sum-типы с payload (
choice). - Один способ моделировать labeled-суммы (
enum). - Одна конструкция pattern matching (
match).
Никакой перегрузки операторов, никаких декораторов, никаких макросов, никаких неявных преобразований, никакой truthy-коэрсии, никакого тернарника. Каждое отсутствие — фича: оно убирает место, где агент мог бы выбрать неправильный вариант.
Цена очевидна — меньше удобств. Польза в том, что агент, учащий Zero внутри сессии, сходится к правильному синтаксису без необходимости взвешивать семь почти-эквивалентов.
Принцип 2: явные эффекты
В большинстве языков любая функция, где угодно, может делать I/O. console.log в JavaScript, printf в C, print в Python. Сигнатура функции не подсказывает, может ли она писать в файл или дёргать сеть. Узнать можно только прочитав тело — рекурсивно.
Zero занимает противоположную позицию: каждый эффект, который имеет функция, появляется в её сигнатуре.
- I/O проходит через
Worldcapability. Функция, которая не принимаетWorld, не может делать I/O. Это обеспечивает система типов. - Отказ проходит через
raisesиcheck. Функция, которая может упасть, говорит об этом в сигнатуре. Каждый вызывающий подтверждает это черезcheckили другую явную конструкцию.
По одной только сигнатуре функции вы можете ответить на два вопроса, которые глубоко волнуют агента (статический анализатор, человеческого ревьюера):
- «Может ли она трогать внешний мир?» — да тогда и только тогда, когда в сигнатуре есть
World. - «Может ли она упасть?» — да тогда и только тогда, когда есть
raises.
В мейнстримных языках такого свойства нет, и оно не маленькое.
Цена — пробросы параметров. Значение World пропихивается всюду, где нужно I/O; clause raises повторяется всюду, где текут ошибки. Zero принимает это как цену свойства.
Принцип 3: детерминированный тулинг
Третий принцип нацелен на агентов наиболее прямо: каждый вывод компилятора — это структурированные данные.
JSON-диагностика — самый заметный пример:
{
"code": "NAM003",
"message": "unknown identifier",
"line": 3,
"repair": { "id": "declare-missing-symbol" }
}
Три свойства отличают это от обычной ошибки компилятора:
- Стабильные коды.
NAM003означает одно и то же сегодня и завтра, как бы ни менялась формулировка человеческого сообщения. - Структурированные планы починки. Когда компилятор думает, что знает, как починить диагностику, он отдаёт план как данные — список правок, а не английское предложение.
- Несколько структурированных каналов. Диагностики, графы зависимостей, отчёты о размере и объяснения — всё это доступно через
--jsonрежимы.
Весь смысл в том, чтобы инструмент — агент или иной — никогда не разбирал английский, чтобы реагировать на вывод компилятора. Поиск по стабильному коду точен; парсинг прозы — размыт. Zero считает первое контрактом, а второе — удобством для человека.
Принцип 4: библиотека, которая живёт в языке
Агенты хорошо пишут код, следующий уже существующим паттернам. Они хуже выбирают правильную внешнюю зависимость из моря вариантов, правильно её интегрируют и отслеживают, когда её API дрейфует. Каждая внешняя зависимость — это трение.
Дизайн Zero заталкивает возможности в стандартную библиотеку — явно задокументированную, согласованную и стабильную по мере стабилизации языка. Цель в том, чтобы программа на Zero редко нуждалась выходить за пределы стандартного дистрибутива для рутинной работы. Это держит поверхность, о которой надо рассуждать агенту, ограниченной.
Сегодня это скорее устремление, чем готовое состояние. Pre-1.0 стандартная библиотека реальна, но всё ещё растёт. Принцип задаёт направление, а не пункт назначения.
Чем Zero жертвует
Каждое решение в дизайне чего-то стоит. Честные компромиссы, на которые идёт Zero:
- Многословность вместо лаконичности. Чистым функциям не нужен
World. Функциям, делающим I/O, — нужен. Ошибки появляются в сигнатурах. Результат — больше аннотаций, чем в эквивалентном коде на JavaScript или Python. - Явное вместо магического. Никакого рефлексивного метапрограммирования, никаких декораторов, тихо оборачивающих поведение, никаких неявных глобалов. То, что «просто работает» в динамических языках, тут приходится разводить руками.
- Статическое вместо динамического. Типы обязательны на параметрах, возвращаемых значениях и полях shape. Компилятор делает много работы; цена — каждую сигнатуру автор (или генератор) обязан написать.
- Стабильность вместо скорости изменений. Язык pre-1.0 и быстро меняется, но дизайн-намерение — зафиксировать поверхность, когда она устаканится. Цена в том, что добавить какую-нибудь хитрую новую удобную фичу позже становится сложнее, потому что планка для добавлений — «помогает ли это агенту больше, чем стоит ему?».
Стоит ли это того — зависит от того, под что вы оптимизируете. Если вы человек, пишущий разовый скрипт, — трение реальное, а польза для агента абстрактна. Если вы управляете агентом, который производит тысячи маленьких программ в день, — трение окупится много раз.
Кем Zero не пытается быть
Несколько отрицательных утверждений, которые стоит сказать явно:
- Не «будущее всего программирования». Zero — гипотеза, а не манифест. Гипотеза в том, что agent-first ограничения дают полезный язык. Должны ли мейнстримные языки эти ограничения принять — это отдельный, более длинный разговор.
- Не часть платформы деплоя Vercel. Несмотря на происхождение из Vercel Labs, Zero не привязан к Next.js или Vercel-хостингу. Это самостоятельный системный язык.
- Не замена Rust, Go или Zig в продакшене. Pre-1.0. Экспериментальный. Используйте, чтобы учиться и давать фидбэк; пока не поставляйте пользователям софт на нём.
- Не готовый. Части стандартной библиотеки, синтаксис изменяемости, формы обработки ошибок и ограничения на дженерики — всё это может ещё пошевелиться до 1.0.
Что интересно, даже если вы не будете его использовать
Даже если вы никогда не напишете и строки на Zero, эксперимент сам по себе поучителен:
- Это самый отчётливый пример реальной работающей capability-based системы эффектов в небольшом системном языке. Ментальная модель — передал разрешение, увидел эффект в сигнатуре — переносима.
- История с диагностикой — это то, что каждый компилятор должен был делать последние десять лет. Структурированный вывод бьёт прозу всегда, а приверженность Zero стабильным кодам — это то, что другие инструменты могли бы перенять без изменений в языке.
- Принцип «один способ делать каждое дело, намеренно маленькая поверхность» идёт против шерсти того, как обычно занимаются дизайном языков. Наблюдать, где этот принцип помогает, а где жмёт, полезно независимо от того, на каком языке вы будете писать завтра.
Куда читать дальше
Если вы закончили остальную документацию, самые полезные дальнейшие материалы — внешние:
- Репозиторий Zero на
github.com/vercel-labs/zero— примеры, исходный код иAGENTS.mdс авторским заявлением о намерениях. - Официальный сайт
zerolang.ai— инструкции по началу работы и каноническое введение.
Оба эволюционируют. То, что вы там найдёте, будет актуальнее любого стороннего туториала. Принципы из этой статьи — это медленно меняющаяся часть; синтаксис вокруг них будет двигаться, пока язык устаканивается.
Часто задаваемые вопросы
Что означает «agent-first язык программирования»?
Это значит, что ИИ-агенты — а не только люди — с самого начала рассматриваются как основные пользователи языка. Их потребности (механически разбирать синтаксис, генерировать валидные программы, читать вывод ошибок как данные, применять починки детерминированно) определяют решения наряду с обычными требованиями к человеческой читаемости и эргономике.
Почему существующие языки не подходят для агентов?
Существующие языки проектировали для людей. В их грамматике есть сокращения, неявные преобразования и неоднозначные конструкции, которые человек толерирует, а генераторы кода путают. Их компиляторы печатают прозу, а не данные. Их системы эффектов неявные. Это всё не смертельно — агенты могут обойти любое из этого, — но язык, спроектированный под агентов с нуля, убирает трение, а не наклеивает на него пластырь.
Каковы основные принципы дизайна Zero?
Маленькая регулярная грамматика (один способ для каждого действия), явные эффекты через capability World (никакого ambient I/O), явный отказ через raises/check (никакого скрытого потока управления) и детерминированный тулинг (вывод компилятора как структурированные данные со стабильными кодами и планами починки). Принципы усиливают друг друга — каждый делает остальные полезнее для агента.
Чем Zero жертвует ради agent-first?
Лаконичностью и ambient-удобством. Нет неявной truthiness, нет глобального print, нет try/catch, который незаметно раскручивает стек. Функции получают больше параметров, а сигнатуры — больше аннотаций. Взамен из одной только сигнатуры функции становится понятно, что она делает — и какими способами может не сделать.
Заменит ли Zero «человеческие» языки?
Нет, и это не цель. Zero — эксперимент по тому, как выглядит agent-first дизайн, а не утверждение, что другие языки должны принять все его решения. Интересен результат эксперимента: какие ограничения помогают агентам сильнее всего, какие компромиссы человек толерирует и какие идеи со временем могут просочиться в мейнстримные языки.