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!
Quelle: Beispiel examples/hello-world im Hilde-Repository, hilde 1.0.0

Die 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.
Quelle: Fehlerkatalog von Hilde, H4012, fehlerhaftes Modul, hilde 1.0.0

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.

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.