Menu

Zero Hello World: napisz i uruchom pierwszy program .0

Twój pierwszy program w Zero: co oznacza każdy element kanonicznego hello world, jak go uruchomić przez zero run i dlaczego nawet pięciolinijkowy program używa już World, raises i check.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Zapisz plik

Otwórz edytor i zapisz poniższe pięć linii jako hello.0 w dowolnym wygodnym miejscu albo po prostu kliknij Run w bloku poniżej:

To wszystko: kompletny program w Zero. Aby uruchomić go lokalnie:

zero run hello.0

Powinno pojawić się:

cześć z zero

Jeśli widzisz command not found, wróć do instalacji Zero i najpierw upewnij się, że zero --version działa.

Każdy token po kolei

Nawet ten malutki program pokazuje większość tego, co wyróżnia Zero. Przeczytajmy go od początku do końca.

pub

pub oznacza deklarację jako publiczną, czyli widoczną poza bieżącym modułem. Środowisko uruchomieniowe musi znaleźć main spoza zakresu pliku, więc main musi być pub. Prywatna funkcja pomocnicza w tym samym pliku tego nie potrzebuje.

fun

fun rozpoczyna deklarację funkcji. Zero używa fun, a nie fn (Rust), func (Go) czy function (JavaScript). Jedno słowo kluczowe, używane za każdym razem tak samo.

main

Umowna nazwa punktu wejścia. Gdy uruchamia się cel wykonywalny Zero, środowisko uruchomieniowe szuka pub fun main(world: World) i je wywołuje. Inne funkcje możesz nazywać dowolnie, ale main jest zwyczajowo zarezerwowane dla punktu wejścia programu.

(world: World)

Jedyny parametr nazywa się world i ma typ World. Środowisko uruchomieniowe tworzy wartość World przed wywołaniem main i ją przekazuje. Ta wartość niesie capabilities programu: dostęp do stdout, stdin, systemu plików, sieci i tak dalej, zależnie od tego, co środowisko uruchomieniowe zdecyduje się udostępnić.

Nazwa parametru zależy od ciebie: (w: World) czy (io: World) też się skompilują. W przykładach przyjęło się world i tego będziemy się trzymać.

-> Void

Typ zwracany. Void oznacza, że funkcja nie zwraca nic użytecznego: istnieje dla swoich efektów ubocznych, a nie dla wartości. Wiele funkcji, które napiszesz, będzie zwracać prawdziwe typy, takie jak i32 albo zdefiniowany przez ciebie shape.

raises

Samo raises (bez konkretnego typu błędu) przy main mówi: "ta funkcja może się nie powieść". W przypadku main oznacza to, że program może zakończyć się z niezerowym kodem, jeśli dowolne check w ciele funkcji przekaże błąd wyżej. Węższe formy, na przykład raises { InvalidInput }, poznasz w Raises i Check.

check world.out.write("cześć z zero\n")

To linia, która faktycznie coś robi. Składa się z trzech części:

  • world.out: strumień standardowego wyjścia, udostępniony jako pole capability World.
  • .write("cześć z zero\n"): metoda zapisująca tekst do tego strumienia. Zwraca wynik, który może wskazywać porażkę (zapis może się nie udać, strumień może być zamknięty).
  • check: przekazuje tę porażkę wyżej, jeśli wystąpi. Bez check kompilator zgłosiłby, że wynik write jest po cichu odrzucany.

\n na końcu to znak nowej linii. Bez niego wyjście nie przeszłoby do nowej linii, a znak zachęty powłoki wylądowałby w tej samej linii co twój komunikat.

Co się właśnie stało

Gdy uruchomiono zero run hello.0:

  1. Kompilator sparsował plik i sprawdził typy.
  2. Wygenerował mały natywny plik wykonywalny dla twojej platformy.
  3. Środowisko uruchomieniowe utworzyło capability World dla bieżącego procesu.
  4. Wywołało main(world).
  5. Twój kod zapisał "cześć z zero\n" do strumienia out tego world, połączonego ze stdout twojego terminala.
  6. main zwróciło Void, środowisko uruchomieniowe posprzątało, a program zakończył się z kodem 0.

Nie ma tu garbage collectora, ukrytej inicjalizacji środowiska ani niejawnego ładowania modułów. Cały program to funkcja, którą napisano, plus kod biblioteki standardowej, który wywołuje.

Spróbuj drobnej zmiany

Niech program najpierw przypisze komunikat do wiązania, a dopiero potem go wypisze:

Uruchom go ponownie: wyjście podobne, ale teraz znasz już wiązania let i wiesz, że teksty to pełnoprawne wartości, które można przekazywać dalej.

Wersja z błędem

Co się stanie, jeśli zapomnisz o check?

pub fun main(world: World) -> Void raises {
    world.out.write("oops\n")
}

zero check hello.0 odmówi skompilowania tego kodu. Wynik write jest wartością zawodną, a zignorowanie go to błąd kompilacji. Albo ją sprawdzasz przez check (przekazujesz błąd dalej), albo obsługujesz jawnie. To ta sama idea co wyniki must_use w Ruście, tyle że wymuszana przy każdym zawodnym wywołaniu.

Dalej: CLI Zero

Tutaj użyto zero run. CLI ma niewielki zestaw poleceń, które warto znać: check, run, build, test, fix, explain. Każde z nich ma ustrukturyzowany tryb --json, zaprojektowany do odczytu przez agentów.

Najczęściej zadawane pytania

Jak wygląda program hello world w Zero?

Kanoniczne hello world w Zero ma pięć linii: pub fun main(world: World) -> Void raises { check world.out.write("cześć z zero\n") }. Zapisz go jako hello.0 i uruchom zero run hello.0.

Co oznacza pub fun main w Zero?

pub sprawia, że deklaracja jest publiczna, czyli widoczna poza swoim modułem. fun deklaruje funkcję. main to umowny punkt wejścia, którego Zero szuka w celu wykonywalnym. Razem pub fun main deklaruje publiczny punkt wejścia, który środowisko uruchomieniowe wywołuje na starcie programu.

Dlaczego main przyjmuje parametr World?

Zero nie ma globalnego wejścia/wyjścia. Wszystko, co komunikuje się ze światem zewnętrznym (stdout, stdin, pliki, sieć), przechodzi przez jawnie przekazane capabilities. Środowisko uruchomieniowe przekazuje main wartość World i tylko przez nią (lub jej części) funkcje mogą wykonywać operacje wejścia/wyjścia. Dzięki temu efekty uboczne są widoczne w sygnaturach funkcji.

Co robią raises i check w hello world?

raises przy main deklaruje, że funkcja może się nie powieść. check world.out.write(...) wywołuje zawodną funkcję i, jeśli ta zawiedzie, przekazuje błąd wyżej do wywołującego. Tutaj jest nim środowisko uruchomieniowe, które kończy program z niezerowym kodem. Bez check kompilator odrzuciłby to wywołanie, bo błąd pozostałby nieobsłużony.

Jakiego rozszerzenia plików używa Zero?

Pliki źródłowe Zero mają rozszerzenie .0 (cyfra zero, nie litera O). Plik hello.0 to plik źródłowy Zero. Kompilator wywołuje się poleceniami takimi jak zero check hello.0 i zero run hello.0.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ