Drew DeVault, l'auteur de l'environnement utilisateur Sway, du client de messagerie Aerc et de la plateforme de collaboration SourceHut, a présenté le langage de programmation Hare, sur lequel il travaille avec son équipe depuis deux ans et demi. Hare se présente comme un langage de programmation système, proche du langage C, mais plus simple que C. Parmi les principes de conception clés de Hare, on trouve l'accent mis sur la simplification et la confiance totale dans les actions du programmeur (exécuter exactement ce qui est spécifié, sans initiative ou comportement implicite), tout en ayant des outils auxiliaires pour identifier les erreurs et problèmes typiques.
Les codes sources du compilateur et des outils sont distribués sous la licence GPLv3, tandis que le code de la bibliothèque standard est sous la licence MPL (Mozilla Public License). Dans la première version publique, la prise en charge des systèmes d'exploitation Linux et FreeBSD sur les plateformes x86_64, aarch64 et riscv64 est annoncée, ainsi qu'une utilisation autonome pour un démarrage sur du matériel sans système d'exploitation. Les plans mentionnent le support des systèmes d'exploitation NetBSD, OpenBSD, Illumos, Haiku et Plan 9, ainsi que des plateformes ppc64le, i686 et arm32.
Le langage utilise la gestion manuelle de la mémoire et un système de types statique, où chaque variable doit explicitement se voir attribuer un type défini. Un runtime minimal est attaché pour l'exécution de l'application. Le langage est optimisé pour les tâches de bas niveau, telles que le développement de systèmes d'exploitation, de compilateurs, d'applications réseau et d'utilitaires système, qui nécessitent des performances maximales et un contrôle total de l'exécution.
Une bibliothèque standard de fonctions est préparée pour les développeurs, fournissant un accès aux interfaces de base du système d'exploitation, des algorithmes typiques et des implémentations de protocoles et de formats. La bibliothèque couvre des domaines tels que l'entrée/sortie, le travail avec des fichiers, les expressions régulières, le cryptage, l'interaction réseau, les opérations sur le temps et les dates, ainsi que l'accès aux primitives Unix typiques (par exemple, poll, fnmatch et glob), le parsing et la vérification de types. Des liaisons distinctes sont fournies pour accéder aux fonctionnalités d'OpenGL, SDL2 et libui.
Parmi les exemples de projets écrits en langage Hare figurent le micro-noyau Helios, le gestionnaire de mots de passe Himitsu, le système de traçage de rayons, le programme de cryptage box, le démon bittorrent btqd, scheduled (l'analogue du système cron), toothbrush (client et serveur pour le protocole finger). Concernant les projets futurs, il est prévu de stabiliser la spécification du langage et le contenu de la bibliothèque standard, de mettre en œuvre le support des plateformes et architectures manquantes, d'ajouter des fonctions de bibliothèque pour prendre en charge TLS 1.2 et 1.3.
Exemple de code en langage 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»); }; };
Source : opennet.ru
