Drew DeVault, autore dell'interfaccia utente Sway, del client email Aerc e della piattaforma di sviluppo collaborativo SourceHut, ha presentato il linguaggio di programmazione Hare, su cui ha lavorato con il suo team negli ultimi due anni e mezzo. Hare è descritto come un linguaggio di programmazione di sistema simile al C, ma più semplice. Tra i principi chiave di progettazione di Hare vi è l'orientamento alla semplificazione e la piena fiducia nelle azioni del programmatore (eseguendo esattamente ciò che è specificato, senza comportamenti non voluti o impliciti), fornendo strumenti di supporto per identificare errori e problemi comuni.
I testi sorgente del compilatore e degli strumenti sono distribuiti sotto licenza GPLv3, mentre il codice della libreria standard è coperto dalla licenza MPL (Mozilla Public License). La prima versione pubblica prevede il supporto dei sistemi operativi Linux e FreeBSD sulle piattaforme x86_64, aarch64 e riscv64, nonché l'uso autonomo per l'esecuzione su hardware senza sistema operativo. Nei piani è menzionato il supporto per i sistemi operativi NetBSD, OpenBSD, Illumos, Haiku e Plan 9, e le piattaforme ppc64le, i686 e arm32.
Il linguaggio utilizza una gestione manuale della memoria e un sistema di tipi statico, in cui a ogni variabile deve essere esplicitamente assegnato un tipo specifico. Per eseguire l'applicazione viene allegato un runtime minimo. Il linguaggio è ottimizzato per affrontare compiti a basso livello, come lo sviluppo di sistemi operativi, compilatori, applicazioni di rete e utility di sistema, per i quali sono richiesti prestazioni massime e un controllo completo sull'esecuzione.
Per gli sviluppatori è stata preparata una libreria standard di funzioni che offre accesso alle interfacce di base del sistema operativo, algoritmi standard e implementazioni di protocolli e formati. La libreria copre aree come input/output, gestione dei file, espressioni regolari, crittografia, interazione di rete, operazioni su tempi e date, accesso ai primitività Unix standard (come poll, fnmatch e glob), parsing e controllo dei tipi. Sono fornite anche binding per accedere alle funzionalità di OpenGL, SDL2 e libui.
Come esempi di progetti scritti nel linguaggio Hare, si citano il microkernel Helios, il gestore di password Himitsu, il sistema di tracciamento raggi raytracing, il programma di crittografia box, il demone bittorrent btqd, scheduled (equivalente del sistema cron), toothbrush (client e un server per il protocollo finger). Tra i piani futuri, si segnalano la stabilizzazione della specifica del linguaggio e della libreria standard, l'implementazione del supporto per piattaforme e architetture mancanti, e l'aggiunta di funzioni di libreria per il supporto di TLS 1.2 e 1.3.
Esempio di codice in linguaggio Hare: use crypto::sha256; use encoding::hex; use fmt; use hash; use io; use os; export fn main() void = { const hash = sha256::sha256(); const file = os::open(«main.ha»)!; defer io::close(file); io::copy(&hash, file)!; let sum: [sha256::SIZE]u8 = [0…]; hash::sum(&hash, sum); hex::encode(os::stdout, sum)!; fmt::println()!; const greetings = [ «Hello, world!», «¡Hola Mundo!», «Γειά σου Κόσμε!», «Привет, мир!», «こんにちは世界!», ]; for (let i = 0z; i < len(greetings); i += 1) { fmt::println(greetings[i])!; }; let x: *int = alloc(42); fmt::printfln(» x: {}», x)!; fmt::printfln(«*x: {}», *x)!; free(x); const file = os::open(os::args[1])!; defer io::close(file)!; let buffer: *[65535]u8 = alloc([0…]); defer free(buffer); const n = io::read(file, buffer)! as size; io::write(os::stdout, buffer[..n])!; }; fn sort(items: []int) void = { … }; @test fn sort() void = { let items = [5, 4, 3, 2, 1]; sort(items); for (let i = 1z; i < len(items); i += 1) { assert(items[i — 1] <= items[i], «list is unsorted»); }; };
Fonte: opennet.ru
