Die Datei schreiben
Öffne deinen Editor und speichere die folgenden fünf Zeilen als hello.0 an einem praktischen Ort – oder klick einfach im Block unten auf Run:
Das war's – ein komplettes Zero-Programm. Lokal ausführen:
zero run hello.0
Du solltest sehen:
hello from zero
Wenn command not found kommt, geh zurück zu Zero installieren und stell sicher, dass zero --version zuerst funktioniert.
Jedes Token auseinandernehmen
Schon dieses winzige Programm zeigt fast alles, was Zero anders macht. Lies es von links nach rechts.
pub
pub markiert eine Deklaration als öffentlich – sichtbar außerhalb ihres aktuellen Moduls. Die Runtime muss main von außerhalb des Datei-Scopes finden, also muss main pub sein. Eine private Hilfsfunktion in derselben Datei käme ohne aus.
fun
fun leitet eine Funktionsdeklaration ein. Zero verwendet fun, nicht fn (Rust), nicht func (Go) und nicht function (JavaScript). Ein Schlüsselwort, jedes Mal gleich verwendet.
main
Der konventionelle Name für den Einstiegspunkt. Wenn ein Zero-Executable läuft, sucht die Runtime nach pub fun main(world: World) und ruft es auf. Andere Funktionen kannst du beliebig benennen, aber main ist konventionell für den Programmeinstieg reserviert.
(world: World)
Der einzelne Parameter heißt world und hat den Typ World. Die Runtime konstruiert einen World-Wert, bevor sie main aufruft, und übergibt ihn hier. Dieser Wert trägt die Capabilities des Programms: Zugriff auf stdout, stdin, das Dateisystem, das Netzwerk usw. – je nachdem, was die Runtime gewähren möchte.
Den Parameternamen darfst du frei wählen – (w: World) oder (io: World) würde genauso kompilieren. Konvention in den Beispielen ist world, und wir bleiben dabei.
-> Void
Der Rückgabetyp. Void heißt, die Funktion liefert keinen nutzbaren Wert zurück – sie existiert für ihre Seiteneffekte, nicht für ihren Wert. Viele Funktionen, die du schreibst, geben echte Typen wie i32 oder eine selbst definierte shape zurück.
raises
Ein bloßes raises (ohne konkreten Fehlertyp) an main sagt: „diese Funktion kann fehlschlagen". Bei main bedeutet das, dass das Programm mit einem Exit-Code ungleich Null beenden kann, falls ein check im Body einen Fehler nach oben propagiert. Engere Formen – raises { InvalidInput } zum Beispiel – sehen wir in Raises und Check.
check world.out.write("hello from zero\n")
Das ist die Zeile, die tatsächlich etwas tut. Drei Bestandteile:
world.out– der Standardausgabe-Stream, freigegeben als Feld derWorld-Capability..write("hello from zero\n")– eine Methode, die einen String in diesen Stream schreibt. Sie liefert ein Ergebnis, das einen Fehlschlag anzeigen kann (der Schreibvorgang könnte fehlschlagen; der Stream könnte geschlossen sein).check– propagiert diesen Fehlschlag nach oben, falls er auftritt. Ohnecheckwürde der Compiler meckern, dass das Ergebnis vonwritestillschweigend verworfen wird.
Das \n am Ende ist ein Literal-Zeilenumbruch. Ohne ihn würde die Ausgabe nicht in eine neue Zeile umbrechen und dein Shell-Prompt landete direkt hinter deiner Nachricht.
Was gerade passiert ist
Als du zero run hello.0 ausgeführt hast:
- Der Compiler hat deine Datei geparst und typgeprüft.
- Er hat ein kleines natives Executable für deine Plattform erzeugt.
- Die Runtime hat eine
World-Capability für den aktuellen Prozess konstruiert. - Sie hat
main(world)aufgerufen. - Dein Code hat „hello from zero\n" in den
out-Stream dieser World geschrieben – verbunden mit dem stdout deines Terminals. mainlieferteVoidzurück, die Runtime hat aufgeräumt, und das Programm beendete mit Status 0.
Es gibt keinen Garbage Collector, keine versteckte Runtime-Initialisierung, keinen impliziten Modul-Bootstrap. Das ganze Programm besteht aus der Funktion, die du geschrieben hast, plus dem Code der Standardbibliothek, den sie aufruft.
Eine kleine Änderung ausprobieren
Lass das Programm die Nachricht erst an einen Namen binden, bevor es sie schreibt:
Führ es nochmal aus – dieselbe Ausgabe, aber jetzt hast du let-Bindings gesehen und bestätigt, dass Strings First-Class-Werte sind, die du herumreichen kannst.
Eine fehlschlagende Variante
Was passiert, wenn du das check vergisst?
pub fun main(world: World) -> Void raises {
world.out.write("oops\n")
}
zero check hello.0 weigert sich, das zu kompilieren. Das Ergebnis von write ist ein fehlbarer Wert; ihn zu ignorieren ist ein Compile-Fehler. Du musst es entweder mit check versehen (den Fehler propagieren) oder es explizit behandeln. Dieselbe Idee wie Rusts must_use-Ergebnisse, nur erzwungen für jeden fehlbaren Aufruf.
Als Nächstes: Die Zero CLI
Du hast hier zero run verwendet. Die CLI hat eine kleine Reihe von Kommandos, die man kennen sollte – check, run, build, test, fix, explain – jedes davon mit einem strukturierten --json-Modus, der für Agenten entworfen wurde.
Häufig gestellte Fragen
Wie sieht das Hello-World-Programm in Zero aus?
Das klassische Hello World in Zero hat fünf Zeilen: pub fun main(world: World) -> Void raises { check world.out.write("hello from zero\n") }. Speichere es als hello.0 und führe zero run hello.0 aus.
Was bedeutet pub fun main in Zero?
pub fun main in Zero?pub macht eine Deklaration öffentlich – sichtbar außerhalb ihres Moduls. fun deklariert eine Funktion. main ist der konventionelle Einstiegspunkt, nach dem Zero in einem Executable sucht. Zusammen deklariert pub fun main den öffentlichen Einstiegspunkt, den die Runtime beim Programmstart aufruft.
Warum nimmt main einen World-Parameter?
World-Parameter?Zero hat keine globale I/O. Alles, was mit der Außenwelt spricht – stdout, stdin, Dateien, Netzwerk – läuft über Capabilities, die explizit übergeben werden. Die Runtime reicht main einen World-Wert, und dieser Wert (oder Teile davon) ist der einzige Weg, wie Funktionen I/O machen können. Dadurch werden Seiteneffekte in Funktionssignaturen sichtbar.
Was machen raises und check im Hello-World?
raises und check im Hello-World?raises an main deklariert, dass die Funktion fehlschlagen kann. check world.out.write(...) ruft eine fehlbare Funktion auf und propagiert den Fehler bei Misserfolg an den Aufrufer – hier die Runtime, die mit einem Exit-Code ungleich Null beendet. Ohne check würde der Compiler den Aufruf nicht akzeptieren, weil der Fehler unbehandelt bliebe.
Welche Dateiendung nutzt Zero?
Zero-Quelldateien verwenden die Endung .0 (die Ziffer Null, nicht der Buchstabe O). Eine hello.0-Datei ist eine Zero-Quelldatei. Der Compiler wird mit Befehlen wie zero check hello.0 und zero run hello.0 aufgerufen.