Język zaprojektowany wokół swoich czytelników
Większość języków programowania zaprojektowano dla ludzi. Ich gramatyki optymalizują to, na czym zależy ludziom: zwięzłą składnię, ekspresyjne idiomy, "eleganckie" skróty. Kompilatory wypisują komunikaty o błędach prozą, bo czyta je człowiek. Biblioteki standardowe są uporządkowane tak, jak ich autorom łatwo było zapamiętać.
Zero wychodzi z innego założenia. Jego głównymi czytelnikami są agenci AI: modele językowe, które piszą, debugują i naprawiają kod w czyimś imieniu. Ludzie wciąż biorą w tym udział, ale projekt języka od pierwszego dnia traktuje agentów jako pełnoprawnych użytkowników. Ta jedna zmiana przekłada się na niemal każdą widoczną cechę języka.
Zero tworzy Vercel Labs, język ma stronę zerolang.ai, a kod źródłowy jest otwarty pod github.com/vercel-labs/zero. Pliki źródłowe kończą się na .0.
Pięć elementów tego fragmentu (pub, World, raises, check i jawne world.out.write) już dużo mówi o tym, jak myśli Zero. Poniżej omawiamy każdy z nich.
"Wszystko jest jawne"
Nieoficjalne hasło dokumentacji Zero brzmi: wszystko jest jawne. Język celowo unika ukrytej maszynerii, która sprawia, że inne języki systemowe są wygodne dla ludzi, ale zdradliwe dla generatorów kodu:
- Brak obowiązkowego garbage collectora.
- Brak ukrytego alokatora.
- Brak niejawnego środowiska async.
- Brak magicznych zmiennych globalnych: żadnego wszechobecnego
stdout, żadnegoprocess.env, żadnego niejawnego systemu plików.
Wszystko, co funkcja robi w kontakcie ze światem zewnętrznym, musi być widoczne w jej sygnaturze. Dla człowieka to sporo pisania; dla agenta, który analizuje, co funkcja faktycznie robi, to prezent.
Capabilities zamiast zmiennych globalnych
Sposób, w jaki Zero obsługuje wejście/wyjście, to najwyraźniejszy przykład tej filozofii. Nie ma globalnej funkcji print. Wyjście odbywa się przez wartość World, którą środowisko uruchomieniowe przekazuje do main:
pub fun main(world: World) -> Void raises {
check world.out.write("cześć\n")
}
Jeśli funkcja głęboko w stosie wywołań chce zapisać linię logu, trzeba jej jawnie przekazać World (albo węższą capability). Z samej sygnatury funkcji, bez czytania jej ciała, wiesz, czy może dotknąć sieci, systemu plików lub stdout. Na takiej właściwości może polegać analizator statyczny (albo agent robiący code review).
Capability World omawia tę ideę dokładniej.
Jawne błędy dzięki raises i check
Funkcje, które mogą się nie powieść, to deklarują. Kod wywołujący zawodne funkcje to potwierdza. Nie ma cichego rzucania wyjątków:
raises { InvalidInput } przy validate oznacza: "ta funkcja może zakończyć się błędem InvalidInput". check w miejscu wywołania oznacza: "jeśli to się nie powiedzie, przekaż błąd wyżej". Nie da się przypadkiem zgubić błędu: albo pojawia się w sygnaturze twojej funkcji, albo zatrzymuje cię kompilator. Pełny opis znajdziesz w Raises i Check.
Kompilator, który rozmawia z agentami
Najbardziej charakterystyczna część Zero to nie element składni, tylko wyjście kompilatora. Uruchom zero check --json na błędnym programie, a dostaniesz mniej więcej coś takiego:
{
"ok": false,
"diagnostics": [
{
"code": "NAM003",
"message": "unknown identifier",
"line": 3,
"repair": { "id": "declare-missing-symbol" }
}
]
}
Trzy rzeczy odróżniają to od zwykłego błędu kompilatora:
- Stabilne kody błędów.
NAM003oznacza dziś "nieznany identyfikator" i w następnej wersji kompilatora będzie oznaczać dokładnie to samo. Agenci mogą dopasowywać kod bez parsowania angielskiego tekstu. - Ustrukturyzowane metadane naprawy. Pole
repairwskazuje rodzaj poprawki, która według kompilatora usunie błąd. Agent może pobrać plan poleceniemzero fix --plan --jsoni go zastosować. - Bez parsowania prozy. Chodzi o to, żeby agent nie musiał interpretować komunikatu przyjaznego człowiekowi, aby zdecydować, co zrobić dalej.
Diagnostyka w JSON szczegółowo omawia ten format.
Celowo mała powierzchnia
Gramatyka Zero jest mała i regularna, duchem bliższa wczesnemu C niż językom z wszystkim naraz, takim jak Scala czy nowoczesny C++. Powód jest praktyczny: agent powinien móc przyswoić cały język w trakcie jednej sesji, bez potknięć na przypadkach brzegowych.
Dlatego znajdziesz tu:
- Jeden sposób deklarowania funkcji (
funlubpub fun). - Jeden sposób wiązania wartości lokalnej (
let). - Jeden sposób modelowania typów produktowych (
shape), jeden dla typów sumowych (choice) i jeden dla zwykłych wyliczeń (enum). - Jedną konstrukcję dopasowania wzorców (
match). - Jedną konstrukcję pętli we wczesnej wersji języka (
while).
Czego nie znajdziesz, przynajmniej na tym etapie: przeciążania operatorów, niejawnych konwersji, makr, dekoratorów ani trzech konkurujących sposobów wyrażenia tej samej idei. To nie asceza, tylko świadomy wybór, by powierzchnia języka była na tyle mała, że agent rzadko wybiera złą wersję.
Czym Zero nie jest
Żeby nie było rozczarowań:
- To nie język skryptowy. Zero kompiluje się do natywnych plików binarnych. Programy są małe (dokumentacja wspomina o plikach wykonywalnych poniżej 10 KB) i nie ciągną za sobą środowiska uruchomieniowego.
- To nie Rust, nie Go, nie Zig. Składnia ma wspólnych przodków, ale priorytety są inne: Rust optymalizuje bezpieczeństwo pamięci z rozbudowanym systemem typów, a Zero optymalizuje łatwość nauki dla agentów z celowo malutkim systemem typów.
- To nie jest stabilne. Zero jest przed wersją 1.0. Zespół wprost mówi, że wprowadzi niezgodne zmiany, jeśli posłużą celom zorientowanym na agentów. Nie opieraj na nim jeszcze niczego poważnego.
- To nie funkcja platformy wdrożeniowej Vercela. Choć pochodzi z Vercel Labs, Zero nie jest powiązane z Next.js ani hostingiem Vercela. To samodzielny język systemowy.
Kiedy warto dziś wypróbować Zero
Warto sięgnąć po Zero już dziś, jeśli interesuje cię:
- Jak zmienia się język, gdy ograniczenia projektowe wynikają z potrzeb agentów, a nie ludzi.
- Eksperymentowanie z wejściem/wyjściem opartym na capabilities bez przechodzenia na język badawczy.
- Jak wygląda "ustrukturyzowane wyjście kompilatora" jako pełnoprawna funkcja, a nie dodatek na końcu.
- Przekazywanie opinii Vercel Labs o projekcie, który aktywnie się rozwija.
Na razie lepiej go pominąć, jeśli potrzebujesz stabilnego języka do prawdziwej pracy, dojrzałego ekosystemu bibliotek albo narzędzi wieloplatformowych na poziomie Rusta czy Go.
Dalej: instalacja Zero
Następny artykuł pokazuje, jak zainstalować toolchain Zero i skompilować pierwszy program. Całość zajmuje około minuty.
Najczęściej zadawane pytania
Czym jest język programowania Zero?
Zero to eksperymentalny język programowania systemowego od Vercel Labs, zaprojektowany tak, by agenci AI byli głównymi użytkownikami obok ludzi. Ma małą, regularną składnię, jawne efekty przez capability World oraz kompilator, który zwraca ustrukturyzowaną diagnostykę w JSON i czytelne maszynowo plany naprawy, na podstawie których agenci mogą od razu działać.
Kto tworzy Zero i czy to oficjalny produkt Vercela?
Zero pochodzi z Vercel Labs, działu badawczego Vercela. To otwarty eksperyment hostowany pod github.com/vercel-labs/zero, a nie stabilny produkt Vercela. README wprost określa go jako wersję przed 1.0 i odradza używanie na produkcji lub z wrażliwymi danymi.
Czy Zero to 'język dla agentów'?
Tak. Cały sens Zero to zaprojektowanie języka, w którym agenci AI, a nie tylko ludzie, mogą niezawodnie czytać, generować, debugować i naprawiać kod. To kształtuje wszystko: od małej, regularnej gramatyki aż po wyjście kompilatora w JSON i stabilne kody błędów, takie jak NAM003.
Jak wygląda plik źródłowy Zero?
Pliki źródłowe mają rozszerzenie .0. Minimalny program wygląda tak: pub fun main(world: World) -> Void raises { check world.out.write("cześć\n") }. Parametr World to obiekt capability służący do operacji wejścia/wyjścia, a raises i check czynią zawodne operacje jawnymi.
Czy Zero nadaje się na produkcję?
Nie. Zero jest przed wersją 1.0 i wprost eksperymentalne. Kompilator, biblioteka standardowa i składnia wciąż się zmieniają. Zespół zaleca uruchamianie go wyłącznie w odizolowanych środowiskach: używaj go do nauki, prototypów i przekazywania opinii, a nie do wdrażania oprogramowania dla klientów.