Drew DeVault, auteur de l'environnement utilisateur Sway, du client de messagerie Aerc et de la plateforme de développement collaboratif SourceHut, a publié la version 0.26.0 du langage de programmation Hare. Hare est présenté comme un langage de programmation système similaire au C, mais plus simple. Le code source du compilateur et de la chaîne d'outils est distribué sous licence GPLv3, et le code de la bibliothèque standard sous licence MPL (Mozilla Public License).
Le langage est optimisé pour résoudre des problèmes de bas niveau tels 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 sur l'exécution. Le langage utilise une gestion manuelle de la mémoire et un système de types statiques, dans lequel chaque variable doit se voir explicitement attribuer un type spécifique.
Pour exécuter l'application, un temps d'exécution minimal est fourni et pour le développement, une bibliothèque standard de fonctions est distribuée, donnant accès aux interfaces de base du système d'exploitation, ainsi qu'offrant des fonctions permettant de travailler avec des algorithmes, des protocoles et des formats standard, notamment outils d'utilisation des expressions régulières et du cryptage. Pour le développement d'applications graphiques, la boîte à outils hare-wayland est en cours de développement, ainsi que des liaisons pour accéder aux capacités de GTK, Vulkan, OpenGL, SDL3 et libui.
Dans la nouvelle version:
- Ajout de la structure de boucle « for(…){…} else {…} » et de la possibilité d'utiliser une boucle comme expression pour assigner une valeur à une variable : « item = for(…){…} ». La valeur assignée à la variable peut être renvoyée lorsque la boucle est interrompue par l'expression « break value » ou en spécifiant « yield default_value » dans le bloc « else{…} » associé à la boucle, qui est appelé si la boucle n'est pas interrompue par « break ». const item = for (let sample .. items) { if (item.key == key) { break item; }; } else { yield -1; };
- Ajout de la possibilité d'utiliser l'affectation de valeur « _ » pour ignorer la gestion des erreurs (en cas d'erreur, aucune assertion ne sera levée). _ = os::remove(«/some/file»);
- Ajout de la possibilité d'utiliser la valeur « _ » pour créer des champs sans nom dans les structures. Ces champs peuvent être utilisés pour un remplissage supplémentaire. export type my_struct = struct @packed { x: u32, // offset: 0 _: u8, // offset: 4 y: u64, // offset: 5 };
- Il est désormais possible de laisser explicitement des variables et des champs dans des structures dans un état non initialisé en leur assignant la valeur « @undefined ». Auparavant, le langage exigeait que toutes les variables locales et globales soient initialisées lors de leur création. Les laisser non initialisées peut s'avérer nécessaire lorsqu'une variable doit être initialisée ultérieurement, et non lors de sa déclaration, par exemple, lorsqu'un pointeur vers une variable que la fonction doit initialiser est passé à cette fonction. `let x: my_object = @undefined;`
- La prise en charge du système d'exploitation Dragonfly BSD a été ajoutée. Auparavant, Linux, FreeBSD, NetBSD et OpenBSD étaient pris en charge.
Source: opennet.ru
