Escreva o arquivo
Abra seu editor e salve as cinco linhas abaixo como hello.0 em algum lugar conveniente — ou simplesmente clique em Run no bloco abaixo:
É isso — um programa Zero completo. Para rodar localmente:
zero run hello.0
Você deve ver:
hello from zero
Se apareceu command not found, volte para Instalar o Zero e confirme que zero --version funciona primeiro.
Desempacotando cada token
Mesmo esse programa minúsculo já mostra grande parte do que faz o Zero diferente. Vamos ler da esquerda para a direita.
pub
pub marca uma declaração como pública — visível fora do módulo atual. O runtime precisa achar main de fora do escopo do arquivo, então main precisa ser pub. Uma função auxiliar privada dentro do mesmo arquivo não precisaria.
fun
fun introduz uma declaração de função. Zero usa fun, não fn (Rust), nem func (Go), nem function (JavaScript). Uma palavra-chave, usada do mesmo jeito sempre.
main
O nome convencional do ponto de entrada. Quando um alvo executável Zero é executado, o runtime procura por pub fun main(world: World) e chama. Você pode nomear outras funções como quiser, mas main é reservado por convenção para o ponto de entrada do programa.
(world: World)
O único parâmetro se chama world e tem o tipo World. O runtime constrói um valor World antes de chamar main e o passa. Esse valor carrega as capacidades do programa: acesso a stdout, stdin, sistema de arquivos, rede e por aí vai, dependendo do que o runtime decidir conceder.
O nome do parâmetro é seu para escolher — (w: World) ou (io: World) compilariam tranquilamente. A convenção nos exemplos é world, e a gente segue essa.
-> Void
O tipo de retorno. Void significa que a função não retorna nada útil — ela existe pelos efeitos, não pelo valor. Muitas funções que você vai escrever retornam tipos reais como i32 ou um shape que você definiu.
raises
Um raises simples (sem um tipo de erro específico) em main diz "esta função pode falhar". Para main, isso significa que o programa pode sair com status diferente de zero se algum check no corpo propagar um erro para cima. Vamos ver formas mais restritas — raises { InvalidInput }, por exemplo — em Raises e Check.
check world.out.write("hello from zero\n")
Esta é a linha que efetivamente faz algo. Três pedaços:
world.out— o stream de saída padrão, exposto como um campo da capacidadeWorld..write("hello from zero\n")— um método que escreve uma string nesse stream. Ele retorna um resultado que pode indicar falha (a escrita pode falhar; o stream pode estar fechado).check— propaga essa falha para cima se ela acontecer. Sem ocheck, o compilador reclamaria que o resultado dewriteestá sendo descartado em silêncio.
O \n no fim é uma quebra de linha literal. Sem ele, a saída não terminaria em nova linha e o prompt do shell apareceria na mesma linha da sua mensagem.
O que acabou de acontecer
Quando você rodou zero run hello.0:
- O compilador parseou seu arquivo e fez a verificação de tipos.
- Produziu um executável nativo pequeno para a sua plataforma.
- O runtime construiu uma capacidade
Worldpara o processo atual. - Chamou
main(world). - Seu código escreveu "hello from zero\n" no
outdesse world — que está conectado ao stdout do seu terminal. mainretornouVoid, o runtime limpou tudo e o programa saiu com status 0.
Não há garbage collector, nenhum inicializador de runtime escondido, nenhum bootstrap implícito de módulo. O programa inteiro é a função que você escreveu, mais o código de biblioteca padrão que ela chamou.
Tente uma pequena mudança
Faça o programa receber uma ligação para a mensagem antes de escrever:
Rode de novo — mesma saída, mas agora você viu ligações let e confirmou que strings são valores de primeira classe que você pode passar adiante.
Uma variante com falha
O que acontece se você esquecer o check?
pub fun main(world: World) -> Void raises {
world.out.write("oops\n")
}
zero check hello.0 vai se recusar a compilar isso. O resultado de write é um valor falível; ignorar é erro de compilação. Você ou faz check (propaga o erro) ou trata explicitamente. É a mesma ideia dos resultados must_use do Rust, só que aplicada a toda chamada que pode falhar.
A seguir: A CLI do Zero
Aqui você usou zero run. A CLI tem um conjunto pequeno de comandos que vale conhecer — check, run, build, test, fix, explain — cada um com um modo estruturado --json desenhado para agentes consumirem.
Perguntas frequentes
Como é o programa hello world em Zero?
O hello world canônico do Zero tem cinco linhas: pub fun main(world: World) -> Void raises { check world.out.write("hello from zero\n") }. Salve como hello.0 e rode zero run hello.0.
O que significa pub fun main em Zero?
pub fun main em Zero?pub torna uma declaração pública — visível fora do módulo dela. fun declara uma função. main é o ponto de entrada convencional que o Zero procura num alvo executável. Juntos, pub fun main declaram o ponto de entrada público que o runtime chama quando o programa começa.
Por que main recebe um parâmetro World?
World?Zero não tem I/O global. Tudo que conversa com o mundo externo — stdout, stdin, arquivos, rede — passa por capacidades passadas explicitamente. O runtime entrega para main um valor World, e esse valor (ou partes dele) é o único caminho que as funções têm para fazer I/O. Isso torna os efeitos visíveis nas assinaturas das funções.
O que raises e check fazem no hello world?
raises e check fazem no hello world?raises em main declara que a função pode falhar. check world.out.write(...) chama uma função que pode falhar e, se falhar, propaga o erro para quem chamou — aqui, isso é o runtime, que sai com status diferente de zero. Sem o check, o compilador se recusaria a compilar a chamada porque o erro ficaria sem tratamento.
Qual extensão de arquivo o Zero usa?
Os arquivos-fonte do Zero usam a extensão .0 (o dígito zero, não a letra O). Um arquivo hello.0 é um arquivo-fonte Zero. O compilador é invocado com comandos como zero check hello.0 e zero run hello.0.