Hilde
HILDE: High-Integrity, Linear, Deterministic, Explicit. Mehr über den Namen.
Hilde ist eine kleine, strenge Systemsprache, die nach C übersetzt, für Unix-Systeme und für WebAssembly. Jeder Wert, der eine Ressource hält, wird genau einmal verwendet. Jede Funktion nennt ihren Vertrag. Und jeder Fehler des Compilers hat einen festen Code.
Sie steuern den Speicher selbst, wie in C oder Zig, und es gibt keinen Garbage Collector. Lineare Typen sorgen dafür, dass jede Ressource genau einmal freigegeben wird, und der Compiler prüft das.
Ein Modul besteht aus einer Schnittstelle in einer .hih-Datei und einem Rumpf in einer .hiq-Datei. Das h in .hih steht für Header, wie in C; .hiq ist ein Wortspiel auf „high IQ“, und das q steht auch für Query. Der Compiler heißt hilde.
Ein erstes Programm
Datei: HelloWorld.hih
module Example.HelloWorld is
"""
No contract: the exit code of the programme, the result of what it did.
"""
function main(): ExitCode;
end module.
Datei: HelloWorld.hiq
module body Example.HelloWorld is
function main(): ExitCode is
printLn("Hello, world!");
return ExitSuccess();
end;
end module body.
Ausgabe von ./main (Exit-Status 0):
Hello, world!
examples/hello-world im Hilde-Repository, hilde 1.0.0Die Schnittstelle nennt main und begründet hier, warum die Funktion keinen Vertrag braucht. Diese Begründung ist optional. Der Rumpf gibt eine Zeile aus. Vergisst man in demselben Programm eine Ressource, übersetzt es nicht:
Ausgabe von hilde check Example.hiq (Exit-Status 255):
Error:
Title: Linearity Error
Error code: H4012
Module:
Example
Location:
Filename: 'Example.hiq'
From: line 8, column 8
To: line 8, column 29
Description:
The variable `ticket` is not consumed by the time of the return statement. Did you forget to call a destructor, or destructure the contents?
Code:
6 | function main(): ExitCode is
7 | let ticket: Ticket := Ticket(number => 7);
8 | return ExitSuccess();
9 | end;
10 | end module body.
Die Meldung nennt die Variable, die Stelle und den Code H4012. Unter diesem Code steht eine Erklärung mit Beispiel.
Wofür Hilde gedacht ist
Hilde verbindet die lesbare Form von Ada mit der Sicherheit linearer Typen und Ausleihen, wie man sie ähnlich aus Rust kennt, und bleibt dabei so schlicht wie Go: schnell gelernt und mit einfacher Nebenläufigkeit. Hilde baut auf Austral auf. Viele Fehler, die einem KI-Assistenten typischerweise unterlaufen, meldet der Compiler schon beim Übersetzen klar: eine Ressource, die nie geschlossen wird, ein Wert, der nach seinem Ende noch verwendet wird, ein vergessener Fall oder ein übergangener Fehler. Ein Überlauf rechnet nicht still weiter, sondern hält das Programm an.
- Warum Hilde: die Gründe hinter dem Entwurf.
- Lernen: eine kurze Tour mit Programmen und ihrer Ausgabe.
- Grundlagen: das Wichtigste, Schritt für Schritt.
- Installation: den Compiler bauen.
- Pakete: der Paketmanager und seine Signaturen.
Im Einsatz
Hilde läuft produktiv hinter dem Webserver Hiawatha. Das Hilde-Programm spricht FastCGI über einen Unix-Socket, Hiawatha nimmt die Verbindungen an und übernimmt TLS. Auf diese Weise laufen alle Dienste, die in Hilde geschrieben sind, und das Web-Framework Wolly ist genau dafür gebaut. Ein Beispiel ist RAMBO, ein Anmeldedienst und OpenID Provider in Hilde und Wolly. RAMBO übernimmt die Anmeldung per OAuth und OpenID für Gitea und hat die frühere Go-Version abgelöst, ohne dass eine angebundene Anwendung etwas davon bemerkt hat.